powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кто рисует в non-client area вместо меня?
2 сообщений из 2, страница 1 из 1
Кто рисует в non-client area вместо меня?
    #38023152
Имею целью создать эффект отрисовки окна приложения при первом запуске. Для этого перехватываю первое появление сообщения WM_NCPAINT, самостоятельно рисуя окно. Последующие сообщения WM_*** даю обработать системе. Столкнулся с тем, что эффект проявляется лишь на клиентской области окна. Начав разбираться, написал простой тестовый код, который, как я думаю, не должен дать отрисоваться клиентской и неклиентской частям окна. Однако, не тут-то было. Окно отрисовывается так, как будто все сообщения WM_*** обрабатываются по умолчанию.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
#include <windows.h>

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	switch (uMsg) {
		case WM_NCPAINT:
			return 0;
		case WM_PAINT:
			return 0;
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;
	}
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
	WNDCLASSEX wndclass = {0};
	wndclass.cbSize = sizeof(WNDCLASSEX);
	wndclass.lpfnWndProc = &MainWndProc;
	wndclass.hInstance = hInstance;
	wndclass.hbrBackground = (HBRUSH) (COLOR_GRAYTEXT + 1);
	wndclass.lpszClassName = "Unvisible Wnd Class";
	if (!RegisterClassEx(&wndclass))
		return 0;
	HWND hwnd = CreateWindowEx(0, wndclass.lpszClassName, "", WS_OVERLAPPEDWINDOW,
		100, 100, 640, 480, HWND_DESKTOP, NULL, hInstance, NULL);
	ShowWindow(hwnd, SW_SHOW);
	
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
...
Рейтинг: 0 / 0
Кто рисует в non-client area вместо меня?
    #38023964
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы избавиться от неклиентской области, лучший рецепт - создавать окно БЕЗ нее.
В вашем коде, вы не учли 2-ух дополнительных вызовов

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	switch (uMsg) {
		case WM_NCPAINT:
		case WM_PAINT:
		case WM_ACTIVATE:
		case WM_NCACTIVATE:
			return 0;
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;
	}
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}


Но это не спасет вас от нажимания на кнопки окна [_] [Х], они по прежнему будут отрисовывать свой интерактив. Возможно и от этого можно избавится отслеживая перемещения и нажатия в неклиентской области окна. Попробуйте
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кто рисует в non-client area вместо меня?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]