求大佬棒棒忙 c++创建窗口

C2440    “=”: 无法从“void (__stdcall *)(HWND,WPARAM,LPARAM)”转换为“WNDPROC”   

 

#include <iostream>
#include <windows.h>
HWND MainWindowHandle = 0;
bool InitWinsoqaApp(HINSTANCE instanceHandle, int show);  //初始化
int Run();
LRESULT CALLBACK WndProc(
    HWND hwnd,
    WPARAM wParam,
    LPARAM lParam
) ;        //回调函数
int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    PSTR pCmdLine,
    int nShowCmd
)
{
    if (!InitWinsoqaApp(hInstance, nShowCmd))
    {
        return 0;
    }
    return Run();
}
bool InitWinsoqaApp(HINSTANCE instanceHandle, int show) {
    WNDCLASS wc;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;                                                    //就是这行除了问题
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = instanceHandle;
    wc.hIcon = LoadIcon(0, IDI_APPLICATION);
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
    wc.lpszMenuName = 0;
    wc.lpszClassName = 0;

    if (RegisterClass(&wc))
    {
        return false;
    }
    MainWindowHandle = ::CreateWindow(
        0,
        0,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        0,
        0,
        instanceHandle,
        0
    );
    if (MainWindowHandle == 0)
    {
        return false;
    }
    ShowWindow(MainWindowHandle, show);
    UpdateWindow(MainWindowHandle);
    return true;
}

int Run() {
    MSG msg;
    ZeroMemory(&msg, sizeof(MSG));
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(
    HWND windowHandle,
    UINT msg,
    WPARAM wParam,
    LPARAM lParam
)
{
    switch (msg)
    {
    case WM_LBUTTONDOWN:
        return 0;
    case WM_KEYDOWN:
        if (wParam == VK_ESCAPE)
            DestroyWindow(MainWindowHandle);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(
        windowHandle,
        msg,
        wParam,
        lParam
    );
}

你可以将其强制类型转换,但是这样又会出现新的问题。

wc.lpfnWndProc = (WNDPROC)WndProc;                                                    //就是这行除了问题