Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_progr_Win / Lab2.doc
Скачиваний:
13
Добавлен:
23.03.2015
Размер:
445.44 Кб
Скачать

Int cxChar, cyChar ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{ HDC hdc ;

PAINTSTRUCT ps ;

TEXTMETRIC tm ;

switch (iMsg)

{

case WM_CREATE :

hdc = GetDC (hwnd) ; //одержуємо дескриптор пристрою

SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;

GetTextMetrics (hdc, &tm) ;

cxChar = tm.tmAveCharWidth ;

cyChar = tm.tmHeight ;

ReleaseDC (hwnd, hdc) ;

return 0 ;

  1. Угорі робочої області програма KEYLOOK малює заголовок таблиці і, таким чином, ідентифікує дев'ять стовпців. Хоча можна створити шрифт, у якому символи будуть підкреслені, тут застосовується трохи інший підхід. Визначено два змінні типу рядка символів, що називаються szTop (у ній міститься текст) і szUnd (у ній містяться символи підкреслення) і при обробці повідомлення WM_PAINT вони виводяться в ту саму позицію у верхній частині вікна. Звичайно Windows виводить текст у режимі "opaque", що означає, що Windows обновляє область фону символу при його виводу на екран. Використання цього режиму фону може призвести до того, що другий символьний рядок (szUnd) зітре перший (szTop). Щоб запобігти цьому, переключіть контекст пристрою в режим "transparent" (режим без заповнення тла символів):

SetBkMode(hdc, TRANSPARENT);

Програма KEYLOOK не зберігає отримані апаратні повідомлення клавіатури, тому після одержання повідомлення WM_PAINT вона не може перемалювати вікно. З цієї причини KEYLOOK просто виводить заголовок таблиці у верхній частині робочої області при обробці повідомлення WM_PAINT. Перед викликом функції BeginPaint, при обробці повідомлення WM_PAINT, KEYLOOK робить недійсним усе вікно. Це дозволяє стерти усе вікно, замість того, щоб стирати недійсний прямокутник.

Тому внесіть у функцію WndProc такий код:

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{ HDC hdc ;

PAINTSTRUCT ps ;

static char szTop[] = "Message Key Char Repeat Scan Ext ALT Prev Tran";

static char szUnd[] = "_______ ___ ____ ______ ____ ___ ___ ____ ____";

TEXTMETRIC tm ;

switch (iMsg)

{

case WM_PAINT :

hdc = BeginPaint (hwnd, &ps) ;

SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;

SetBkMode (hdc, TRANSPARENT) ;

TextOut (hdc, cxChar, cyChar / 2, szTop, (sizeof szTop) - 1) ;//виводимо заголовок

TextOut (hdc, cxChar, cyChar / 2, szUnd, (sizeof szUnd) - 1) ;

EndPaint (hwnd, &ps) ;

return 0 ;

case WM_DESTROY :

  1. Два верхні рядки повинні залишатися постійно в клієнтській області, а інформація про повідомлення буде прокручуватися, тому нам необхідно знати розміри прямокутника, у якому буде здійснюватися прокручування. Розміри прямокутника будемо зберігати в структурі rect типу RECT. При зміні розмірів робочої області (повідомлення WM_SIZE) необхідно заново одержувати ширину і висоту прямокутника. Верхня границя залишається незмінної і визначається при обробці повідомлення WM_CREATE.

Додайте до програми наступний код:

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

RECT rect ;

int cxChar, cyChar ;

TextOut (hdc, cxChar, cyChar / 2, szUnd, (sizeof szUnd) - 1) ;

EndPaint (hwnd, &ps) ;

return 0 ;

case WM_SIZE :

rect.right = LOWORD (lParam) ;

rect.bottom = HIWORD (lParam) ;

UpdateWindow (hwnd) ;

return 0 ;

case WM_CREATE :

cyChar = tm.tmHeight ;

ReleaseDC (hwnd, hdc) ;

rect.top = 3 * cyChar / 2 ;

return 0 ;

  1. Дисплей у програмі KEYLOOK буде використовуватися так само, як застарілий пристрій виводу інформації — телетайп. Коли KEYLOOK одержує апаратні повідомлення клавіатури, вони усі обслуговуються однаково: викликається функція ScrollWindow для прокручування умісту всієї робочої області вікна так, щоб цей уміст змістився нагору на висоту одного символу. Функція TextOut використовується для виводу рядка нової інформації на екран, починаючи з висоти одного символу від нижнього краю робочої області. Це майже також просто, як може відбуватися вивод інформації на телетайпі. У першому стовпці показані повідомлення клавіатури, у другому — коди віртуальних клавіш для апаратних повідомлень клавіатури, у третьому — коди символів (і самі символи) для символьних повідомлень і, нарешті, у шести стовпцях, що залишилися, показаний стан шести полів параметра повідомлення lParam. Тому варто створити функцію, що буде займатися виводом у вікно. Це функція ShowKey. Функція ShowKey викликає ScrollWindow для прокручування нагору попередніх рядків перед висновком нового рядка. Звичайно це приводить до того, що частина вікна стає недійсної, і отже генерується повідомлення WM_PAINT. Для того, щоб цього уникнути, у функцію ShowKey включений виклик функції ValidateRect. Занесіть у програму наступний код:

}//кінець WinMain

Соседние файлы в папке Lab_progr_Win