首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

初学者

2012-03-28 
菜鸟求救在如下的简单的API函数中,在调用回调函数时,为什么不传递实参呢?请看这句:wndclass.lpfnWndProcW

菜鸟求救
在如下的简单的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(.....);

热点排行