? Стиль 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;
//Окончание добавленного кода
Читать дальше
Конец ознакомительного отрывка
Купить книгу