Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кто рисует в non-client area вместо меня? / 2 сообщений из 2, страница 1 из 1
02.11.2012, 12:25
    #38023152
Кто рисует в non-client area вместо меня?
Имею целью создать эффект отрисовки окна приложения при первом запуске. Для этого перехватываю первое появление сообщения 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
02.11.2012, 20:15
    #38023964
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто рисует в non-client area вместо меня?
Чтобы избавиться от неклиентской области, лучший рецепт - создавать окно БЕЗ нее.
В вашем коде, вы не учли 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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кто рисует в non-client area вместо меня? / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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