Владимир Волков - Программирование для карманных компьютеров
? Стиль SS_CENTERIMAGE создает окно с изображением, центр которого постоянен. Если изображение больше, чем окно, то границы раздвигаются, а центр остается на месте. Если изображение меньше границ окна, то стороны остаются на месте, а незаполненная часть окна закрашивается цветом верхней левой точки изображения.
? Стиль SS_IC0N указывает, что в окне будет отображена пиктограмма, которая хранится в файле ресурсов.
? Стиль SSJ.EFT создает прямоугольник с текстом, прижатым влево.
? Стиль SS_LEFTNOWORDWRAP создает прямоугольник с текстом, прижатым влево, но без переноса. Не уместившийся в прямоугольник текст будет обрезан.
? Стиль SS_NOPREFIX запрещает интерпретацию символа амперсанда (&) как обозначения горячих клавиш.
? Стиль SS_N0TIFY заставляет орган управления оповещать родительское окно, о том, что пользователь щелкнул на элементе.
? Стиль SS_RIGHT создает прямоугольник с текстом, прижатым вправо.
Event-Driven Programming и Window MessagesКаждое окно в Windows умеет посылать и принимать сообщения Windows. На этом построена вся программная модель в линейке операционных систем Windows, включая Windows CE. Когда пользователь щелкает на элементе управления, элемент управления генерирует сообщение. Родительское окно принимает это сообщение и помещает его в очередь сообщений. Оконная процедура занимается тем, что непрерывно разбирает очередь сообщений, и если на сообщение предусмотрена какая-то реакция, эта процедура вызывает функцию, которая соответствует данному сообщению.
Сообщения генерируются РЅРµ только РїСЂРё щелчке РЅР° элементе, РЅРѕ Рё РїСЂРё РґСЂСѓРіРёС… событиях, которые СЃ РЅРёРј РїСЂРѕРёСЃС…РѕРґСЏС‚. Рто может быть изменение размера, перерисовка, выбор элемента РІ СЃРїРёСЃРєРµ или срабатывание таймера. Приложение занимается тем, что реагирует РЅР° эти события. Поэтому модель программирования РІ Windows называется Event-Driven Programming (программирование РїРѕ событиям).
Поскольку каждое окно в Windows может принимать сообщения, то любой элемент может не только посылать сообщения в родительское окно, но и сам реагировать на присланные ему сообщения. При последующей разработке примера
можно увидеть, как приложение может реагировать на событие «пользователь щелкнул на кнопке» и как сами кнопки реагируют на присланные им сообщения.
Упражнение 4.3 (продолжение)
Для того чтобы РѕРєРЅРѕ приняло сообщение, РѕРЅРѕ должно получить сообщение РІ очередь сообщений. Операцию доставки сообщения РІ очередь обеспечивает операционная система. Затем, перебирая очередь сообщений, РѕРєРЅРѕ должно идентифицировать полученное сообщение Рё обеспечить соответствующую реакцию. Перебор очереди сообщений обеспечивает цикл выборки сообщений. Р’ РєРѕРґРµ РѕРЅ описан внутри РѕСЃРЅРѕРІРЅРѕР№ функции WinMain Рё помечен комментарием // Main message loop:. Ртот РєРѕРґ автоматически создается средой разработки. Рдентификация выбранного РёР· СЃРїРёСЃРєР° сообщения РїСЂРѕРёСЃС…РѕРґРёС‚ РІ РѕРєРѕРЅРЅРѕР№ процедуре WndProc РїСЂРё помощи переключателя switch. Оконная процедура идентифицирует тип сообщения (например, WM_COMMAND) Рё его источник. Рсточник сообщения распознается РїРѕ идентификатору, который был присвоен каждой РєРЅРѕРїРєРµ РІРѕ время ее создания (параметр hMenu). РљРѕРґ соответствующей ветки case переключателя switch определяет действия, которые Р±СѓРґСѓС‚ предприняты РїСЂРё поступлении данного сообщения.
Чтобы послать сообщение окну, надо вызвать функцию SendMessage. Первым параметром в эту функцию передается идентификатор окна, которому посылается сообщение. Значит, если нужно послать сообщение окну, то следует получить его идентификатор и поместить его в соответствующую переменную, которую можно использовать при вызове функции.
8. Добавить в начало модуля, туда, где находится блок кода, обозначенный комментарием как // Global Variables: еще одну строку кода, объявляющую переменную для хранения идентификатора первой кнопки:HWNDg_hwndB1;
9. Обеспечить помещение значения в этот идентификатор. Для этого нужно изменить вызов функции создания первой кнопки, как показано ниже.
g_hwndB1=CreateWindow(TEXT (В«BUTTONВ»), TEXT (В«ButtonВ»),
BS_PUSHBUTTON | BS_NOTIFY | WS_VISIBLE | WS_CHILD,
10, 20, 100,25, hWnd, (HMENU)200, g_hInst, NULL);10. Теперь первая кнопка в левом столбце может принимать сообщения. Нужно обеспечить, обработку сообщений, посланных первой кнопкой в правом столбце. Параметр hMenu этой кнопки получил значение 207, значит, нужно обеспечить «узнавание» этого значения в переключателе switch. В функции WndProc следует отыскать блок case WM_COMMAND: (именно этот тип сообщений посылают кнопки и пункты меню, когда пользователь щелкает на них) и изменить его так, как показано в листинге 4.16. Листинг 4.16
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
//Начало добавленного кода case 200:
case 200:
SendMessage (g_hwndB1, WM_SETTEXT, 0, (LPARAM)(LPSTR)L" Svoy text");
break;
case 207:
SendMessage (g_hwndB1, WM_SETTEXT, 0, (LPARAM)(LPSTR)L" Text ot 107");
break;
case 208:
MessageBox (hWnd, L" РС‚o тело сообщения!", L" A это заголовок", 0);
break;
//Окончание добавленного кода
case IDM_HELP_ABOUT: