11.18.4.1 - Установка флажков при рисовании пользователем пунктов меню

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

Вы можете использовать функцию InsertMenuItem или SetMenuItemInfo, чтобы определить нарисованный пользователем пункт меню. Используйте InsertMenuItem, чтобы вставить новый пункт меню в заданной позиции в строке меню или меню. Используйте SetMenuItemInfo, чтобы изменить состав меню.

При вызове этих двух функций, Вы должны определить адрес структуры MENUITEMINFO, которая описывает свойства нового пункта меню или свойства, которые Вы желаете изменить для существующего пункта меню. Чтобы сделать пункт меню, пунктом нарисованным пользователем, определите значение MIIM_TYPE для члена fMask и значение MFT_OWNERDRAW для члена fType структуры.

Устанавливая соответствующие члены структуры MENUITEMINFO, Вы можете связывать определяемое программой значение, которое называется данными пункта (item data), с каждым пунктом меню. Поступая таким образом, определите значение MIIM_DATA для члена fMask и определяемого программой значения для члена dwItemData структуры.

Вы можете использовать данные пункта с любым типом пункта меню, но это особенно полезно для нарисованных пользователем пунктов. Например, предположим, что структура содержит информацию, используемую, чтобы нарисовать пункт меню. Прикладная программа могла бы использовать эти данные пункта для пункта меню, чтобы сохранить указатель на структуру. Данные пункта пересылаются в окно владельца меню с сообщениями WM_DRAWITEM и WM_MEASUREITEM. Чтобы в любое время извлечь данные о пункте для меню, используйте функцию GetMenuItemInfo.

Прикладные программы, написанные в более ранних версиях Windows, могут продолжать вызывать функции AppendMenu, InsertMenu или ModifyMenu, чтобы назначить флажок MF_OWNERDRAW нарисованному пользователем пункту меню.

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


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Владимир Соковиков - 07.10.2002