Лекция 10
Графические файлы
Растровые форматы
Векторные форматы
Пример.Вставка таблицы Excel в документ Word
Размеры сохраненных файлов
Определение метафайла
Метафайлы в Builder C++
Создание и сохранение метафайла
Загрузка метафайла
Буфер обмена
Метафайлы GDI
Информация метафайла
Информация метафайла
Правила работы с метафайлами
Сценарий работы с метафайлом (1-й вариант)
Создание метафайла
Получаем дескриптор метафайлов
Сценарий работы с метафайлом (2-й вариант)
Получаем метафайл из файла
Сценарий работы с метафайлом (3-й вариант)
Тема
ВВОД ИНФОРМАЦИИ С КЛАВИАТУРЫ
Код виртуальной клавиши
Фокус ввода – временное свойство окна
Сообщения передачи фокуса ввода
Сообщения клавиатуры
Параметры клавиатурных сообщений
Виртуальные коды клавиш
Виртуальные коды
Символьные клавиши
Проверка состояния клавиш
Состояние клавиш в произвольный момент
Примеры получения состояния клавиш
Наименование клавиш
Символьные сообщения
Параметры символьных сообщений
Задачи для самопроверки
413.50K
Category: programmingprogramming

Метафайлы Windows

1. Лекция 10

Метафайлы Windows

2. Графические файлы

Графический файл - это способ записи графических данных.
Растровые изображения - комбинация разноцветных пикселей,
которые легко рассмотреть при увеличении картинки.
У файлов с изображениями в таком формате большой размер.
Качество и «вес» напрямую зависят от количества пикселей.
Чем четче и качественнее фото, тем больше памяти оно занимает
на устройстве.
Векторные изображения состоят из опорных точек и кривых линий
между ними. Всего этого пользователь не замечает даже при
сильном увеличении картинки.
Благодаря этому масштабирование происходит без потери качества.
Однако такие графические элементы выглядят гораздо проще.

3. Растровые форматы

Чаще всего используются для загрузки
фотографий и оцифрованных картинок.
Для таких типов файлов есть две
системы записи цвета - CMYK и RGB:
CMYK, если изображение готовится к
печати.
RGB, если картинка предназначена
для размещения на электронной
платформе.

4. Векторные форматы

Векторные форматы графических файлов
используют для создания иллюстраций,
шрифтов, логотипов, значков, элементов для
оформления сайта или документа и т.д.
Все типы файлов изображений, исполненных в
векторной графике, не теряют детализацию и
качество при изменении размера.

5. Пример.Вставка таблицы Excel в документ Word

File1.doc (Таблица Excel)
File2.doc
(вставка объекта Excel)
Объект оживает в Word
(загружается Excel)

6. Размеры сохраненных файлов

7. Определение метафайла

Метафайл – это изображение, которое хранится в виде
последовательности команд рисования и параметров.
Метафайлы также называют векторными изображениями.
Команды и параметры, записанные в Метафайле , могут
храниться в памяти или сохраняться в файле.
Форматы:
формат метафайла Windows (WMF)
EMF (Enhanced Metafile —расширенный метафайл)
EMF+ (GDI+)
GDI+ может отображать метафайлы, хранящиеся
в любом формате, но записывать метафайлы в форматах
EMF и EMF+, но не в формате WMF.

8. Метафайлы в Builder C++

Класс TMetafile
Создание
1.
Создать объект метафайл
2.
Создать канву для создания изображения на метафайле
Дополнение метафайла
1.
Создать новую канву
2.
Поместить на нее предыдущее изображение (проиграть
изображение)
Сохранение и извлечение метафайла
1.
Метод SaveToFile
2.
Метод LoadFromFile

9. Создание и сохранение метафайла

TMetafile * NewMetafile;
TMetafileCanvas* NewCanvas;
NewMetafile = new TMetafile;
NewMetafile->Enhanced=true; // Формат .emf
NewCanvas = new TMetafileCanvas(NewMetafile,0);
NewCanvas->Brush->Color=clWhite;
NewCanvas->Rectangle (0,0,300,300);
NewCanvas-> Pen->Color=clYellow;
NewCanvas-> Pen->Width=3;
NewCanvas-> Brush->Color=clBlue;
NewCanvas->Ellipse (100,50,200,250);
NewCanvas->MoveTo(50,250);
NewCanvas->LineTo(250,50);
delete NewCanvas;
Form1->Canvas->Draw(10,10,NewMetafile);
NewMetafile->SaveToFile("metaf1.emf");
delete NewMetafile;

10. Загрузка метафайла

TMetafile *NewMetafile;
NewMetafile= new TMetafile;
NewMetafile->LoadFromFile("metaf1.emf");
NewMetafile->Enhanced=true;
TMetafileCanvas* NewCanvas;
NewCanvas = new TMetafileCanvas(NewMetafile,0);
NewCanvas->Draw (0,0,NewMetafile);
NewCanvas->Pen->Color=clBlue;
NewCanvas->Brush->Color=RGB(128,128,128);
NewCanvas->RoundRect(50,50,130,150,10,10);
delete NewCanvas;
Form1->Canvas-> Draw(0,0,NewMetafile);
NewMetafile->SaveToFile("metaf2.emf");
delete NewMetafile;

11. Буфер обмена

TMetafile *NewMetafile;
NewMetafile=new TMetafile;
NewMetafile ->
LoadFromFile("metaf1.emf");
// Копируем в буфер обмена
Clipboard()->
Assign(NewMetafile);
delete NewMetafile;
Form2->Show();
Аналогично будет работать с
битовыми картами.
TMetafile *NewMetafile;
NewMetafile=new TMetafile;
//Загружаем из буфера в метафайл
NewMetafile->Assign(Clipboard());
Form2-> Canvas->Draw
(0,0,NewMetafile);
delete NewMetafile;

12. Метафайлы GDI

В файле записаны команды интерфейса графических устройств (GDI).
Функция PlayMetaFile() воспроизводит визуальное изображение.
Обеспечивают независимые от устройства средства хранения и выборки
графической информации.
Достаточно легко создаются.
Экономят память, так как команды метафайла остаются на диске.
Удобны для программ отображающих большое количество графических
изображений.
Длина метафайла практически не ограничена.
Идеально подходят для таких изображений как карты, диаграммы,
архитектурные чертежи.
Удобны для передачи в буфер обмена Windows (если изображение можно
нарисовать командами GDI, его можно передавать через метафайл).
Расширение файла: .wmf .emf, можно назначить свое расширение или
сохранить без расширения.

13. Информация метафайла

Три вида метафайла: стандартный, размещаемый и буферный
(отличия вариантов состоят только в разных структурах
заголовков).
В размещаемом дополнительная информация о размерах
(заголовок – 22 байта, нужна для отображения в одинаковых
размерах на различных устройствах).
Контекст устройства метафайла - это область памяти куда
помещаются вызовы GDI –функций.
Контексты устройств метафайла не имеют предварительно
определенных атрибутов (инструментов) и используют то,
что определено для окна, в котором создается метафайл.

14. Информация метафайла

Представление информации в метафайле:
С графическими функциями связаны значения констант определенных
в Windows.
Значения констант хранятся в записях метафайла и являются ссылками на
GDI – команды.
Константы состоят из двух частей: идентифицируют номер функции и
суммарное число байт, которое требуется для хранения параметров
этой функции.
Параметр контекста устройства не входит в число хранящихся параметров,
контексты обеспечиваются при воспроизведении метафайла (т.е. обеспечиваются
программой).
Некоторые функции не хранятся в метафайле (создание инструментов,
например, CreateSolideBrush, которая создает кисть для рисования).
Команда создания (повторного создания) объекта будет сгенерирована, когда
кисть выбирается в контексте устройства метафайла.

15. Правила работы с метафайлами

Дескриптор: HMETAFILE используется для ссылки на метафайл, после того
как он был создан и закрыт.
Дескриптор контекста устройства метафайл (HDC) используется только для
создания метафайла.
Воспроизведение метафайла может влиять на текущие атрибуты контекста
устройства, поэтому лучше окружить функцию PlayMetaFile функциями сохранения
и восстановления атрибутов:
SaveDC (hDC)
PlayMetaFile(hDC,hmetF);
Restore(hDC,-1) // -1 означает восстановление последнего сохраненного набора атрибутов.
Все объекты, которые создаются во время проигрывания метафайла, удаляются
автоматически (команду DeleteObject использовать не надо).
Предупреждение. Метафайлы принадлежат GDI, а не программе. Они
не удаляются автоматически после завершения программы. Для предотвращения
утечки памяти надо удалять матафайлы после завершения работы с ними
(DeleteMetafile). При этом удаляется лишь копия метафайла в памяти.

16. Сценарий работы с метафайлом (1-й вариант)

1. Создать контекст метафайла и получить его
дескриптор
(CreateMetafile)
2. Выполнить функции рисования
3. Получить дескриптор метафайла
( CloseMetafile )
4. Проиграть метафайл на устройстве
(например, в окне)
5. Сохранить метафайл ( CopyMetaFile
копировать метафайл в файл и получить
дескриптор нового )
6. Удалить метафайл
( DeleteMetafile )

17. Создание метафайла

Создаем новый метафайл в памяти,
рисуем и затем сохраняем в файл
HDC h1= CreateMetaFile( NULL); // контекст метафайла в памяти
// Выполняем функции рисования
hbr=CreateSolidBrush(col);
SelectObject(h1,hbr);
Ellipse(h1,100,100,200,150);
DeleteObject(hbr);
hbr=CreateSolidBrush(0x00FF0000);
SelectObject(h1,hbr);
Rectangle(h1,250,250,300,450);
DeleteObject(hbr);

18. Получаем дескриптор метафайлов

HMETAFILE han, newhan;
han=CloseMetaFile(h1); // закрывает контекст метафайла и
// создает дескриптор метафайла
Рисуем в окне (проигрываем метафайл )
HDC h=GetDC(hWnd);
PlayMetaFile (h,han); // проигрываем метафайл в окне
Сохраняем на диске (копируем метафайл в файл)
newhan = CopyMetaFile (han, L"met111.wmf"); // сохраняем в файл
Если имя файла NULL, то копируется в память. Возвращается
дескриптор нового метафайла.
Удаляем метафайл из памяти
DeleteMetaFile (newhan); - освобождает связанные с ним ресурсы.

19. Сценарий работы с метафайлом (2-й вариант)

1. Получить метафайл из файла (GetMetaFile)
2. Создать контекст метафайла в памяти
(CreateMetaFile)
3. Проиграть метафайл в контексте
(PlayMetaFile)
4. Удалить метафайл (DeleteMetaFile)
5. Функции рисования в контексте
6. Закрыть контекст (CloseMetaFile)
7. Проиграть метафайл в контексте окна
8. Сохранить метафайл на диске
(CopyMetaFile)
9. Удалить метафайл (DeleteMetaFile)

20. Получаем метафайл из файла

Открываем метафайл из файла, проигрываем его
в контексте, рисуем в контексте и сохраняем новый файл
HMETAFILE han, newhan;
han= GetMetaFile( L"met111.wmf"); // создать метафайл из файла
HDC h1= CreateMetaFile( NULL); // контекст метафайла в памяти
PlayMetaFile (h1,han); // Проигрываем метафайл
DeleteMetaFile (han);
hbr= CreateSolidBrush (0x000000FF);
SelectObject (h1,hbr);
Ellipse (h1,250,0,300,200);
DeleteObject(hbr);
han=CloseMetaFile (h1); // Закрываем контекст
PlayMetaFile(h,han); // например, HDC h = GetDC(hWnd)
newhan=CopyMetaFile(han,L"met111.wmf");
DeleteMetaFile(newhan);

21. Сценарий работы с метафайлом (3-й вариант)

1.
2.
3.
4.
Создать контекст метафайла из файла
Рисуем в контексте
Закрыть метафайл и получить дескриптор метафайла
Можно проигрывать, сохранять
Удалить метафайл
HDC h1 = CreateMetaFile (<имя файла>.wmf)
// Рисуем в контексте h1
HMETAFILE han =CloseMetaFile(h1);
DeleteMetaFile(han);
Получается, что рисовать можно прямо в файле (добавить
команды GDI в файл)

22.

void __fastcall TForm1::Button2Click(TObject *Sender)
{
HDC h1 = CreateMetaFile ("metaf1.emf");
HBRUSH br=CreateSolidBrush(RGB(255,0,0));
HBRUSH oldbr=SelectObject(h1,br);
RoundRect(h1,200,250,250,300,10,10);
SelectObject(h1,oldbr);
DeleteObject(br);
HMETAFILE han =CloseMetaFile(h1);
DeleteMetaFile(han);
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
HMETAFILE han, newhan;
han= GetMetaFile( "metaf1.emf");
PlayMetaFile(GetDC(Form1->Handle),han);
newhan=CopyMetaFile(han,"met111.wmf");
DeleteMetaFile(newhan);
}

23. Тема

Клавиатура - одно из основных устройств

24. ВВОД ИНФОРМАЦИИ С КЛАВИАТУРЫ

Windows обеспечивает аппаратно - независимую
поддержку клавиатуры для прикладных программ,
при помощи клавиатурного драйвера.
Драйвер принимает от клавиатуры скэн-коды,
которые передаются в соответствии с
раскладкой символов на ней.
Скэн-код (scan code) - это аппаратно-зависимый
идентификатор клавиши на клавиатуре
(генерируются два скэн-кода, которые
соответствуют нажатию и отпусканию клавиши).

25. Код виртуальной клавиши

Драйвер клавиатуры переводит скэн-код в код виртуальной
клавиши (virtual-key code), то есть в не зависящее от устройства
значение, определяемое Windows, которое идентифицирует
целевую клавишу.
После этого в системную очередь помещается сообщение, которое
включает в себя скэн-код и код виртуальной клавиши.
В конечном итоге сообщения клавиатуры поступают в окно с
фокусом клавиатуры.
Фокус клавиатуры (keyboard focus) - это временное свойство окна.
Окно, которое имеет фокус, принимает все сообщения клавиатуры,
пока фокус не перейдет к другому окну.

26. Фокус ввода – временное свойство окна

С помощью перемещения фокуса клавиатуры система дает
возможность совместно использовать клавиатуру всем окнам на экране.
Программа может вызвать функцию GetFocus, чтобы определить,
какое из ее окон в настоящее время имеет фокус клавиатуры:
HWND GetFocus(void);
Передать фокус одному из окон можно с помощью
HWND SetFocus( HWND);
Если параметр равен 0 – сообщения клавиатуры будут игнорироваться.
Функция SetFocus посылает сообщения WM_KILLFOCUS и
WM_SETFOCUS и делает активным окно, получившее фокус (либо его
родительское окно).
Фокус клавиатуры связан с понятием активного окна (active window - окно
верхнего уровня, с которым пользователь в настоящее время работает).
Окно с фокусом клавиатуры является или активным окном, или его
дочерним окном.

27. Сообщения передачи фокуса ввода

Первым посылается сообщение
WM_KILLFOCUS - окно теряет фокус.
Параметр сообщения wParam является идентификатором окна,
которое должно получить фокус ввода (или NULL).
Например, родительское окно, обрабатывая сообщение
WM_KILLFOCUS, может предотвратить получение фокуса ввода
дочерним окном:
case WM_KILLFOCUS:
if (hwnd == GetParent((HWND) wParam))
SetFocus(hwnd); break;
Вторым посылается сообщение
WM_SETFOCUS - окно получает фокус.
Параметр сообщения wParam является идентификатором окна,
которое теряет фокус ввода (или NULL).

28. Сообщения клавиатуры

WM_KEYDOWN или WM_SYSKEYDOWN - клавиша нажата (в
зависимости от клавиши и была ли эта клавиша нажата в
комбинации с клавишей <Alt>);
WM_KEYUP или WM_SYSKEYUP - клавиша отпущена.
Сообщения с префиксом WM_SYS ( <ALT+клавиша> системные клавиатурные сообщения) редко обрабатываются
приложением (предназначены для Windows и в неизменном виде
передаются функции DefWindowProc).
Обработка системных клавиатурных сообщений обычно сводится к
выбору элементов меню, переключения на другое окно или другое
приложение.

29. Параметры клавиатурных сообщений

сase WM_KEYDOWN:
wsprintf( buf, "lParam: %lx,\n wParam: %lx\n", lParam, wParam);
MessageBox(NULL, buf, "Сообщение WM_KEYDOWN",
MB_OK | MB_ICONINFORMATION);
return DefWindowProc(hWnd, message, wParam, lParam);
break;
Параметр lParam содержит информацию низкого уровня:
0-15 - счетчик повторов (если нажать клавишу и держать ее в нажатом состоянии, несколько
сообщений WM_KEYDOWN и WM_SYSKEYDOWN будут слиты в одно);
16-23 - OEM скан-код клавиши, который генерируется клавиатурным контроллером
(изготовители аппаратуры OEM - Original Equipment Manufacturer могут заложить в своей
клавиатуре различное соответствие скан-кодов и обозначений клавиш);
29 - код контекста (равен 1, если сообщение соответствует комбинации клавиши <Alt> с
любой другой, и 0 в противном случае);
30 - предыдущее состояние клавиши (если перед приходом сообщения клавиша,
соответствующая сообщению, была в нажатом состоянии, этот бит равен 1, если нет - бит
равен 0);
31 - флаг изменения состояния клавиши (если клавиша была нажата, бит равен 0, если
отпущена – 1).

30. Виртуальные коды клавиш

Параметр wParam содержит код виртуальной клавиши,
соответствующий нажатой физической клавише (этот параметр
используется приложениями для идентификации клавиши).
Код виртуальной клавиши не зависит от аппаратной
реализации клавиатуры.
Примеры:
Клавиша “Левый Shift”
lParam=2a0001, wParam=10.
Символьная клавиша ‘w’ lParam=110001, wParam=57.
Многие коды виртуальных клавиш имеют символьные обозначения
с префиксом VK_ (Virtual Key):
VK_LBUTTON, VK_RBUTTON - кнопки мыши (0x1,0x2),
VK_CANCEL - комбинация клавиш <Control + Break> (0x3),

31. Виртуальные коды

VK_BACK - клавиша <Backspace> (0x8),VK_RETURN – клавиша ввода
<Enter> (0xd), VK_SHIFT – клавиша <Shift> (0x10), VK_CONTROL
- клавиша <Ctrl> (0x11), VK_CAPITAL – клавиша <Caps Lock> (0x14),
VK_ESCAPE – клавиша <Esc>(1b),VK_SPACE - клавиша пробела (0x20),
VK_PRIOR, VK_NEXT, VK_END, VK_HOME - клавиши <PgUp>, <PgDn>,
<End>, <Home> (0x21-0x24),
VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN - клавиши перемещения курсора
влево вверх вправо вниз (0x25 - 0x28),
VK_SNAPSHOT - клавиша <PrtSc> (0x2c),VK_INSERT- клавиша <Insert>
(0x2d), VK_DELETE – клавиша <Delete> (0x2e),
VK_NUMPAD0 - VK_NUMPAD9 - цифровые клавиши (0x60-0x69),
VK_F1 - VK_F12 - управляющие клавиши <F1>-< F12> (0x70-0x7b).

32. Символьные клавиши

Клавиши, соответствующие символам, имеют соответствующий
виртуальный код, но у них нет специальных символьных имен.
Используя только коды, невозможно различить строчные и
прописные буквы. Чтобы определить состояния клавиш <Shift>,
<Caps Lock>, <Control> и т.д. необходимо использовать
специальные функции.
При помощи программы установки параметров компьютера
BIOS SETUP пользователь может задать любое произвольное
состояние переключающих клавиш после запуска системы.

33. Проверка состояния клавиш

Функция GetKeyState, вызванная сразу после получения
сообщения, возвращает состояние клавиши на момент извлечения
сообщения из очереди приложения функцией GetMessage:
int WINAPI GetKeyState (int vkey); vkey - код виртуальной клавиши,
состояние которой проверяется (если старший бит равен 1 - клавиша
была нажата)).
Младший бит результата указывает состояние переключения.
Для клавиш <Caps Lock> или <Num Lock> он равен 1, если
клавиша во включенном состоянии.
Например, следующий код проверяет значение переключения клавиши
<Caps Lock>:
int kl= GetKeyState(VK_CAPITAL);
wsprintf( buf, "Клавиша: %x", kl);
SetWindowText(hSt,buf);

34. Состояние клавиш в произвольный момент

Функция GetAsyncKeyState позволяет узнать состояние клавиш
в любой произвольный момент времени:
int WINAPI GetAsyncKeyState (int vkey);
Если старший бит результата равен 1 - указанная клавиша была
нажата в момент вызова функции, если равен 0 - не была.
Младший бит возвращаемого значения установлен в 1, если
указанная клавиша была нажата с момента последнего вызова
функции GetAsyncKeyState.
Если для функции в качестве параметра задать значения VK_LBUTTON
или VK_RBUTTON, можно узнать состояние клавиш мыши.
Функция GetKeyboardState позволяет определить состояние всех
клавиш одновременно:
bool GetKeyboardState (PBYTE lpKeyState);
Параметр lpbKeyState этой функции - дальний указатель на
массив из 256 байт. После вызова функции этот массив будет
заполнен информацией о состоянии всех виртуальных клавиш
в момент генерации клавиатурного сообщения (аналогично функции
GetKeyState).

35. Примеры получения состояния клавиш

1. Получение состояния клавиш клавиатуры
BYTE kbrd[256];
GetKeyboardState (kbrd);
wsprintf( buf,"kbrd= [VK_CAPITAL], %x", kbrd [VK_CAPITAL] );
MessageBox(NULL, buf, "Функция GetKeyboardState",
MB_OK | MB_ICONINFORMATION);
return DefWindowProc(hWnd, message, wParam, lParam);
2. Изменение состояния клавиатуры
После вызова функции GetKeyboardState можно изменить
содержимое массива и вызвать функцию SetKeyboardState
для изменения состояния клавиатуры.
Например, можно инвертировать текущее состояние клавиши
<NumLock> и установить новое состояние клавиш:
GetKeyboardState(kbrd); kbrd [VK_NUMLOCK] ^= 1;
SetKeyboardState(kbrd);

36. Наименование клавиш

Функция GetKeyNameText возвращает для заданного кода виртуальной
клавиши название соответствующей клавиши в виде текстовой строки
(эти названия определены в драйвере клавиатуры):
int WINAPI GetKeyNameText(LONG lParam, LPSTR lpszBuffer, int cbMaxKey);
Параметр lParam определяет клавишу в формате lParam клавиатурного сообщения
(удобно использовать значение lParam, полученное функцией окна вместе с
клавиатурным сообщением WM_KEYDOWN, WM_SYSKEYDOWN и т.д.).
Параметр lpszBuffer - указатель на буфер, в котором вернется название клавиши,
cbMaxKey содержит длину буфера уменьшенную на 1.
Примеры:
1. Удобно использовать в обработчике сообщения WM_KEYDOWN:
GetKeyNameText(lParam, buf, 79);
MessageBox(NULL, buf, "Название клавиши", MB_OK | MB_ICONINFORMATION);
2. Код вернет название клавиши «Enter»:
GetKeyNameText(0x1c0001, buf, 79);
MessageBox(NULL, buf, "Название клавиши", MB_OK | B_ICONINFORMATION);

37. Символьные сообщения

Сообщение WM_CHAR – нажатие символьной клавиши
Для работы с обычными символьными клавишами рассмотренные
ранее сообщения не очень удобны, так как необходимо различать
прописные и строчные буквы, учитывать особенности работы
с национальными алфавитами.
В цикл обработки сообщений включена функция
TranslateMessage (&msg);
Эта функция преобразует клавиатурные сообщения
WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP
в символьные сообщения WM_CHAR, WM_SYSCHAR.
WM_CHAR и WM_SYSCHAR помещаются в очередь сообщений
(оригинальные клавиатурные сообщения также остаются в очереди).

38. Параметры символьных сообщений

Значение параметра lParam остается прежним, а параметр wParam содержит код
символа, соответствующего нажатой клавише (в стандарте ANSI, принятом в
Windows для представления символов).
Код символа определяется функцией TranslateMessage с учетом состояния клавиш
<Control>, <Shift>, <Alt>, <Caps Lock> и используемого языка.
case WM_CHAR:
wsprintf( buf, "lParam: %lx,\n wParam %lx\n", lParam, wParam);
MessageBox(NULL, buf, "Сообщение WM_CHAR", MB_OK | MB_ICONINFORMATION);
Например, код для символьной клавиши ‘w’ выдаст lParam=110001, а wParam может
иметь различные значения.
Печать символа: wsprintf( buf, "Символ: %c",wParam);
MessageBox(NULL, buf,"Сообщение WM_CHAR", MB_OK | MB_ICONINFORMATION);
Наиболее используемым является сообщение WM_CHAR, которое передается
функции окна в результате трансляции сообщения WM_KEYDOWN. Сообщение
WM_SYSCHAR образуется из сообщения WM_SYSKEYDOWN и обычно
приложением не обрабатывается (передается функции DefWindowProc).

39. Задачи для самопроверки

Путем ряда программных экспериментов определить, какие клавиатурные
сообщения и когда срабатывают (WM_KEYDOWN, WM_SYSKEYDOWN,
WM_KEYUP и WM_SYSKEYUP), распечатать и пояснить значения параметров
сообщений для различных клавиш.
Для сообщения WM_CHAR определить (с помощью ряда программных
экспериментов) какие значения может принимать параметр wParam для
символьной клавиши ‘s’. Определив также название данной символьной
клавиши, убедиться, что оно не зависит от раскладки клавиатуры.
После нажатия символа ‘q’ (строчная буква q) пользователем, включить режим
CAPS LOCK, чтобы все остальные буквы были большими.
Создать в главном окне кнопку нажатия Button и поле для ввода Edit.
Убедившись, что фокус ввода имеют теперь только элементы управления,
определить на какую клавиатурную клавишу срабатывает кнопка Button.
По щелчку левой кнопкой мыши (в клиентской области окна) вернуть окну фокус
ввода. Все символьные сообщения WM_CHAR, полученные окном, пересылать
в поле Edit.
Сделать так, чтобы дочерние окна никогда не получали фокус ввода.

40.

• Все!!!
English     Русский Rules