|
Вопрос # 129/ вопрос открыт / |
|
Уважаемые эксперты!
Возникла проблема с цветом меню. Само меню вручную перерисовывается через OnDrawItem, однако вся оставшаяся область, которая занимает окно, остаётся серая. Это сильно выбивается из общего оформления программы. Подробнее - см. скриншот:
(файл удалён)
Есть ли выходы из этой ситуации? Теоретически, можно программно изменить системные настройки оформления и поменять цвет на нужный, а при выходе восстановить тот, что был до этого, но этот вариант плох - все приложения временно изменят цвет меню. Может быть, кто-то встречался с такой проблемой? Как перекрасить эту область? Через Canvas доступа к ней нет.
Заранее благодарю за ответы.
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
 |
Вопрос задал: 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. Предлагаю такой вариант. В примере цвет фона главного меню заливается желтым цветом.
И свой компонент, потенциально коммерческий ))), писать не надо.
Английский у меня хромает), так что если комментарии непонятны, пишите. С радостью отвечу
Приложение: Переключить в обычный режим- type
- TForm1 = class(TForm)
- ...
- private
- MenuBarBackground: TBrush;
- MenuBarBackgroundOld: HBrush;
- ...
- end;
-
- ...
-
- procedure TForm1.FormCreate(Sender: TObject);
- var
- lpcmi: TMenuInfo;
- begin
- // Initialization
- MenuBarBackground:= TBrush.Create;
- MenuBarBackground.Color:= clYellow;
-
- // Retrieving info about menu...
- lpcmi.cbSize:= SizeOf(TMenuInfo);
- lpcmi.fMask:= MIM_BACKGROUND;
- GetMenuInfo(MainMenu1.Handle, lpcmi);
-
- // Save parameters we want to change...
- MenuBarBackgroundOld:= lpcmi.hbrBack;
-
- // Applying new parameters...
- lpcmi.fMask:= MIM_BACKGROUND or MIM_APPLYTOSUBMENUS;
- lpcmi.hbrBack:= MenuBarBackground.Handle;
- SetMenuInfo(MainMenu1.Handle, lpcmi);
-
- // Redraw menu
- // It is not nessesary to do this in OnCreate event,
- // because after OnCreate has been called, all elements will redraw
- //DrawMenuBar(Handle);
- end;
-
- procedure TForm1.FormDestroy(Sender: TObject);
- var
- lpcmi: TMenuInfo;
- begin
- // Restore changed parameters, so OS can free allocated resources correctly
- ZeroMemory(@lpcmi, SizeOf(TMenuInfo));
- lpcmi.cbSize:= SizeOf(TMenuInfo);
- lpcmi.fMask:= MIM_BACKGROUND;
- lpcmi.hbrBack:= MenuBarBackgroundOld;
- SetMenuInfo(MainMenu1.Handle, lpcmi);
-
- // Free our Brush...
- MenuBarBackground.Free;
- end;
-
 |
Ответ отправил: Yurchik (статус: 3-ий класс)
Время отправки: 13 октября 2006, 02:55
Оценка за ответ: 5
Комментарий к оценке: Большое спасибо!
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 15 октября 2006, 13:36; участников в обсуждении: 3.
|
Alex Van Glukhman (статус: 7-ой класс), 12 октября 2006, 13:59 [#1]:
Именно что читал! вы меняете цвет в MenuItem, что как раз возможно по OnDrawItem, поэтому создавайте свой собственный обработчик например OnDrawMenu, только придётся писать тот же код с прорисовкой о чём я писал. Ну невозможно такое стандартными средствами Delphi.
Вообще то для того чтобы просмотреть свойства типа не прибегая к помощи HELP, существуют Source файлы - которые вы подключаете в разделе uses. Чтобы не задавать больше глупых вопросов и не флеймить - посмотрите определение типа TMainMenu и наверное всё станет понятным
|
|
Alex Van Glukhman (статус: 7-ой класс), 12 октября 2006, 14:01 [#2]:
А насчёт компонентов - Любой поисковик -> Search
|
|
Dron (статус: Студент), 12 октября 2006, 14:57 [#3]:
> Чтобы не задавать больше глупых вопросов и не
> флеймить - посмотрите определение типа
> TMainMenu и наверное всё станет понятным
А вам рекомендую не давать ответов от безвыходности.
JvxMainMenu построен на основе стандартного MainMenu, но доступ ко всей канве намертво заблокирован и рисовать разрешается только в событии OnDrawItem().
> А насчёт компонентов - Любой поисковик -> Search
Удивительно новый способ!
С уважением.
|
|
Alex Van Glukhman (статус: 7-ой класс), 12 октября 2006, 18:03 [#4]:
Во-первых я что то не слышал что JvxMainMenu является стандартным компонентом Borland.
Во-вторых о безвыходности я не говорил - мне что надо ручками написать и выложить на всеобщее обозрение как это делается? Так простите - это будет мой собственный компонент имеющий право на коммерческое существование.
В-третьих - что значит доступ заблокирован - отсутствует Property Canvas - или оно расположено в разделе private, protected или вообще исходного кода для компонента нет. И насколько я помню событие OnDrawItem определяет событие для Item TMainMenu поэтому и перерисовываем только итемы а не всю строку.
А теперь совет: почитайте о создании компонентов -> возьмите за исходный код определение TMainMenu и добавьте свойства Canvas и методы для его прорисовки и изменения а также Event по которому будет происходить обработка - удачи!!!
|
|
Dron (статус: Студент), 13 октября 2006, 13:24 [#5]:
А что такое JediVCL вы тоже не знаете? А зря. Вот этот компонент как раз оттуда, но создан он на базе TMainMenu.
> мне что надо ручками написать и выложить на всеобщее обозрение как это делается?
Дык вас никто не заставляет это делать и вообще отвечать на вопрос! А ежели более дельных советов дать не можете, то лучше вообще промолчать и проигнорировать вопрос.
>что значит доступ заблокирован - отсутствует Property Canvas - или оно расположено в разделе private, protected или вообще исходного кода для компонента нет
Свойство присутствует, но любое обращение к нему не из установленного события приводит к критической ошибке. Исходник слишком большой, да и править там что-либо крайне нежелательно.
С уважением.
|
|
Dron (статус: Студент), 14 октября 2006, 21:56 [#6]:
Yurchik: по правде говоря, на момент выставления оценки способ ещё не испробовал - просто случайно заметил, что через 10 минут срок действия вопроса закончится и оценку выставить не удастся. Были сомнения... Но теперь всё готово - получилось! Большое спасибо! Что бы я без Вас делал...
С уважением.
|
|
Yurchik (статус: 3-ий класс), 15 октября 2006, 13:36 [#7]:
Всегда пожалуйста! Был рад помочь
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|