mrjbom
@mrjbom

Не создаётся дочернее окно WinAPI или CreateWindows возвращает нуль?

Имеется такой код
#include <Windows.h>
#include <wchar.h>

using namespace std;

#define ID_FIRSTCHILD 100

HINSTANCE hInst;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM);

wchar_t WinName[] = L"MainFrame";
HWND child;

int WINAPI WinMain(
	HINSTANCE This,
	HINSTANCE Prev,
	LPSTR cmd,
	int mode
)
{
	HWND hWnd;
	MSG msg;
	WNDCLASS wc;
	wc.hInstance = This;
	hInst = This;
	wc.lpszClassName = WinName;
	wc.lpfnWndProc = WndProc;
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.lpszMenuName = NULL;
	wc.cbClsExtra = NULL;
	wc.cbWndExtra = NULL;
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	if (!RegisterClass(&wc)) return NULL;
	int WindowWidth = 800;
	int WindowHeight = 800;
	int ScreenWidth = GetSystemMetrics(SM_CXSCREEN) - WindowWidth;
	int ScreenHeight = GetSystemMetrics(SM_CYSCREEN) - WindowHeight;
	hWnd = CreateWindow(
		WinName,
		L"Title",
		WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX,
		ScreenWidth / 2,
		ScreenHeight / 2,
		WindowWidth,
		WindowHeight,
		HWND_DESKTOP,
		NULL,
		This,
		NULL
	);
	ShowWindow(hWnd, mode);
	while (GetMessage(&msg, NULL, NULL, NULL))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return NULL;
}

LRESULT CALLBACK WndProc(
	HWND hWnd,
	UINT message,
	WPARAM wParam,
	LPARAM lParam
)
{
	switch (message)
	{
	case WM_CREATE:
		WNDCLASS w;
		memset(&w, 0, sizeof(WNDCLASS));
		w.lpszClassName = L"ChildMain";
		w.lpfnWndProc = ChildProc;
		w.hInstance = hInst;
		w.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		w.style = CS_HREDRAW | CS_VREDRAW;
		w.hCursor = LoadCursor(NULL, IDC_CROSS);
		w.lpszMenuName = NULL;
		w.cbClsExtra = NULL;
		w.cbWndExtra = NULL;
		if (!RegisterClass(&w))
		{
			MessageBox(NULL, L"Class not register", L"", MB_OK);
			return NULL;
		}
		child = CreateWindow(
			L"ChildWnd",
			L"ChildWindow",
			WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX,
			10,
			10,
			500,
			300,
			hWnd,
			NULL,
			hInst,
			NULL
		);
		if (!child)
		{
			MessageBox(NULL, L"А child нулевой", L"", MB_OK);
			return NULL;
		}
		ShowWindow(child, SW_NORMAL);
		UpdateWindow(child);
		break;
	case WM_DESTROY:
		PostQuitMessage(NULL);
		break;
	default: return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return NULL;
}

LRESULT CALLBACK ChildProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
	if (Message == WM_CREATE)
	{
		MessageBox(NULL, L"Created", L"", MB_OK);
	}
	if (Message == WM_DESTROY)
	{
		MessageBox(NULL, L"Destroy", L"", MB_OK);
		return NULL;
	}
	return DefWindowProc(hwnd, Message, wparam, lparam);
}


Падает ошибка "А child нулевой", почему так происходит?
Извиняюсь за плохой код.
  • Вопрос задан
  • 350 просмотров
Пригласить эксперта
Ответы на вопрос 3
SerJook
@SerJook
кодер
Может потому, что вы регистрируете класс с именем "ChildMain", а пытаетесь создать окно класса "ChildWnd" ??
Ответ написан
Комментировать
@NewDevLab
WinName - потому что такой класс не зарегистрирован?
Ответ написан
Комментировать
@Sumor
Чтобы понять что за ошибка вызовите дополнительно GetLastError.
В момент обработки WM_CREATE окно ещё не до конца создано, может быть проблема в этом.
Дочерние окна чаще всего подразумевают панели или контролы. Попробуйте создать дочернее окно не со своим классом, а, например, кнопку или текстовое окно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы