Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 129

/ вопрос открыт /

Уважаемые эксперты!
Возникла проблема с цветом меню. Само меню вручную перерисовывается через OnDrawItem, однако вся оставшаяся область, которая занимает окно, остаётся серая. Это сильно выбивается из общего оформления программы. Подробнее - см. скриншот:
(файл удалён)
Есть ли выходы из этой ситуации? Теоретически, можно программно изменить системные настройки оформления и поменять цвет на нужный, а при выходе восстановить тот, что был до этого, но этот вариант плох - все приложения временно изменят цвет меню. Может быть, кто-то встречался с такой проблемой? Как перекрасить эту область? Через Canvas доступа к ней нет.
Заранее благодарю за ответы.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Dron Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Dron (статус: Студент)
Вопрос отправлен: 7 октября 2006, 21:27
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Alex Van Glukhman

Здравствуйте, Dron!
К сожалению в Delphi данная проблема решается только ручками с детальной прорисовкой меню, либо созданием нового компонента что практически по затратам времени и сил одинаково.
Либо используйте сторонние компоненты.

Ответ отправил: Alex Van Glukhman (статус: 7-ой класс)
Время отправки: 11 октября 2006, 17:49
Оценка за ответ: 1

Комментарий к оценке: Вы вопрос вообще внимательно читали?
"Само меню вручную перерисовывается через OnDrawItem" - какая ещё прорисовка?
Сторонние - дайте пример хотя бы одного.

Ответ #2. Отвечает эксперт: Yurchik

Здравствуйте Dron и уважаемые эксперты!

Позвольте не согласиться с мнением Alex Van Glukhman. Предлагаю такой вариант. В примере цвет фона главного меню заливается желтым цветом.
И свой компонент, потенциально коммерческий ))), писать не надо.
Английский у меня хромает), так что если комментарии непонятны, пишите. С радостью отвечу

Приложение:
  1. type
  2. TForm1 = class(TForm)
  3. ...
  4. private
  5. MenuBarBackground: TBrush;
  6. MenuBarBackgroundOld: HBrush;
  7. ...
  8. end;
  9.  
  10. ...
  11.  
  12. procedure TForm1.FormCreate(Sender: TObject);
  13. var
  14. lpcmi: TMenuInfo;
  15. begin
  16. // Initialization
  17. MenuBarBackground:= TBrush.Create;
  18. MenuBarBackground.Color:= clYellow;
  19.  
  20. // Retrieving info about menu...
  21. lpcmi.cbSize:= SizeOf(TMenuInfo);
  22. lpcmi.fMask:= MIM_BACKGROUND;
  23. GetMenuInfo(MainMenu1.Handle, lpcmi);
  24.  
  25. // Save parameters we want to change...
  26. MenuBarBackgroundOld:= lpcmi.hbrBack;
  27.  
  28. // Applying new parameters...
  29. lpcmi.fMask:= MIM_BACKGROUND or MIM_APPLYTOSUBMENUS;
  30. lpcmi.hbrBack:= MenuBarBackground.Handle;
  31. SetMenuInfo(MainMenu1.Handle, lpcmi);
  32.  
  33. // Redraw menu
  34. // It is not nessesary to do this in OnCreate event,
  35. // because after OnCreate has been called, all elements will redraw
  36. //DrawMenuBar(Handle);
  37. end;
  38.  
  39. procedure TForm1.FormDestroy(Sender: TObject);
  40. var
  41. lpcmi: TMenuInfo;
  42. begin
  43. // Restore changed parameters, so OS can free allocated resources correctly
  44. ZeroMemory(@lpcmi, SizeOf(TMenuInfo));
  45. lpcmi.cbSize:= SizeOf(TMenuInfo);
  46. lpcmi.fMask:= MIM_BACKGROUND;
  47. lpcmi.hbrBack:= MenuBarBackgroundOld;
  48. SetMenuInfo(MainMenu1.Handle, lpcmi);
  49.  
  50. // Free our Brush...
  51. MenuBarBackground.Free;
  52. end;
  53.  


Ответ отправил: Yurchik (статус: 3-ий класс)
Время отправки: 13 октября 2006, 02:55
Оценка за ответ: 5

Комментарий к оценке: Большое спасибо!

Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 15 октября 2006, 13:36; участников в обсуждении: 3.
Alex Van Glukhman

Alex Van Glukhman (статус: 7-ой класс), 12 октября 2006, 13:59 [#1]:

Именно что читал! вы меняете цвет в MenuItem, что как раз возможно по OnDrawItem, поэтому создавайте свой собственный обработчик например OnDrawMenu, только придётся писать тот же код с прорисовкой о чём я писал. Ну невозможно такое стандартными средствами Delphi.
Вообще то для того чтобы просмотреть свойства типа не прибегая к помощи HELP, существуют Source файлы - которые вы подключаете в разделе uses. Чтобы не задавать больше глупых вопросов и не флеймить - посмотрите определение типа TMainMenu и наверное всё станет понятным
Alex Van Glukhman

Alex Van Glukhman (статус: 7-ой класс), 12 октября 2006, 14:01 [#2]:

А насчёт компонентов - Любой поисковик -> Search
Dron

Dron (статус: Студент), 12 октября 2006, 14:57 [#3]:

> Чтобы не задавать больше глупых вопросов и не
> флеймить - посмотрите определение типа
> TMainMenu и наверное всё станет понятным
А вам рекомендую не давать ответов от безвыходности.
JvxMainMenu построен на основе стандартного MainMenu, но доступ ко всей канве намертво заблокирован и рисовать разрешается только в событии OnDrawItem().
> А насчёт компонентов - Любой поисковик -> Search
Удивительно новый способ!
С уважением.
Alex Van Glukhman

Alex Van Glukhman (статус: 7-ой класс), 12 октября 2006, 18:03 [#4]:

Во-первых я что то не слышал что JvxMainMenu является стандартным компонентом Borland.
Во-вторых о безвыходности я не говорил - мне что надо ручками написать и выложить на всеобщее обозрение как это делается? Так простите - это будет мой собственный компонент имеющий право на коммерческое существование.
В-третьих - что значит доступ заблокирован - отсутствует Property Canvas - или оно расположено в разделе private, protected или вообще исходного кода для компонента нет. И насколько я помню событие OnDrawItem определяет событие для Item TMainMenu поэтому и перерисовываем только итемы а не всю строку.

А теперь совет: почитайте о создании компонентов -> возьмите за исходный код определение TMainMenu и добавьте свойства Canvas и методы для его прорисовки и изменения а также Event по которому будет происходить обработка - удачи!!!
Dron

Dron (статус: Студент), 13 октября 2006, 13:24 [#5]:

А что такое JediVCL вы тоже не знаете? А зря. Вот этот компонент как раз оттуда, но создан он на базе TMainMenu.
> мне что надо ручками написать и выложить на всеобщее обозрение как это делается?
Дык вас никто не заставляет это делать и вообще отвечать на вопрос! А ежели более дельных советов дать не можете, то лучше вообще промолчать и проигнорировать вопрос.
>что значит доступ заблокирован - отсутствует Property Canvas - или оно расположено в разделе private, protected или вообще исходного кода для компонента нет
Свойство присутствует, но любое обращение к нему не из установленного события приводит к критической ошибке. Исходник слишком большой, да и править там что-либо крайне нежелательно.
С уважением.
Dron

Dron (статус: Студент), 14 октября 2006, 21:56 [#6]:

Yurchik: по правде говоря, на момент выставления оценки способ ещё не испробовал - просто случайно заметил, что через 10 минут срок действия вопроса закончится и оценку выставить не удастся. Были сомнения... Но теперь всё готово - получилось! Большое спасибо! Что бы я без Вас делал... :-)
С уважением.
Yurchik

Yurchik (статус: 3-ий класс), 15 октября 2006, 13:36 [#7]:

Всегда пожалуйста! Был рад помочь ;)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:29
Выполнено за 0.03 сек.