有这个函数:
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);我定义一个指向它的指针:
typedef LRESULT (CALLBACK* PWNPROC)(HWND,UINT,WPARAM,LPARAM);编译时出了1个错误:
'InitWindow' : cannot convert parameter 2 from 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' to 'long'
        This conversion requires a reinterpret_cast, a C-style cast or function-style cast请问这是什么错误?如何改呢?
================================================================#include <windows.h>HWND InitWindow(HINSTANCE,LRESULT,INT);
VOID MsgProc(MSG*);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
typedef LRESULT (CALLBACK* PWNDPROC)(HWND,UINT,WPARAM,LPARAM);INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR pCmdLine,INT iShowCmd)
{
HWND hwnd;
MSG msg;

hwnd=InitWindow(hInstance,WndProc,iShowCmd);
MsgProc(&msg); return msg.wParam;
}VOID MsgProc(MSG* pMsg)
{
while(GetMessage(pMsg,NULL,0,0))
{
TranslateMessage(pMsg);
DispatchMessage(pMsg);
}
}HWND InitWindow(HINSTANCE hInstance,PWNDPROC pWndProc,INT iShowCmd)
{
TCHAR szAppName[]=TEXT("HelloWin");
HWND hwnd;
MSG msg;
WNDCLASS wndclass; wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=pWndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetSysColor(COLOR_BTNFACE);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName; if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This program requires Windows2000/XP"),szAppName,MB_ICONERROR);
return 0;
} hwnd=CreateWindow(szAppName,TEXT("HelloWin"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,iShowCmd);
UpdateWindow(hwnd); return hwnd;
}LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect; switch(message)
{
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
DrawText(hdc,TEXT("Hello,Windows2000!"),-1,&rect,DT_SINGLELINE);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
}

解决方案 »

  1.   

    函数原型错了吧:
    HWND InitWindow(HINSTANCE,LRESULT,INT);
    改为:
    HWND InitWindow(HINSTANCE,PWNPROC,INT);
    试一下看可不可以。
      

  2.   

    另外那个
    typedef LRESULT (CALLBACK* PWNDPROC)(HWND,UINT,WPARAM,LPARAM);
    应该放在函数声明的前面。
    试看看。
      

  3.   

    楼上正解
    改成这样
    typedef LRESULT (CALLBACK* PWNDPROC)(HWND,UINT,WPARAM,LPARAM);
    HWND InitWindow(HINSTANCE,PWNDPROC,INT);
    VOID MsgProc(MSG*);
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);