Украсьте свое меню с помощью Delphi
Многие программы под Windows имеют очень красивые меню, такие как длинный баннер Windows сверху вниз в левой части меню «Пуск» Windows или небольшой значок в левой части каждой строки меню, такой как Word. классные меню, вам кажется, что ваше собственное меню выглядит скучным? Никаких сторонних элементов управления не требуется, и вышеуказанные функции могут быть реализованы с помощью Delphi.
Если вы хотите реализовать собственное меню, вам необходимо изменить размер меню при его рисовании, чтобы адаптировать его к графике, нарисованной в меню, а затем нарисовать на нем нужный вам эффект меню. В Delphi каждый элемент меню соответствует элементу управления TmenuItem. Этот тип элемента управления имеет два события: OnDrawItem и OnMeasureItem. Чтобы реализовать пользовательское меню, необходимо сначала ввести эти два события:
Событие OnMeasureItem определяется следующим образом:
введите TMenuMeasureItemEvent = PROcedure (Отправитель: TObject; ACanvas: TCanvas;
var Ширина, Высота: целое число) объекта;
свойство OnMeasureItem: TMenuMeasureItemEvent;
Это событие генерируется, когда строка меню контролирует свой собственный размер. Параметр Acanvas определяет рисуемый объект, а параметры Width и Height определяют размер пункта меню по умолчанию. Вы заметили переменную перед этими двумя определениями? означает, что вы можете использовать событие OnMeasureItem. Изменение этих двух значений в функции обработки означает изменение размера меню.
Событие OnDrawItem определяется следующим образом:
тип TMenuDrawItemEvent = процедура (Отправитель: TObject; ACanvas: TCanvas;
ARect: TRect; Выбрано: Boolean) объекта;
свойство OnDrawItem: TMenuDrawItemEvent;
Это событие срабатывает при отрисовке меню. Параметр Acanvas определяет объект рисования меню, параметр Arect указывает область рисования меню, а параметр Selected определяет, выбран ли текущий пункт меню.
Как видно из приведенного выше введения, для реализации настраиваемого меню вам нужно всего лишь написать код в событии OnMeasureItem, чтобы изменить размер пунктов меню, а затем нарисовать нужный вам эффект в событии OnDrawItem.
Ниже я приведу конкретный пример для иллюстрации. Этот пример предназначен для отображения функции баннерной панели в вашем собственном меню, например в меню «Пуск» Windows. В то же время эта программа также может заполнять выбранную строку меню градиентным цветом (точно так же, как меню панели задач программного обеспечения китайского веб-сайта 3721). Идея программы такова: сначала создать длинное растровое изображение, а затем изменить ширину и высоту пунктов меню в событии OnMeasureItem каждой строки меню в соответствии с текстом и изображениями, отображаемыми в меню, и потребностями. программы, а затем скопируйте соответствующую часть растрового изображения в пункт меню в событии OnDrawItem. Если выбрана строка меню, сначала измените цвет кисти параметра Acanvas, а затем поочередно заполните соответствующие части строки меню, реализуя таким образом градиентную цветовую заливку выбранной строки меню. Наконец, текст выводится в строку меню.
Давайте познакомимся с конкретной процедурой. Сначала используйте программное обеспечение для работы с изображениями, чтобы создать длинный растровый файл (вы можете установить соотношение сторон изображения в соответствии с вашими потребностями, в моем изображении оно составляет 10:1). Создайте новый проект в Delphi, добавьте элемент управления TImage в Form1 и установите для свойства AutoSize элемента управления значение True. Затем добавьте элемент управления TMainMenu в Form1, установите для его свойства OwnerDraw значение True (это очень важно, иначе программу невозможно реализовать) и добавьте 6 объектов TMenuItem под TMainMenu (щелкните правой кнопкой мыши элемент управления TMainMenu, а затем щелкните всплывающее окно). вверху меню «Конструктор меню», вы можете добавить строку меню в окно дизайна), установите для их свойств «Имя» значения Caption1, Caption2, ..., Caption6 соответственно.
Ниже приводится конкретный список программ:
модуль OwnerMenu;
интерфейс
использует
Windows, сообщения, SysUtils, классы, графика, элементы управления, формы, диалоги,
Меню, ExtCtrls, StdCtrls, ImgList;
тип
ТФорм1 = класс (ТФорма)
ГлавноеМеню1: ТМаинМеню;
Main1: TMenuItem;
Заголовок1: TMenuItem;
Заголовок2: TMenuItem;
Заголовок3: TMenuItem;
Заголовок4: TMenuItem;
Заголовок5: TMenuItem;
Заголовок6: TMenuItem;
Изображение1: TImage;
процедура Caption1MeasureItem (Отправитель: TObject; ACanvas: TCanvas;
var Ширина, Высота: целое число);
процедура Caption2MeasureItem (Отправитель: TObject; ACanvas: TCanvas;
var Ширина, Высота: целое число);
процедура Caption3MeasureItem (Отправитель: TObject; ACanvas: TCanvas;
var Ширина, Высота: целое число);
процедура Caption4MeasureItem (Отправитель: TObject; ACanvas: TCanvas;
var Ширина, Высота: целое число);
процедура Caption5MeasureItem (Отправитель: TObject; ACanvas: TCanvas;
var Ширина, Высота: целое число);
процедура Caption6MeasureItem (Отправитель: TObject; ACanvas: TCanvas;
var Ширина, Высота: целое число);
процедура Caption1DrawItem (Отправитель: TObject; ACanvas: TCanvas;
ARect: TRect; Выбрано: логическое значение);
процедура Caption2DrawItem (Отправитель: TObject; ACanvas: TCanvas;
ARect: TRect; Выбрано: логическое значение);
процедура Caption3DrawItem (Отправитель: TObject; ACanvas: TCanvas;
ARect: TRect; Выбрано: логическое значение);
процедура Caption4DrawItem (Отправитель: TObject; ACanvas: TCanvas;
ARect: TRect; Выбрано: логическое значение);
процедура Caption5DrawItem (Отправитель: TObject; ACanvas: TCanvas;
ARect: TRect; Выбрано: логическое значение);
процедура Caption6DrawItem (Отправитель: TObject; ACanvas: TCanvas;
ARect: TRect; Выбрано: логическое значение);
частный
{Частные заявления}
общественный
процедура DrawItem(Отправитель: TMenuItem; ACanvas: TCanvas;ARect: TRect;
Выбрано: Boolean;strOUT:String);
{Публичные заявления}
конец;
вар
Форма1: ТФорм1;
я, iH, Ind, iW, iRate: целое число;
рТемп:TRect;
iG1, iG2: целое число;
выполнение
{$R *.DFM}
процедура TForm1.DrawItem(Отправитель: TMenuItem; ACanvas: TCanvas;ARect: TRect;
Выбрано: Boolean;strOut:String);
вар
j: целое число;
начинать
i:=ARect.Bottom -ARect.Top //Получаем высоту и ширину текстуры
Индик:=Отправитель.МенюИндекс;
iH:=Round(Image1.Height/6*Ind); //Получаем положение текстуры
//Копируем растровое изображение в соответствующей позиции изображения в меню
StretchBlt(ACanvas.Handle,ARect.Left,ARect.Top,iW,i,Image1.Canvas.Handle,0,iH,
Изображение1.Ширина,Раунд(Изображение1.Высота/6),SRCCOPY);
если выбрано, то начать //Пункт меню выбран
ACanvas.Font.Color := clWhite;
rTemp:=ARect;
rTemp.Left := rTemp.left+iW;
iG1:=Round((rTemp.Right - rTemp.Left)/10);
rTemp.Right := rTemp.Left +iG1;
for j:= от 0 до 9 do Begin //Устанавливаем эффект цветового градиента через цикл
ACanvas.Brush.Color := RGB(0,0,j*25);
ACanvas.FillRect(rTemp);
rTemp.Left := rTemp.Left +iG1;
rTemp.Right := rTemp.Left +iG1;
конец;
конец
else start //Этот пункт меню не выбран
ACanvas.Brush.Color := cl3DLight //Устанавливаем светло-серый цвет фона;
rTemp:=ARect;
rTemp.Left := rTemp.left+iW;
ACanvas.FillRect(rTemp);
ACanvas.Font.Color := clBlack;
конец;
//Устанавливаем режим заливки кисти Canvas на прозрачный
ACanvas.Brush.Style:=bsClear;
//Вывод текста в меню
ACanvas.TextOut(ARect.Left+iW+5,ARect.Top,strOut);
конец;
процедура TForm1.Caption1MeasureItem(Отправитель: TObject; ACanvas: TCanvas;
var Ширина, Высота: целое число);
начинать
//Изменяем ширину и высоту меню в событии OnMeasureItem Следующие пять программ одинаковы.
//Изменяем ширину и высоту меню в соответствии с текстом
Height:=ACanvas.TextHeight('Caption1')+5;
Ширина:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Width:=Width+iW //Изменить ширину меню на основе расчета, чтобы разместить дополнительный текст
конец;
процедура TForm1.Caption2MeasureItem(Отправитель: TObject; ACanvas: TCanvas;
var Ширина, Высота: целое число);
начинать
Height:=ACanvas.TextHeight('Caption1')+5;
Ширина:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Ширина:=Ширина+iW;
конец;
процедура TForm1.Caption3MeasureItem(Отправитель: TObject; ACanvas: TCanvas;
var Ширина, Высота: целое число);
начинать
Height:=ACanvas.TextHeight('Caption1')+5;
Ширина:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Ширина:=Ширина+iW;
конец;
процедура TForm1.Caption4MeasureItem(Отправитель: TObject; ACanvas: TCanvas;
var Ширина, Высота: целое число);
начинать
Height:=ACanvas.TextHeight('Caption1')+5;
Ширина:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Ширина:=Ширина+iW;
конец;
процедура TForm1.Caption5MeasureItem(Отправитель: TObject; ACanvas: TCanvas;
var Ширина, Высота: целое число);
начинать
Height:=ACanvas.TextHeight('Caption1')+5;
Ширина:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Ширина:=Ширина+iW;
конец;
процедура TForm1.Caption6MeasureItem(Отправитель: TObject; ACanvas: TCanvas;
var Ширина, Высота: целое число);
начинать
Height:=ACanvas.TextHeight('Caption1')+5;
Ширина:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Ширина:=Ширина+iW;
конец;
процедура TForm1.Caption1DrawItem(Отправитель: TObject; ACanvas: TCanvas;
ARect: TRect; Выбрано: логическое значение);
начинать
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption1');
конец;
процедура TForm1.Caption2DrawItem (Отправитель: TObject; ACanvas: TCanvas;
ARect: TRect; Выбрано: логическое значение);
начинать
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption2');
конец;
процедура TForm1.Caption3DrawItem(Отправитель: TObject; ACanvas: TCanvas;
ARect: TRect; Выбрано: логическое значение);
начинать
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption3');
конец;
процедура TForm1.Caption4DrawItem(Отправитель: TObject; ACanvas: TCanvas;
ARect: TRect; Выбрано: логическое значение);
начинать
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption4');
конец;
процедура TForm1.Caption5DrawItem (Отправитель: TObject; ACanvas: TCanvas;
ARect: TRect; Выбрано: логическое значение);
начинать
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption5');
конец;
процедура TForm1.Caption6DrawItem(Отправитель: TObject; ACanvas: TCanvas;
ARect: TRect; Выбрано: логическое значение);
начинать
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption6');
конец;
конец.