#include <stdio.h>
#include <windows.h>
char wnd_class[] = "wnd_class";
HWND hwnd;
long __stdcall wndproc (HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) {
PAINTSTRUCT ps;
if (message == WM_CLOSE) {
PostQuitMessage (0);
} else
if (message == WM_KEYDOWN) {
if (wparam == VK_ESCAPE)
PostQuitMessage (0);
} else
if (message == WM_ERASEBKGND) {
return 1;
} else
if (message == WM_PAINT) {
BeginPaint (hwnd, &ps);
EndPaint (hwnd, &ps);
return 1;
}
return DefWindowProc (hwnd, message, wparam, lparam);
}
int register_class () {
WNDCLASS wc = {0};
wc.lpfnWndProc = wndproc;
wc.lpszClassName = wnd_class;
return (RegisterClass (&wc));
}
void unregister_class () {
UnregisterClass (wnd_class, 0);
}
int create_window () {
hwnd = CreateWindowEx (
0,
wnd_class,
NULL,
WS_OVERLAPPEDWINDOW,
0, 0, 0, 0,
HWND_DESKTOP,
NULL,
NULL,
NULL);
return (hwnd != 0);
}
void show_window () {
ShowWindow (hwnd, SW_SHOW);
}
int move_window_center_screen (int width, int height) {
MoveWindow (
hwnd,
GetSystemMetrics (SM_CXSCREEN)/2 - width/2,
GetSystemMetrics (SM_CYSCREEN)/2 - height/2,
width, height, TRUE);
}
int mainloop () {
MSG msg;
while (GetMessage (&msg, NULL, 0, 0)) {
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
int main () {
if (!register_class ()) {
printf ("register_class() failed\n");
goto fail;
}
if (!create_window ()) {
printf ("create_window() failed\n");
goto fail;
}
move_window_center_screen (800, 600);
show_window ();
mainloop ();
unregister_class ();
return 0;
fail:
getch ();
return 0;
}
перерисовка окна: я ничего непонял! )
Код:
Результат следующий: приложение полностью контролирует оконные сообщения связанные с перерисовкой только в двух случаях: когда перерисовка вызвана изменением размера окна или когда окно выходит из внеекранной области. А вот если перерисовка вызвана перекрытием окна другим окном - прямоугольник перекрытия всётаки заливаеться фоновой кистью. Интересно отметить что область подлежащяя перерисовке после перекрытия закрашивается даже если потоки приложения приостановлены. Следовательно, заливка фоновой кистью моего окна происходит не в моем процессе. Мистика...
Кто-нибудь сталкивался с подобным?
Оказываеться, можно просто задать класу окна фоновую кисть со стилем BS_HOLLOW.
Код:
WNDCLASS wc;
...
wc.hbrBackground = CreateBrushIndirect (&(LOGBRUSH) {BS_HOLLOW, 0, 0});
...
wc.hbrBackground = CreateBrushIndirect (&(LOGBRUSH) {BS_HOLLOW, 0, 0});
а вот всякие там
Код:
wc.hbrBackground = NULL;
к добру не приводят.