Announcement

Collapse
No announcement yet.

Cần được giúp đỡ về WndProc trong C#

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • iticlub
    replied
    Để tìm hiểu chi tiết về hàm này thì bạn có thể nguyên gốc trong các chương trình Windows viết bằng C++. Chi tiết có thể xem tại đây: http://www.toymaker.info/Games/html/wndproc.html
    Hàm WndProc trong C# mang ý nghĩa tương tự như hàm WndProc trong Windows API. Chi tiết xem tại: http://msdn.microsoft.com/en-us/libr...l.wndproc.aspx

    Leave a comment:


  • tauit_dnmd
    Guest replied
    Thông điệp WM_PAINT mang nghia như tên của nó. Khi cửa sổ cần đc vẽ lại thì thông điệp này sẽ đc phát sinh.

    Tài liệu thì bạn searrch trên mạng ,nhiều lắm mà: Window Programming,MFC Programming

    Leave a comment:


  • 09520133
    replied
    Originally posted by tauit_dnmd View Post
    - Mỗi 1 cửa sổ luôn có 1 hàng đợi chứa thông điệp ( nhận từ hệ thống,user input...) và 1 hàm xử lí các thông điệp đó: WM_PAINT (0x00F) , WM_CLOSE.... . Hàm đó nhận vô 4 tham số: LRESULT CALLBACK function_name(HWND,UINT,LPARAM,WPARAM) . Nếu bạn đã học qua Win32api thì cái này quá quen thuộc.
    - C# nó viết lại ( đúng hơn là bao lại ) theo hướng OOP. Như Message là 1 struct chứa các thông số tương ứng bên win32 như:
    + UINT messegeID;( định danh thông điệp ) ---> C# là Message.Msg.
    +LPARAM,WPARAM : (thông số đi kèm với thông điệp cụ thể , như WM_PAINT đi kèm là CON TRỎ tới cấu trúc PAINTSTRUCT.)
    ......vv

    Trở lại câu hỏi của bạn:
    -O trên tôi thấy bạn đã chặn thông điệp WM_PAINT( mã định danh là 0x00f(16)==15(10) ) để xử lí . Chỉ khi m_Paint bằng true thì mới paint bình thường. Ngược lại thì không làm j( coi như thoog điệp đó đã đc xử lí xong m.Result=IntPtr.Zero)

    - Và không phải thông điệp nào ta cũng phải chặn và xử lí ( ví dụ click vô nút minimize,maximize...,mất focus ). Có thông điệp ta để cho xử lí mặc định bằng base.WndProc(ref m); tương đượng bằng cách gọi hàm DefWindowProc(...) trong win32.
    +IntPtr chính là 1 lớp tương đương con trỏ int trong C++ . IntPtr.Zero tương đương con trỏ NULL.
    + Message.Result là kết quả trả về cho hệ thống để điều khiên thông điệp.


    - Tốt nhất bạn học qua Win32 tí đi.
    Cho em hỏi thêm: thông điệp WM_PAINT( mã định danh là 0x00f(16)==15(10) ) là thông điệp gì? có tác dụng gì ạ?
    cảm ơn bác. Bác có tài liệu học win32 không share em với
    Last edited by 09520133; 17-05-2011, 21:42.

    Leave a comment:


  • tauit_dnmd
    Guest replied
    Originally posted by 09520133 View Post
    Các bạn có thể cho mình biết chi tiết về hàm này. nó dùng để làm gì? nó có tác dụng gì?
    ví dụ có 1 hàm thế này:
    PHP Code:
    protected override void WndProc(ref Message m)
            {
                if (
    m.Msg == 0x00f)
                {
                    if (
    m_bPaint)   //Biến m_bPaint sẽ nhận giá trị true hay false tùy điều kiện trong sự kiên text_change
                        
    base.WndProc(ref m);
                    else
                        
    m.Result IntPtr.Zero;
                }
                else
                    
    base.WndProc(ref m);
            } 
    không biết m.Msg, m.Result, IntPtr.Zero, base.WndProc(ref m); có tác dụng gì? Hàm này làm gì?
    - Mỗi 1 cửa sổ luôn có 1 hàng đợi chứa thông điệp ( nhận từ hệ thống,user input...) và 1 hàm xử lí các thông điệp đó: WM_PAINT (0x00F) , WM_CLOSE.... . Hàm đó nhận vô 4 tham số: LRESULT CALLBACK function_name(HWND,UINT,LPARAM,WPARAM) . Nếu bạn đã học qua Win32api thì cái này quá quen thuộc.
    - C# nó viết lại ( đúng hơn là bao lại ) theo hướng OOP. Như Message là 1 struct chứa các thông số tương ứng bên win32 như:
    + UINT messegeID;( định danh thông điệp ) ---> C# là Message.Msg.
    +LPARAM,WPARAM : (thông số đi kèm với thông điệp cụ thể , như WM_PAINT đi kèm là CON TRỎ tới cấu trúc PAINTSTRUCT.)
    ......vv

    Trở lại câu hỏi của bạn:
    -O trên tôi thấy bạn đã chặn thông điệp WM_PAINT( mã định danh là 0x00f(16)==15(10) ) để xử lí . Chỉ khi m_Paint bằng true thì mới paint bình thường. Ngược lại thì không làm j( coi như thoog điệp đó đã đc xử lí xong m.Result=IntPtr.Zero)

    - Và không phải thông điệp nào ta cũng phải chặn và xử lí ( ví dụ click vô nút minimize,maximize...,mất focus ). Có thông điệp ta để cho xử lí mặc định bằng base.WndProc(ref m); tương đượng bằng cách gọi hàm DefWindowProc(...) trong win32.
    +IntPtr chính là 1 lớp tương đương con trỏ int trong C++ . IntPtr.Zero tương đương con trỏ NULL.
    + Message.Result là kết quả trả về cho hệ thống để điều khiên thông điệp.


    - Tốt nhất bạn học qua Win32 tí đi.
    Last edited by Guest; 17-05-2011, 20:23.

    Leave a comment:


  • 10520619
    replied
    Originally posted by 09520133 View Post
    huhu, không có ai giúp em à!!!!!
    Em thì đành chịu thôi! Nhưng xem vẻ cũng không nhiều người trả lời cho anh lắm thì phải!

    Leave a comment:


  • 09520133
    replied
    huhu, không có ai giúp em à!!!!!

    Leave a comment:


  • Cần được giúp đỡ về WndProc trong C#

    Các bạn có thể cho mình biết chi tiết về hàm này. nó dùng để làm gì? nó có tác dụng gì?
    ví dụ có 1 hàm thế này:
    PHP Code:
    protected override void WndProc(ref Message m)
            {
                if (
    m.Msg == 0x00f)
                {
                    if (
    m_bPaint)   //Biến m_bPaint sẽ nhận giá trị true hay false tùy điều kiện trong sự kiên text_change
                        
    base.WndProc(ref m);
                    else
                        
    m.Result IntPtr.Zero;
                }
                else
                    
    base.WndProc(ref m);
            } 
    không biết m.Msg, m.Result, IntPtr.Zero, base.WndProc(ref m); có tác dụng gì? Hàm này làm gì?
    Last edited by 09520133; 16-05-2011, 23:25.

LHQC

Collapse
Working...
X