Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

перерисовка окна: я ничего непонял! )

282
28 октября 2010 года
Bard
481 / / 26.02.2006
Постановка задачи: требуеться выводить содержимое контекста (HDC) на окно и при етом подавлять дефолтную обработку WM_ERASEBKGND. Всё вроде ок. Но

Код:
#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;
   
}



Результат следующий: приложение полностью контролирует оконные сообщения связанные с перерисовкой только в двух случаях: когда перерисовка вызвана изменением размера окна или когда окно выходит из внеекранной области. А вот если перерисовка вызвана перекрытием окна другим окном - прямоугольник перекрытия всётаки заливаеться фоновой кистью. Интересно отметить что область подлежащяя перерисовке после перекрытия закрашивается даже если потоки приложения приостановлены. Следовательно, заливка фоновой кистью моего окна происходит не в моем процессе. Мистика...

Кто-нибудь сталкивался с подобным?
282
01 ноября 2010 года
Bard
481 / / 26.02.2006
Таки нашел способ решить проблему:

Оказываеться, можно просто задать класу окна фоновую кисть со стилем BS_HOLLOW.

 
Код:
WNDCLASS wc;

...

wc.hbrBackground = CreateBrushIndirect (&(LOGBRUSH) {BS_HOLLOW, 0, 0});


а вот всякие там

 
Код:
wc.hbrBackground = NULL;


к добру не приводят.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог