Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.07.2010, 14:58
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию Рисуем Меню своими руками на WinApi

Вопрос, как отрисовать меню с нуля?
Проблема в том, что помимо стандартного отрисования иконок меню, изврашенских рамок для выделения и прочего столкнулся вот с чем:
Если отрисовать полностью фон всего меню то иконки, чеки, текст и даже сепараторы не отрисовываюся ... беда...

Код:
...
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  
Старый 14.07.2010, 16:22
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

Всем спасибо за ответы =) разобрался с этим...
Просто не нужно рисовать весь фон, достаточно только 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  
Старый 14.07.2010, 19:05
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

Код:
AppendMenu(PopupMenu1, MF_SEPARATOR or MF_OWNERDRAW, 0, '');
Вот .. убрал nil Ошибка исчезла... как же отрисовать Сепаратор теперь в WM_DRAWITEM?
ЗЫ : Как весело,.. сам спрашиваю, сам отвечаю спасибо всем за помощь ...
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием
  #4  
Старый 14.07.2010, 20:27
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

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  
Старый 14.07.2010, 21:58
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

Цитата:
Сообщение от NumLock
а для сепаратора используйт флаг MF_SEPARATOR вместо MF_OWNERDRAW

MF_SEPARATOR - Это флаг Сепаратора, a флаг MF_OWNERDRAW - позволяет вручную отрисовать элемент меню в сообщении WM_DRAWITEM, и в моём случае необходимо использование обоих флагов
Код:
MF_SEPARATOR or MF_OWNERDRAW
Но с этим я уже разобрался теперь мне нужно понять как отрисовать вручную сепаратор в WM_DRAWITEM, Как выделенный пункт меню отрисовывать - понятно, Не выделенный тоже понятно, CHECK тоже понятно... Иконки понятно, НО вот как отрисовать сам Сепаратор?
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием
  #6  
Старый 14.07.2010, 23:06
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну если очень хочется, то можно:
Код:
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
   );	
к примеру
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:04.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025