Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Повідомлення 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); }

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал