Embeleze seu cardápio com Delphi
Muitos programas no Windows têm menus muito bonitos, como o longo banner do Windows de cima para baixo no lado esquerdo do menu “Iniciar” do Windows, ou há um pequeno ícone no lado esquerdo de cada barra de menu, como o Word. menus legais, você acha que seu próprio menu parece chato? Nenhum controle de terceiros é necessário e as funções acima podem ser obtidas usando Delphi.
Se você deseja implementar um menu personalizado, você precisa alterar o tamanho do menu ao desenhar o menu para se adaptar aos gráficos desenhados no menu e, em seguida, desenhar nele o efeito de menu necessário. No Delphi, cada item de menu corresponde a um controle TmenuItem. Este tipo de controle possui dois eventos: OnDrawItem e OnMeasureItem. Para implementar um menu personalizado, você deve primeiro introduzir estes dois eventos:
O evento OnMeasureItem é definido da seguinte forma:
digite TMenuMeasureItemEvent = PRocedure (Sender: TObject; ACanvas: TCanvas;
var Largura, Altura: Inteiro) do objeto;
propriedade OnMeasureItem: TMenuMeasureItemEvent;
Este evento é gerado quando a barra de menu monitora seu próprio tamanho. O parâmetro Acanvas define o objeto de desenho a ser desenhado, e os parâmetros Largura e Altura especificam o tamanho padrão do item de menu. significa que você pode usar o evento OnMeasureItem. Alterar esses dois valores na função de processamento significa alterar o tamanho do menu.
O evento OnDrawItem é definido da seguinte forma:
tipo TMenuDrawItemEvent = procedimento (Remetente: TObject; ACanvas: TCanvas;
ARect: TRect; Selecionado: Booleano) do objeto;
propriedade OnDrawItem: TMenuDrawItemEvent;
Este evento é acionado quando o menu é desenhado. O parâmetro Acanvas define o objeto de desenho do menu, o parâmetro Arect especifica a área de desenho do menu e o parâmetro Selecionado define se o item de menu atual está selecionado.
Como você pode ver na introdução acima, para implementar um menu personalizado, você só precisa escrever código no evento OnMeasureItem para alterar o tamanho dos itens de menu e, em seguida, desenhar o efeito necessário no evento OnDrawItem.
Abaixo darei um exemplo específico para ilustrar. Este exemplo é para fazer com que seu próprio menu exiba a função da barra Banner como o menu Iniciar do Windows. Ao mesmo tempo, este programa também pode preencher a barra de menu selecionada com cor gradiente (assim como o menu da barra de tarefas do software do site chinês 3721). A ideia do programa é esta: primeiro crie um bitmap longo, e depois altere a largura e a altura dos itens de menu no evento OnMeasureItem de cada barra de menu de acordo com o texto e as imagens a serem exibidas no menu e as necessidades do programa e, em seguida, copie a parte correspondente do bitmap para o item de menu no evento OnDrawItem. Se a barra de menu estiver selecionada, primeiro altere a cor do pincel do parâmetro Acanvas e, em seguida, preencha as partes correspondentes da barra de menu, realizando assim o preenchimento de cor gradiente da barra de menu selecionada. Finalmente, o texto é enviado para a barra de menu.
Vamos apresentar o procedimento específico. Primeiro, use um software de imagem para criar um arquivo bitmap longo (você pode definir a proporção da imagem de acordo com suas necessidades, na minha imagem é 10:1). Crie um novo projeto em Delphi, adicione um controle TImage ao Form1 e defina a propriedade AutoSize do controle como True. Em seguida, adicione um controle TMainMenu ao Form1, defina sua propriedade OwnerDraw como True (isso é muito importante, caso contrário o programa não poderá ser implementado) e adicione 6 objetos TMenuItem sob o TMainMenu (clique com o botão direito no controle TMainMenu e, em seguida, clique no pop-up menu Menu Designer, você pode adicionar uma barra de menu na janela de design), defina suas propriedades Name como Caption1, Caption2, ..., Caption6 respectivamente.
A seguir está uma lista de programas específicos:
unidade ProprietárioMenu;
interface
usa
Windows, Mensagens, SysUtils, Classes, Gráficos, Controles, Formulários, Diálogos,
Menus, ExtCtrls, StdCtrls, ImgList;
tipo
TForm1 = classe(TForm)
MainMenu1: TMainMenu;
Principal1: TMenuItem;
Legenda1: TMenuItem;
Legenda2: TMenuItem;
Legenda3: TMenuItem;
Legenda4: TMenuItem;
Legenda5: TMenuItem;
Legenda6: TMenuItem;
Imagem1: TImage;
procedimento Caption1MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Largura, Altura: Inteiro);
procedimento Caption2MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Largura, Altura: Inteiro);
procedimento Caption3MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Largura, Altura: Inteiro);
procedimento Caption4MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Largura, Altura: Inteiro);
procedimento Caption5MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Largura, Altura: Inteiro);
procedimento Caption6MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Largura, Altura: Inteiro);
procedimento Caption1DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selecionado: Booleano);
procedimento Caption2DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selecionado: Booleano);
procedimento Caption3DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selecionado: Booleano);
procedimento Caption4DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selecionado: Booleano);
procedimento Caption5DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selecionado: Booleano);
procedimento Caption6DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selecionado: Booleano);
privado
{Declarações privadas}
público
procedimento DrawItem(Sender: TMenuItem; ACanvas: TCanvas;ARect: TRect;
Selecionado: Boolean;strOUTt:String);
{Declarações públicas}
fim;
var
Formulário1: TForm1;
i,iH,Ind,iW,iRate:Inteiro;
rTemp: TRect;
iG1,iG2:Inteiro;
implementação
{$R *.DFM}
procedimento TForm1.DrawItem(Sender: TMenuItem; ACanvas: TCanvas;ARect: TRect;
Selecionado: Boolean;strOut:String);
var
j:Inteiro;
começar
i:=ARect.Bottom -ARect.Top; //Obtém a altura e largura da textura
Ind:=Sender.MenuIndex;
iH:=Round(Image1.Height/6*Ind); //Obter a posição da textura
//Copie o bitmap na posição correspondente da imagem para o menu
StretchBlt(ACanvas.Handle,ARect.Left,ARect.Top,iW,i,Image1.Canvas.Handle,0,iH,
Imagem1.Largura,Rodada(Imagem1.Altura/6),SRCCOPY);
se selecionado, então comece //O item de menu é selecionado
ACanvas.Font.Color := clWhite;
rTemp:=ARect;
rTemp.Esquerda := rTemp.esquerda+iW;
iG1:=Rodada((rTemp.Direita - rTemp.Esquerda)/10);
rTemp.Direita := rTemp.Esquerda +iG1;
for j:= 0 a 9 do start //Definir efeito de gradiente de cor através do loop
ACanvas.Brush.Color := RGB(0,0,j*25);
ACanvas.FillRect(rTemp);
rTemp.Left := rTemp.Left +iG1;
rTemp.Direita := rTemp.Esquerda +iG1;
fim;
fim
else start //Este item de menu não está selecionado
ACanvas.Brush.Color := cl3DLight; //Define a cor de fundo para cinza claro
rTemp:=ARect;
rTemp.Esquerda := rTemp.esquerda+iW;
ACanvas.FillRect(rTemp);
ACanvas.Font.Color := clBlack;
fim;
//Define o modo de preenchimento do pincel do Canvas como transparente
ACanvas.Brush.Style:=bsClear;
//Saída de texto no menu
ACanvas.TextOut(ARect.Left+iW+5,ARect.Top,strOut);
fim;
procedimento TForm1.Caption1MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Largura, Altura: Inteiro);
começar
//Altera a largura e a altura do menu no evento OnMeasureItem Os cinco programas a seguir são iguais.
//Altera a largura e altura do menu para acomodar o texto
Altura:=ACanvas.TextHeight('Caption1')+5;
Largura:=ACanvas.TextWidth('Caption1')+5;
iRate:=Rodada(Image1.Altura/(Altura*6));
iW:=Round(Image1.Largura /iRate);
Width:=Width+iW; //Altera a largura do menu com base no cálculo para acomodar texto adicional
fim;
procedimento TForm1.Caption2MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Largura, Altura: Inteiro);
começar
Altura:=ACanvas.TextHeight('Caption1')+5;
Largura:=ACanvas.TextWidth('Caption1')+5;
iRate:=Rodada(Image1.Altura/(Altura*6));
iW:=Round(Image1.Largura /iRate);
Largura:=Largura+iW;
fim;
procedimento TForm1.Caption3MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Largura, Altura: Inteiro);
começar
Altura:=ACanvas.TextHeight('Caption1')+5;
Largura:=ACanvas.TextWidth('Caption1')+5;
iRate:=Rodada(Image1.Altura/(Altura*6));
iW:=Round(Image1.Largura /iRate);
Largura:=Largura+iW;
fim;
procedimento TForm1.Caption4MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Largura, Altura: Inteiro);
começar
Altura:=ACanvas.TextHeight('Caption1')+5;
Largura:=ACanvas.TextWidth('Caption1')+5;
iRate:=Rodada(Image1.Altura/(Altura*6));
iW:=Round(Image1.Largura /iRate);
Largura:=Largura+iW;
fim;
procedimento TForm1.Caption5MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Largura, Altura: Inteiro);
começar
Altura:=ACanvas.TextHeight('Caption1')+5;
Largura:=ACanvas.TextWidth('Caption1')+5;
iRate:=Rodada(Image1.Altura/(Altura*6));
iW:=Round(Image1.Largura /iRate);
Largura:=Largura+iW;
fim;
procedimento TForm1.Caption6MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Largura, Altura: Inteiro);
começar
Altura:=ACanvas.TextHeight('Caption1')+5;
Largura:=ACanvas.TextWidth('Caption1')+5;
iRate:=Rodada(Image1.Altura/(Altura*6));
iW:=Rodada(Imagem1.Largura /iRate);
Largura:=Largura+iW;
fim;
procedimento TForm1.Caption1DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selecionado: Booleano);
começar
DrawItem(TMenuItem(Remetente),ACanvas,ARect,Selected,'Caption1');
fim;
procedimento TForm1.Caption2DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selecionado: Booleano);
começar
DrawItem(TMenuItem(Remetente),ACanvas,ARect,Selected,'Caption2');
fim;
procedimento TForm1.Caption3DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selecionado: Booleano);
começar
DrawItem(TMenuItem(Remetente),ACanvas,ARect,Selected,'Caption3');
fim;
procedimento TForm1.Caption4DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selecionado: Booleano);
começar
DrawItem(TMenuItem(Remetente),ACanvas,ARect,Selected,'Caption4');
fim;
procedimento TForm1.Caption5DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selecionado: Booleano);
começar
DrawItem(TMenuItem(Remetente),ACanvas,ARect,Selected,'Caption5');
fim;
procedimento TForm1.Caption6DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selecionado: Booleano);
começar
DrawItem(TMenuItem(Remetente),ACanvas,ARect,Selected,'Caption6');
fim;
fim.