Форум С++

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

Автор: oleg_alexeev   (27.02.2007 в 21:01)
Вот вполне корректный код обработчика WM_PAINT:


PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);

RECT r, tmp;
GetClientRect(hWnd, &r);

HDC hdc_buf = CreateCompatibleDC(hdc);
HBITMAP hbm_buf = CreateCompatibleBitmap(hdc, r.right, r.bottom);
HBITMAP hbm_old = (HBITMAP) SelectObject(hdc_buf, hbm_buf);

HBRUSH hbr1 = CreateSolidBrush(RGB(0,100,200));
HBRUSH hbr2 = CreateSolidBrush(RGB(200,100,0));

// paint something
tmp = r; tmp.bottom = 30; FillRect(hdc_buf, &tmp, hbr1);
tmp = r; tmp.top    = 30; FillRect(hdc_buf, &tmp, hbr2);
TextOut(hdc_buf, 10, 20, "Hello world!", 12);
// put to screen
BitBlt(hdc, 0, 0, r.right, r.bottom, hdc_buf, 0, 0, SRCCOPY);

DeleteObject(hbr1);
DeleteObject(hbr2);

SelectObject(hdc_buf, hbm_old);
DeleteObject(hbm_buf);
DeleteDC(hdc_buf);

EndPaint(hWnd, &ps);


Не забудте в обработчике WM_ERASEBKGND вернуть 1.

Если смущает создание и удаление битмапа внутри WM_PAINT, то его конечно можно создать
в WM_CREATE, но придется отслеживать изменения размеров окна и изменения глубины цвета
экрана. Я бы оставил так (в основном так и поступают).


Ваше имя:

Пароль:

Цитировать

Используйте тэги для выделения текста:
Код: [code][/code]
Жирный: [b][/b]
Наклонный: [i][/i]
URL: [url][/url]

Сообщение:

Прикрепить: