菜鸟求救
在如下的简单的API函数中,在调用回调函数时,为什么不传递实参呢?请看这句:wndclass.lpfnWndProc=WndProc;
#include"windows.h"
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR IpszCmdLine,int nCmdShow)
{
MSG Msg;
WNDCLASS wndclass;
char lpszClassName[]="简单窗口";
wndclass.style=0;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=(LPCWSTR)lpszClassName;
if(!RegisterClass(&wndclass))
{
return FALSE;
}
HWND hwnd;
char lpszTitle[]="MyfirstApplication";
hwnd=CreateWindow(
(LPCWSTR)lpszClassName,
(LPCWSTR) lpszTitle,
WS_OVERLAPPED,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
[解决办法]
那里需要的是函数的地址,函数名就是地址,你只要把地址赋给那个变量就OK
[解决办法]
wndclass.lpfnWndProc=WndProc;
WndProc是一个函数指针,需要调用这个函数的时候直接用函数指针去调用,函数指针就代表了那一整个函数。
lpfnWndProc成员变量的类型是WNDPROC,是一个函数指针类型,定义如下:
typedef LERESULT (CALLBACK* WNDPROC)(HWND,UINT,WPARAM,IPARAM);
只要某个函数的返回值,参数个数,参数顺序,调用方式与之相同,就可以把函数指针(就是函数名)赋值给lpfnWndProc。
建议看看函数指针的知识,就明白了。
[解决办法]
这不是调用,只是设置回调函数
调用是这样的:
wndclass.lpfnWndProc(.....);