![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
![]() Вопрос, как отрисовать меню с нуля?
Проблема в том, что помимо стандартного отрисования иконок меню, изврашенских рамок для выделения и прочего столкнулся вот с чем: Если отрисовать полностью фон всего меню то иконки, чеки, текст и даже сепараторы не отрисовываюся ... беда... Код:
... function WindowProc(Window: HWND; aMessage, wParam, lParam: LongInt): LongInt; stdcall; Begin case AMessage of ... WM_DRAWITEM: ... //Рисуем фон меню drawMenuWnd(lpdis.hDC); drawMenuWnd(lpdis.hDC) <- Функция полностью перересовывает фон меню, но она как бы закрашивает все остальное, если убрать эту строчку, то всё отрисовывается но на стандарном фоне. Ранее рассматривали пересовку меню, но там фон не трогали... menu.zip Програмистами не рождаются, ими становятся! |
#2
|
||||
|
||||
![]() Всем спасибо за ответы =) разобрался с этим...
Просто не нужно рисовать весь фон, достаточно только 3-х пиксельной рамки, а все остальное зарисовывается невыделенными пунктами меню и сепараторами. Теперь возник другой вопрос... Почему вылетает RunTime Error 216? Код:
... AppendMenu(PopupMenu1, MF_SEPARATOR or MF_OWNERDRAW, 0, nil); ... А Без MF_OWNERDRAW работает нормально. Код:
... AppendMenu(PopupMenu1, MF_SEPARATOR , 0, nil); ... Ну и собсно проблема -Как Сепаратору присвоить стиль MF_OWNERDRAW для перерисовки и Как его перерисовать вручную? Програмистами не рождаются, ими становятся! Последний раз редактировалось SCrat.ORS, 14.07.2010 в 16:36. |
#3
|
||||
|
||||
![]() Код:
AppendMenu(PopupMenu1, MF_SEPARATOR or MF_OWNERDRAW, 0, ''); ЗЫ : Как весело,.. сам спрашиваю, сам отвечаю ![]() Програмистами не рождаются, ими становятся! |
#4
|
||||
|
||||
![]() BOOL WINAPI AppendMenu(
__in HMENU hMenu, __in UINT uFlags, __in UINT_PTR uIDNewItem, __in_opt LPCTSTR lpNewItem ); lpNewItem [in, optional] LPCTSTR The content of the new menu item. The interpretation of lpNewItem depends on whether the uFlags parameter includes the following values. Value Meaning MF_BITMAP 0x00000004L Contains a bitmap handle. MF_OWNERDRAW 0x00000100L Contains an application-supplied value that can be used to maintain additional data related to the menu item. The value is in the itemData member of the structure pointed to by the lParam parameter of the WM_MEASUREITEM or WM_DRAWITEM message sent when the menu is created or its appearance is updated. MF_STRING 0x00000000L Contains a pointer to a null-terminated string. а для сепаратора используйт флаг MF_SEPARATOR вместо MF_OWNERDRAW |
#5
|
||||
|
||||
![]() Цитата:
MF_SEPARATOR - Это флаг Сепаратора, a флаг MF_OWNERDRAW - позволяет вручную отрисовать элемент меню в сообщении WM_DRAWITEM, и в моём случае необходимо использование обоих флагов Код:
MF_SEPARATOR or MF_OWNERDRAW Програмистами не рождаются, ими становятся! |
#6
|
||||
|
||||
![]() ну если очень хочется, то можно:
Код:
BOOL DrawEdge( HDC hdc, // handle to device context LPRECT qrc, // pointer to rectangle coordinates UINT edge, // type of inner and outer edge to draw UINT grfFlags // type of border ); |