在跟进duilib的CWindowWnd构造函数,发现传递m_OldWndProc(::DefWindowProc)
m_OldWndProc定义如下:
WNDPROC m_OldWndProc;
WNDPROC 定义如下:
typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
这行代码的含义是:
定义一个指针类型WNDPROC,这个类型的指针指向一个函数,
这个函数的返回值类型是LRESULT(也就是long),
这个函数的调用约定是CALLBACK(也就是__stdcall规则),
这个函数的参数类型是(HWND, UINT, WPARAM, LPARAM)。
如何使用:
比如我们在通过CreateWindow创建一个窗口之前
需要通过WNDCLASS结构体设计窗体
如:
WNDCLASS wndcls;
wndcls.lpfnWndProc=WinSunProc;
这里,lpfnwndproc是WNDCLASS结构体的一个成员变量,
其声明如下:
WNDPROC lpfnWndProc;
这里面lpfnWndProc就是WNDPROC类型的指针
wndcls.lpfnWndProc=WinSunProc;
这行代码就是将该类型的指针lpfnWndProc指向了一个具体的
所符合的函数WinSunProc
WinSunProc的定义如下,它符合WNDPROC类型指针所指向的函数的类型定义
LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
这个函数是系统默认处理各种函数的,下面还说明DefWindowProc和WindowProc的区别
1.
WindowProc是你给自己的窗口定义的窗口处理函数
DefWindowProc是windows平台提供的默认窗口处理函数
如果某些消息你不需要做特别的处理,调用DefWindowProc进行处理就可以了,不需要你自己再去些那些windows的"标准动作"
2. 如果在一个Dialog中定义了这两个函数,当有一WM_LBUTTONDOWN消息传递到Dialog后,就首先调用WindowProc函数进行处理,若该消息没有得到处理那么就默认到DefWindowProc函数中进行处理;
而自定义的消息如UM_MENUBUTTONCLICK则只能由DefWindowProc来处理?
根据1,显然,你只能定义WindowProc而不能定义DefWindowProc
看看MFC的CWnd源码就一目了然了
LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// OnWndMsg does most of the work, except for DefWindowProc call
LRESULT lResult = 0;
if (!OnWndMsg(message, wParam, lParam, &lResult)) // 如果消息是需要自己处理的,
//处理后就不必让windows系统进行默认处理了
lResult = DefWindowProc(message, wParam, lParam); // 自己没有处理的就交给windows去做
return lResult;
}
也就是说:DefWindowProc是用来处理WindowProc中未处理的消息!