WM_MEASUREITEM и меню
Проблема в следующем: Имеется меню с флагом MFT_OWNERDRAW для всех пунктов меню (WinAPI позволяет изменять только отдельные пункты в отличии от VCL). Меняю Caption у одного из пунктов. Изменение провожу через функции GetMenuItemInfo, SetMenuItemInfo. Судя по справке после вызова последней функции система автоматически должна перестроить меню, но так происходит только в WINXP, в Win98 сообщение WM_MEASUREITEM больше не вызывается. Вызываю его принудительно для всех пунктов, но результат нулевой. Все бы ничего, но изменяемые строки зачастуе длиннее и не помещаются в ширину меню. Как все-таки заставить систему пересчитать всю менюшку.
MFT_OWNERDRAW:
Assigns responsibility for drawing the menu item to the window that owns the menu. The window receives a WM_MEASUREITEM message before the menu is displayed for the first time, and a WM_DRAWITEM message whenever the appearance of the menu item must be updated. If this value is specified, the dwTypeData member contains an application-defined 32-bit value.
Вам тут надо просто обрабатывать WM_MEASUREITEM и WM_DRAWITEM. Как я понимаю WM_DRAWITEM вам будет приходить каждый раз, когда будет показываться менюшка.
Цитата: leich
У вас подход не правильный:
...
Вам тут надо просто обрабатывать WM_MEASUREITEM и WM_DRAWITEM. Как я понимаю WM_DRAWITEM вам будет приходить каждый раз, когда будет показываться менюшка.
...
Вам тут надо просто обрабатывать WM_MEASUREITEM и WM_DRAWITEM. Как я понимаю WM_DRAWITEM вам будет приходить каждый раз, когда будет показываться менюшка.
Естественно эти сообщения обрабатывются, но как я писал, при смене заголовка у итема не пересчитывается размер менюшки, т.е. бльше не вызывается WM_MEASUREITEM. И как я также сообщал это глюк происходит только в Win98.
DrawMenuBar вы пробовали уже наверное?
Кто его знает, можно или нет вызывать принудительно. Система ведь вызывает. Ну а DrawMenuBar конечно же вызывал.
Да система вызывает тока когда ей надо. Притом она с параметрами вызывает. А пересоздать не пробовали?
Возможно для Win98 так и придется поступить.