Окно Программирование Настройка Окна

У меня есть эти ошибки буксировки и я не могу исправить их, что бы я ни пытался. я использую Windows 8.1

Ошибка 1 ошибка C3861: "InitMainWindow": идентификатор не найден

Ошибка 2, ошибка C2440: "=": невозможно преобразовать из "LRESULT (__stdcall *)(HWND,WPARAM,LPARAM)" в "WNDPROC"

код:

#include <windows.h>    // include the basic windows header file

bool InitMainWindow(HINSTANCE, int);

LRESULT CALLBACK MsgProc(HWND UINT, WPARAM, LPARAM);

const int width = 800;
const int height = 600;

HWND hwnd = NULL;

// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int     nCmdShow)
{
    if (!InitMainWindow(hInstance, nCmdShow))
        return 1;

     MSG msg = { 0 };
     while (WM_QUIT != msg.message)
     {
         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
         {
             TranslateMessage(&msg);
             DispatchMessage(&msg);
         }
         return static_cast<int>(msg.wParam);
     }
}

bool InitMainWindow(HINSTANCE hInstance, int nCmdShow)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(wcex);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.lpfnWndProc = MsgProc;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
    wcex.lpszClassName = NULL;
    wcex.lpszMenuName = NULL;
    wcex.hIconSm = LoadIcon(NULL, IDI_WINLOGO);

    if (!RegisterClassEx(&wcex))
        return false;

    hwnd = CreateWindow (
        NULL,
        NULL,
        WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION,
        GetSystemMetrics(SM_CXSCREEN) / 2 - width / 2,
        GetSystemMetrics(SM_CYSCREEN) / 2 - height / 2,
        width,
        height,
        (HWND)NULL,
        (HMENU)NULL,
        hInstance,
        (LPVOID*)NULL);

    if (!hwnd)
        return false;
    ShowWindow(hwnd, nCmdShow);
    return true;

}

LRESULT CALLBACK MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    case WM_CHAR:
        switch (wParam)
        {

         case VK_ESCAPE:
             PostQuitMessage(0);
             return 0;
        }
        return 0;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}

1 ответ

Вы пропускаете запятую в объявлении MsgProc.

У тебя есть

LRESULT CALLBACK MsgProc(HWND UINT, WPARAM, LPARAM);

которая объявляет функцию, которая принимает HWND с именем UINT.

Тебе нужно

LRESULT CALLBACK MsgProc(HWND, UINT, WPARAM, LPARAM);

После этого он компилируется нормально.

Другие вопросы по тегам