Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций Часть II.doc
Скачиваний:
14
Добавлен:
20.11.2018
Размер:
1.48 Mб
Скачать

4.6.2. Сообщения о меню в строке состояний

Строку состояния часто используют для выдачи уведомительных со­общений о строках и разделах меню в процессе перемещения курсора по меню.

В процессе перемещения по строкам меню функция окна, к которому подключено меню, получает сообщение WM_MENUSELECT. При этом младшее слово napаметpa wParam равно идентификатору Команды или позиции (если при выборе этой строки отображается временное меню) строки. Параметр lParam содержит дескриптор меню, по которому перемещается курсор.

Воспользуемся этим для выдачи сообщений в процессе перемещения по строкам меню.

Задача. Предположим, что приложение имеет динамическое меню. В процессе перемещения по строкам меню сообщать о разделе глав­ного меню и о той строке, над которой находится курсор.

Листинг . Сообщения о меню в строке состояния (фрагмент программы)

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg,

WPARAM wParam, LPARAM lParam)

{

static HWND hStatus;

static int pParts[2];

static short cx;

switch (msg) {

case WM_SIZE:

{ MoveWindow(hStatas,0,M,0,TRUE);

cx=LOWORD(IParam);

pParts[0]=cx/2;

pParts[1]=cx;

SendMessage(hStatus, SB_SETPARTS,2,(LPARAM)pParts);

return O;

}

case WM_CREATE:

{

hStatus=CreateStatusWindow(WS_CHILD | WS_VISIBLE, “Готаво”, hwnd, ID_STATUS); retum 0;

}

case WM_MENUSELECT: {

if ((HMENU)lParam = =hMainMenu)

{ switch (LOWORD(wParam))

{ case 0:

SendMessage(hStatus, SB_SETTEXT,0,

(LONG)"Oткрыть/закрыть документ или выход");

SendMessage(hStatus, SB_SETTEXT,1, NULL);

retum 0;

case1:

SendMessage(hStatus, SB_SETTEXT,0,

(LONG)"Haйти и/или заменить фрагмент");

SendMessage(hStatus, SB_SETTEXT,1, NULL);

retum 0;

case2:

SendMessage(hStatus, SB_SETTEXT,0,

(LONG)"Cмeнa способа отображения документа");

SendMessage(hStatus, SB_SETTEXT,1, NULL);

return 0;

} }

switch(LOWORD(wParam)) {

case CM_FILE_OPEN:

{ SendMessage(nStatus,SB_SETTEXT,1, (LONG)"Открыть новый документ");

return 0;

}

case CM_FILE_SAVE:

{ SendMessage(hStatus,SB_SETTEXT,1,(LONG)"3aкрыть текущий документ");

return 0;

}

case CM_EDIT_FIND:

{ SendMessage(nStatus,SB_SETTEXT,1,

(LONG)”Haйти фрагмент no выделенному образцу");

return O;

}

case CM_FILE_QUIT:

{ SendMessage(hStatus,SB_SETTEXT,1,(LONG)"Завершить работу приложения");

return 0;

}

} return 0;

Рассмотрим основные моменты фрагмента:

1. Обработка сообщения WM_MENUSELECT состоит из трех частей.

1.1. Отдельно обрабатывают перемещение по названиям разделов главного меню. Если параметр lParam равен дескриптору глав­ного меню, то определяют значение позиции курсора. Это зна­чение содержится в LOWORD(wParam), если строка связана с разделом меню. Мы знаем, какой раздел соответствует каждой позиции. Например, в первой позиции (ей соответствует LOWORD (wParam)=0) находится раздел "Файл". В этом случае в первой части строки состояния отображают текст "От­крыть/закрыть документ или выход":

SendMessage{ hStatus, SB_SETTEXT, 0,

(LONG)"Oткрыть/3aкрыть документ или выход");

и стирают текст во второй части строки состояния:

SendMessage( hStatus, SB_SETTEXT, 1, NULL);

Точно так же обрабатывают другие позиции курсора в главном ме­ню. Если строки временных меню указывают на разделы меню, то для них также нужно предусмотреть обработку перемещения no по­зициям. Обратите внимание, что условный оператор

if ((HMENU)lParam-=hMainMenu)

{ switch (LOWORD{wParam))

{ case 0:

. . .

}

}

завершает обработку сообщения оператором возврата, только

если курсор установлен на строке раздела меню. То есть не все строки меню с дескриптором lParam должны указывать на раз­делы меню.

1.2. Здесь мы оказываемся в том случае, если младшее слово пара­метра wParam может быть равно идентификатору команды стро­ки меню. Тогда достаточно определить этот идентификатор и послать соответствующий текст сообщения во вторую часть строки состояния. Например, если курсор находится над строкой "Открыть" раздела "Файл", то во второй часта строки состояния окажется текст "Открыть новый документ":

SendMessage(hStatus,SB_SETTEXT,1, (LONG)"Oткрыть новый документ*);

Точно так же поступают для других идентификаторов команд.

1.3. Обработку завершают возвратом значения 0.

После выбора строки меню содержание частей строки со­стояния остается таким, каким оно было в момент выбора. То есть стро­ка состояния напоминает о последней выбранной команде меню.