Я новичок в C ++ и WinApi. Я не могу создать простое окно в WinApi. Функция CreateWindow () возвращает ноль. Функция GetLastError () возвращает ошибку 1813.
Но перед созданием окна GetLastError () возвращает 0. Извините за мой английский. Вот мой полный код:
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
LPCWSTR szWindowClass = TEXT("WndClass");
LPCWSTR szTitle = TEXT("Main window");
DWORD dwError;
WNDCLASS wc;
wc.style = CS_OWNDC;
wc.hInstance = hInstance;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.lpfnWndProc = WndProc;
wc.lpszClassName = szWindowClass;
wc.lpszMenuName = L"MenuName";
dwError = GetLastError(); //0
RegisterClass(&wc);
dwError = GetLastError();//0HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);//NULL
dwError = GetLastError();//1813 =(
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
return 0;
}
Прежде всего, ваша обработка ошибок неверна. Документация говорит вам позвонить GetLastError
только если CreateWindow
не удалось. А также CreateWindow
сбой обозначается возвращаемым значением NULL
, Вы должны проверить возвращаемое значение CreateWindow
перед звонком GetLastError
, Пожалуйста, убедитесь, что вы прочитали документация внимательно.
Вы делаете точно такую же ошибку в вашем звонке RegisterClass
, В вашу защиту, это самая распространенная ошибка, совершаемая начинающими программистами Win32.
Код ошибки 1813, есть ERROR_RESOURCE_TYPE_NOT_FOUND
, документация говорит:
Указанный тип ресурса не может быть найден в файле изображения.
Опять же, вы можете узнать эту информацию, прочитав документацию, когда вы знаете, где искать.
Это значит, что CreateWindow
пытается найти ресурс, которого нет в файле. Возможно, вам не удалось связать ресурс меню.
Ваша процедура окна также неисправна. Так должно быть:
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
Когда вы начнете добавлять обработку на заказ для определенных сообщений, убедитесь, что вы по-прежнему вызываете DefWindowProc
для любых других сообщений.
Вам нужно вернуть результат DefWindowProc
за сообщения, с которыми вы не справляетесь.
Увидеть Вот для дополнительной информации.