Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ІК (Говорущенко) Методичка.doc
Скачиваний:
6
Добавлен:
23.02.2016
Размер:
762.88 Кб
Скачать

IV. Контрольні питання

  1. В чому перевага використання комбінованого списка в порівнянні із звичайним списком?

  2. Що буде, якщо при створенні комбінованого списка другим аргумнтом вказати на деякий рядок?

  3. Які органи управління не використовують ідентифікатори?

  4. Які органи управління і в якому випадку не використовують дескрипторів вікон?

  5. Які основні етапи створення орагнів управління?

Лабораторна робота №4

Тема: ІнтерфейсGDI: Виведення у вікно.Види контекста відображення. Атрибути контексту відображення. Виведення тексту. Створення геометричних фігур.

Мета: Знайомство з організацією виведення у вікно. Ознайомлення з видами і атрибутами контексту відображення, творенням геометричних фігур.

І. Теоретичні відомості

Виведення у вікно

Виведення у вікно має наступні особливості:

  1. В системі Windows додатки виводять одночасно в різні вікна. Система сама вирішує проблеми перекриття та пересувань вікон. В цьому зв'язку виведення у вікно розробник прагне описувати в одному місці додатку - при обробці повідомлення WM_PAINT, щоб при надходженні повідомлення WM_PAINT функція вікна могла перемалювати вікно.

  2. Інтерфейс графічних пристроїв (Graphics Device Interface - GDI) системи відкриває доступ до великої кількості функцій виведення. Додатки, звертаючись до функцій GDI, працюють не з фізичними, а з логічними пристроями виведення, і опис виклику функцій не залежить від фізичного способу відображення.GDIпередає вказівки про вивід драйверу пристроя відображення. Драйвер працює безпосередньо з фізичним пристроєм та при управлінні відображенням враховує його можливості та особливості. Тому додатки можуть працювати з будь-яким пристроєм відображення, драйвер якого встановлено в системі.

  3. Параметри виводу встановллють в контексті відображення за допомогою функцій GDI. Контекст відображення - це структура даних, яка містить характеристики пристрою відображення та вказівники на обрані інструменти малювання. ФункціїGDIвикористовуютть лише обрані в контекст відображення параметри і інструменти малювання.

  4. Дескриптор контексту відображення служить першим аргументом виклику всіх функцій, пов'язаних з виводом у вікно.

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