有一结构:typedef struct _WNDCLASSA
{ UINT style ; //窗口类风格
WNDPROC lpfnWndProc ; //指向窗口过程函数的指针
int cbClsExtra ; //窗口类附加数据
int cbWndExtra ; //窗口附加数据
HINSTANCE hInstance ; //拥有窗口类的实例句柄
HICON hIcon ; //最小窗口图标
HCURSOR hCursor ; //窗口内使用的光标
HBRUSH hbrBackground ; //用来着色窗口背景的刷子
LPCSTR lpszMenuName ; //指向菜单资源名的指针
LPCSTR lpszClassName ; // 指向窗口类名的指针
}
说lpfnWndProc是一个函数指针,那么它是在哪里定义的?它的原型是什么?
lpfnWndProc看起来并不是一个指针的形式啊!
{ UINT style ; //窗口类风格
WNDPROC lpfnWndProc ; //指向窗口过程函数的指针
int cbClsExtra ; //窗口类附加数据
int cbWndExtra ; //窗口附加数据
HINSTANCE hInstance ; //拥有窗口类的实例句柄
HICON hIcon ; //最小窗口图标
HCURSOR hCursor ; //窗口内使用的光标
HBRUSH hbrBackground ; //用来着色窗口背景的刷子
LPCSTR lpszMenuName ; //指向菜单资源名的指针
LPCSTR lpszClassName ; // 指向窗口类名的指针
}
说lpfnWndProc是一个函数指针,那么它是在哪里定义的?它的原型是什么?
lpfnWndProc看起来并不是一个指针的形式啊!
或者
LONG WINAPI WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 我很少用API写程序。
MSDN用例如下:
// Register an ANSI window class.
WNDCLASSA AnsiWndCls;
AnsiWndCls.style = CS_DBLCLKS | CS_PARENTDC;
AnsiWndCls.lpfnWndProc = (WNDPROC)AnsiWndProc;
AnsiWndCls.cbClsExtra = 0;
AnsiWndCls.cbWndExtra = 0;
AnsiWndCls.hInstance = hmodUser;
AnsiWndCls.hIcon = NULL;
AnsiWndCls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_IBEAM);
AnsiWndCls.hbrBackground = NULL;
AnsiWndCls.lpszMenuName = NULL;
AnsiWndCls.lpszClassName = "TestAnsi";
RegisterClassA(&AnsiWndCls); // ANSI Window Procedure
LONG AnsiWndProc(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
// Dispatch the messages that can be received.
switch (message)
{
case WM_CHAR:
// wParam - the value of the key
// lParam - (not used in this example)
if (lstrcmpA("Q", (LPCSTR) wParam))
{
// ...
}
else
{
// ...
}
break;
// Process other messages.
}
}
long (*lpfnwndproc)(HWND,UINT,WPARAM,LPARAM)那么_WNDCLASSA结构应该是:
typedef struct _WNDCLASSA
{ UINT style ; //窗口类风格
long (*lpfnwndproc)(HWND,UINT,WPARAM,LPARAM); //指向窗口过程函数的指针
int cbClsExtra ; //窗口类附加数据
int cbWndExtra ; //窗口附加数据
HINSTANCE hInstance ; //拥有窗口类的实例句柄
HICON hIcon ; //最小窗口图标
HCURSOR hCursor ; //窗口内使用的光标
HBRUSH hbrBackground ; //用来着色窗口背景的刷子
LPCSTR lpszMenuName ; //指向菜单资源名的指针
LPCSTR lpszClassName ; // 指向窗口类名的指针
}
为什么不定义成上面的形式啊?应该是这样的形式的啊!
有谁知道其内幕啊?
typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);用的时候就是WNDPROC lpfnWndProc了.
long (*lpfnwndproc)(HWND,UINT,WPARAM,LPARAM); 这两种风格哪种更易于理解?楼主你说呢?