Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Повідомлення WM_PAINT
Прагнення виводити у вікно при обробці повідомлення WM_PAINT пояснюють наступним. Windows стежить за розташуванням вікон і при необхідності перемалювання надсилає повідомлення WM_PAINT функції вікна. Функція вікна при обробці цього повідомлення перемальовує все вікно або вказані частини. Повідомлення WM_PAINT обробляють наступним чином: case WM_PAINT: {PAINTSTRUCT ps; HDC hdc=BeginPaint(hwnd, & ps); //Тут налагоджують контекст відображення і виводять у вікно EndPaint(hwnd, & ps); return 0; } Структура PAINTSTRUCT описана наступним чином: Typedef struct { HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[16]; } PAINTSTRUCT; Приклад. Задача. В центрі робочої області вікна вивести текст.. Розв‘язок. #include " Functions.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE hInstance; Char szClass[]=" OutputClass"; INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT nCmdShow) {MSG msg; HWND hwnd;:: hInstance=hInstance; if (! regClass(WndProc, szClass, COLOR_WINDOW)) return FALSE; hwnd=CreateWindow(szClass, " Виведення тексту", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL); if (! hwnd) return FALSE; ShowWindow(hwnd, SW_SHOWMAXIMIZED); UpdateWindow(hwnd); while(GetMessage(& msg, NULL, 0, 0)) DispatchMessage (& msg); return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { char szText[]=" Виводимо бдь-який текст"; static short cx, cy; switch(msg) {case WM_SIZE: {cx=LOWORD(lParam); cy=HIWORD(lParam); return 0; } case WM_PAINT: {PAINTSTRUCT ps; HDC hdc=BeginPaint(hwnd, & ps); SetTextColor(hdc, RGB(255, 0, 0)); SetBkColor(hdc, RGB(0, 255, 255)); SetTextAlign(hdc, TA_CENTER); TextOut(hdc, cx/2, cy/2, szText, strlen(szText)); EndPaint(hwnd, & ps); return 0; } case WM_DESTROY: {PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam. LParam); } В стилі класу вікна (функція RegClass в Functions.cpp), яке обробляє повідомлення WM_PAINT, вказують, що воно повинно перемальовувати вміст при зміні розмірів вікна: wc.style=CS_HREDRAW | CS_VREDRAW; Вікна класу з таким стилем при зміні розмірів автоматично одержують повідомлення WM_PAINT. При обробці повідомлення WM_PAINT додались оператори налагодження атрибутів контексту відображення і виводу у вікно/ Якщо вміст вікна потрібно оновити при обробці іншим повідомленням, то функції вікна потрібно передати повідомлення WM_PAINT. Одна з функцій, які надсилають повідомлення WM_PAINT, - це функція UpdateWindow(). Приклад. Задача. В центрі робочої області вікна вивести рядок " Текст за замовчуванням". Після натискання лдівої кнопки миші вміст цього рядка замінити текстом " Натиснута ліва кнопка миші". Розв‘язок (перемалювання вікна після натискання лівої кнопки миші). #include " Functions.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE hInstance; char szClass[]=" OutputClass"; char szText[50]=" Текст за замовчуванням"; INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT nCmdShow) {MSG msg; HWND hwnd;:: hInstance=hInstance; if (! RegClass(WndProc, szClass, COLOR_WINDOW)) return FALSE; hwnd=CreateWindow(szClass, " Виведення тексту", WS_OVERLAPPEDWINDOW| WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL); if (! hwnd) return FALSE; while(GetMessage(& msg, NULL, 0, 0)) DispatchMessage (& msg); return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static short cx, cy; switch(msg) {case WM_SIZE: {cx=LOWORD(lParam); cy=HIWORD(lParam); return 0; } case WM_PAINT: {PAINTSTRUCT ps; HDC hdc=BeginPaint(hwnd, & ps); SetTextColor(hdc, RGB(255, 0, 0)); SetBkColor(hdc, RGB(0, 255, 255)); SetTextAlign(hdc, TA_CENTER); TextOut(hdc, cx/2, cy/2, szText, strlen(szText)); EndPaint(hwnd, & ps); return 0; } case WM_LBUTTONDOWN: {strcpy(szText, " Натиснуто ліву кнопку миші"); InvalidateRect(hwnd, NULL, TRUE); return 0; } case WM_DESTROY: {PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam. lParam); }
|