Формирование и использование меню. Краткая теория, страница 6

Возвращаемое значение содержит ссылку на копию системного меню или его оригинал.

Так, для добавления в системное меню команды о разработчике приложения (About) можно воспользоваться следующим фрагментом:

Туре TMyMainWindow=object(TWindow)

.....

Procedure SysComm(varmsg:TMessage);

virtual wm_Flrst+wm_SysCommand;

End;

Procedure TMyMainWindow.SysComm;

Var

TempDir: Array[0..fsDirectory] of Char;

Begin

Case msg.wParam of

id_about :

Application^. ExecDlalog(New(Paboutdlg,

Init(@Self, 'pmabout')));

id_help:

begin

WinHelp(hWindow, 'MyHelp', HELP_INDEX, 0);

end;

else defwndproc(msg)

end

End;

Procedure TMyMainWindow.SetupWindow;

Var

AsMenu: HMenu;

Begin

TWindow.SetupWindow;

AsMenu := GetSystemMenu(hWindow, false);

AppendMenu(AsMenu, mf_SEPARATOR, 0, NIL);

AppendMenu(AsMenu, mf_BYCOMMAND or

mf_STRING, id_about, '&About ...');

AppendMenu(AsMenu, mf_SEPARATOR, 0, NIL);

AppendMenu(AsMenu, mf_BYCOMMAND or mf_STRING, id_Help, '&Help');

Следует обратить внимание на организацию обработки команд системного меню. Выбор команды системного меню приводит к посылке сообщения wm_SysCommand вместо сообщения wm_Command. Это следует учитывать при организации обработки таких команд. Данный фрагмент ориентирован на обработку сообщений системного меню в программе, использующей библиотеку ObjectWindows. Обратите внимание на обязательное обращение к функции DefWndProc в обработчике сообщения. В противном случае нарушится нормальное функционирование системного меню.

Плавающее меню

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

Function TrackPopupMenu(Menu: HMenu; Flags: Word; X, Y, Reserved: Integer; Wnd: HWnd; Reserved: Pointer): Bool;

Menu - ссылка на созданное подменю;

Flags не используется и должен быть 0;

X и Y - координаты левого верхнего угла меню в экранных координатах;

Reserved устанавливайте в 0;

Wnd - ссылка на окно, использующее меню;

Reserved устанавливайте в Nil.

Функция возвращает истинное значение, если меню успешно ак-тивированно, в противном случае - ложное.

После использования меню его можно уничтожить. Для размещения меню в окне следует воспользоваться функцией ClientToScreen, которая переводит экранные координаты в оконные.

Задания:

1. Создать окно, содержащее заголовок, произвольную иконку, кнопки максимизации, минимизации, закрытия окна.

2. При помощи редактора ресурсов в окне создать строчное и всплывающие меню, при этом придерживаться следующих требований:

  • В подменю первого пункта меню создать определенную иерархию, например:

                                      Existing Document

FileèOpen

New Document

  • Во втором пункте меню установить различные состояния команд меню (отмена команды меню, отмена активности, восстановление команды).
  • Третий пункт создать с возможностью установки и удаления отметки команды меню.
  • Установить в меню разрыв, например:

File

Edit

View

Help

  • В меню реализовать возможность использования растровых графических изображений в качестве команд меню

3. Представить отчет о проделанной работе.

Контрольные вопросы:

  1. перечислите способы создания и подключения меню, раскройте их?
  2. что такое ресурсы?
  3. раскройте достоинства ресурсов?
  4. из каких частей состоит шаблон меню?
  5. какие действия позволяет выполнять функция EnableMenuItem?
  6. для чего и каким образом можно использовать графические изображения при создании меню?