Embellece tu menú con Delphi
Muchos programas en Windows tienen menús muy hermosos, como el banner largo de Windows de arriba a abajo en el lado izquierdo del menú "Inicio" de Windows, o hay un pequeño ícono en el lado izquierdo de cada barra de menú como Word. Estos menús geniales, ¿sientes que tu propio menú parece aburrido? No se necesitan controles de terceros y las funciones anteriores se pueden lograr utilizando Delphi.
Si desea implementar un menú personalizado, debe cambiar el tamaño del menú al dibujarlo para adaptarlo a los gráficos dibujados en el menú y luego dibujar el efecto de menú que necesita en él. En Delphi, cada elemento del menú corresponde a un control TmenuItem. Este tipo de control tiene dos eventos: OnDrawItem y OnMeasureItem. Para implementar un menú personalizado, primero debe introducir estos dos eventos.
El evento OnMeasureItem se define de la siguiente manera:
escriba TMenuMeasureItemEvent = PRocedure (Remitente: TObject; ACanvas: TCanvas;
var Ancho, Alto: Entero) del objeto;
propiedad OnMeasureItem: TMenuMeasureItemEvent;
Este evento se genera cuando la barra de menú monitorea su propio tamaño. El parámetro Acanvas define el objeto de dibujo que se va a dibujar, y los parámetros Ancho y Alto especifican el tamaño predeterminado del elemento del menú. Significa que puede usar el evento OnMeasureItem. Cambiar estos dos valores en la función de procesamiento significa cambiar el tamaño del menú.
El evento OnDrawItem se define de la siguiente manera:
escriba TMenuDrawItemEvent = procedimiento (Remitente: TObject; ACanvas: TCanvas;
ARect: TRect; Seleccionado: Booleano) del objeto;
propiedad OnDrawItem: TMenuDrawItemEvent;
Este evento se activa cuando se dibuja el menú. El parámetro Acanvas define el objeto de dibujo del menú, el parámetro Arect especifica el área de dibujo del menú y el parámetro Seleccionado define si el elemento del menú actual está seleccionado.
Como puede ver en la introducción anterior, para implementar un menú personalizado, solo necesita escribir código en el evento OnMeasureItem para cambiar el tamaño de los elementos del menú y luego dibujar el efecto que necesita en el evento OnDrawItem.
A continuación daré un ejemplo específico para ilustrar. Este ejemplo es para hacer que su propio menú muestre la función de la barra de banner como el menú Inicio de Windows. Al mismo tiempo, este programa también puede llenar la barra de menú seleccionada con un color degradado (al igual que el menú de la barra de tareas del software del sitio web chino 3721). La idea del programa es la siguiente: primero crear un mapa de bits largo y luego cambiar el ancho y alto de los elementos del menú en el evento OnMeasureItem de cada barra de menú de acuerdo con el texto y las imágenes que se mostrarán en el menú y las necesidades. del programa y luego copie la parte correspondiente del mapa de bits al elemento del menú en el evento OnDrawItem. Si se selecciona la barra de menú, primero cambie el color del pincel del parámetro Acanvas y luego complete las partes correspondientes de la barra de menú a su vez, logrando así el relleno de color degradado de la barra de menú seleccionada. Finalmente, el texto se envía a la barra de menú.
Introduzcamos el procedimiento específico. Primero, use el software de imágenes para crear un archivo de mapa de bits largo (puede configurar la relación de aspecto de la imagen según sus necesidades, en mi imagen es 10:1). Cree un nuevo proyecto en Delphi, agregue un control TImage a Form1 y establezca la propiedad AutoSize del control en True. Luego agregue un control TMainMenu a Form1, establezca su propiedad OwnerDraw en True (esto es muy importante, de lo contrario el programa no se puede implementar) y agregue 6 objetos TMenuItem debajo de TMainMenu (haga clic con el botón derecho en el control TMainMenu y luego haga clic en el menú emergente). (elemento del menú Menú Diseñador, puede agregar una barra de menú en la ventana de diseño), establezca sus propiedades de Nombre en Título1, Título2, ..., Título6 respectivamente.
La siguiente es una lista de programas específicos:
menú propietario de la unidad;
interfaz
usos
Windows, Mensajes, SysUtils, Clases, Gráficos, Controles, Formularios, Cuadros de diálogo,
Menús, ExtCtrls, StdCtrls, ImgList;
tipo
TForm1 = clase(TForm)
Menú principal1: TMenú principal;
Principal1: TMenuItem;
Título1: TMenuItem;
Título 2: TMenuItem;
Título 3: TMenuItem;
Título 4: TMenuItem;
Título 5: TMenuItem;
Título 6: TMenuItem;
Imagen 1: TImagen;
procedimiento Caption1MeasureItem(Remitente: TObject; ACanvas: TCanvas;
var Ancho, Alto: Entero);
procedimiento Caption2MeasureItem(Remitente: TObject; ACanvas: TCanvas;
var Ancho, Alto: Entero);
procedimiento Caption3MeasureItem(Remitente: TObject; ACanvas: TCanvas;
var Ancho, Alto: Entero);
procedimiento Caption4MeasureItem(Remitente: TObject; ACanvas: TCanvas;
var Ancho, Alto: Entero);
procedimiento Caption5MeasureItem(Remitente: TObject; ACanvas: TCanvas;
var Ancho, Alto: Entero);
procedimiento Caption6MeasureItem(Remitente: TObject; ACanvas: TCanvas;
var Ancho, Alto: Entero);
procedimiento Caption1DrawItem(Remitente: TObject; ACanvas: TCanvas;
ARect: TRect Seleccionado: Booleano);
procedimiento Caption2DrawItem(Remitente: TObject; ACanvas: TCanvas;
ARect: TRect Seleccionado: Booleano);
procedimiento Caption3DrawItem(Remitente: TObject; ACanvas: TCanvas;
ARect: TRect Seleccionado: Booleano);
procedimiento Caption4DrawItem(Remitente: TObject; ACanvas: TCanvas;
ARect: TRect Seleccionado: Booleano);
procedimiento Caption5DrawItem(Remitente: TObject; ACanvas: TCanvas;
ARect: TRect Seleccionado: Booleano);
procedimiento Caption6DrawItem(Remitente: TObject; ACanvas: TCanvas;
ARect: TRect Seleccionado: Booleano);
privado
{Declaraciones privadas}
público
procedimiento DrawItem(Remitente: TMenuItem; ACanvas: TCanvas;ARect: TRect;
Seleccionado: booleano; strOUt:String);
{Declaraciones públicas}
fin;
var
Formulario1: TForm1;
i,iH,Ind,iW,iRate:Entero;
rTemp:TRect;
iG1,iG2:Entero;
implementación
{$R *.DFM}
procedimiento TForm1.DrawItem(Remitente: TMenuItem; ACanvas: TCanvas;ARect: TRect;
Seleccionado: booleano; strOut:String);
var
j:Entero;
comenzar
i:=ARect.Bottom -ARect.Top; //Obtener el alto y ancho de la textura
Ind:=Remitente.MenuIndex;
iH:=Round(Image1.Height/6*Ind); //Obtener la posición de la textura
//Copia el mapa de bits en la posición correspondiente de la Imagen al menú
StretchBlt(ACanvas.Handle,ARect.Left,ARect.Top,iW,i,Image1.Canvas.Handle,0,iH,
Imagen1.Ancho,Redondo(Imagen1.Alto/6),SRCCOPY);
si está seleccionado, comience //El elemento del menú está seleccionado
ACanvas.Font.Color := clWhite;
rTemp:=ARect;
rTemp.Izquierda := rTemp.izquierda+iW;
iG1:=Round((rTemp.Derecha - rTemp.Izquierda)/10);
rTemp.Derecha := rTemp.Izquierda +iG1;
para j:= 0 a 9 comenzar //Establecer efecto de degradado de color a través del bucle
ACanvas.Brush.Color := RGB(0,0,j*25);
ACanvas.FillRect(rTemp);
rTemp.Izquierda := rTemp.Izquierda +iG1;
rTemp.Derecha := rTemp.Izquierda +iG1;
fin;
fin
else comenzar //Este elemento del menú no está seleccionado
ACanvas.Brush.Color := cl3DLight //Establece el color de fondo en gris claro;
rTemp:=ARect;
rTemp.Izquierda := rTemp.izquierda+iW;
ACanvas.FillRect(rTemp);
ACanvas.Font.Color := clBlack;
fin;
//Establece el modo de relleno del pincel del lienzo en transparente
ACanvas.Brush.Style:=bsClear;
//Salir texto en el menú
ACanvas.TextOut(ARect.Left+iW+5,ARect.Top,strOut);
fin;
procedimiento TForm1.Caption1MeasureItem(Remitente: TObject; ACanvas: TCanvas;
var Ancho, Alto: Entero);
comenzar
// Cambiar el ancho y alto del menú en el evento OnMeasureItem Los siguientes cinco programas son iguales.
//Cambiar el ancho y alto del menú para acomodar el texto
Altura:=ACanvas.TextHeight('Caption1')+5;
Ancho:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Imagen1.Altura/(Altura*6));
iW:=Round(Imagen1.Ancho /iRate);
Ancho:=Ancho+iW; //Cambiar el ancho del menú según el cálculo para acomodar texto adicional
fin;
procedimiento TForm1.Caption2MeasureItem(Remitente: TObject; ACanvas: TCanvas;
var Ancho, Alto: Entero);
comenzar
Altura:=ACanvas.TextHeight('Caption1')+5;
Ancho:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Imagen1.Altura/(Altura*6));
iW:=Round(Imagen1.Ancho /iRate);
Ancho:=Ancho+iW;
fin;
procedimiento TForm1.Caption3MeasureItem(Remitente: TObject; ACanvas: TCanvas;
var Ancho, Alto: Entero);
comenzar
Altura:=ACanvas.TextHeight('Caption1')+5;
Ancho:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Imagen1.Altura/(Altura*6));
iW:=Round(Imagen1.Ancho /iRate);
Ancho:=Ancho+iW;
fin;
procedimiento TForm1.Caption4MeasureItem(Remitente: TObject; ACanvas: TCanvas;
var Ancho, Alto: Entero);
comenzar
Altura:=ACanvas.TextHeight('Caption1')+5;
Ancho:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Imagen1.Altura/(Altura*6));
iW:=Round(Imagen1.Ancho /iRate);
Ancho:=Ancho+iW;
fin;
procedimiento TForm1.Caption5MeasureItem(Remitente: TObject; ACanvas: TCanvas;
var Ancho, Alto: Entero);
comenzar
Altura:=ACanvas.TextHeight('Caption1')+5;
Ancho:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Imagen1.Altura/(Altura*6));
iW:=Round(Imagen1.Ancho /iRate);
Ancho:=Ancho+iW;
fin;
procedimiento TForm1.Caption6MeasureItem(Remitente: TObject; ACanvas: TCanvas;
var Ancho, Alto: Entero);
comenzar
Altura:=ACanvas.TextHeight('Caption1')+5;
Ancho:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Imagen1.Altura/(Altura*6));
iW:=Round(Imagen1.Ancho /iRate);
Ancho:=Ancho+iW;
fin;
procedimiento TForm1.Caption1DrawItem(Remitente: TObject; ACanvas: TCanvas;
ARect: TRect Seleccionado: Booleano);
comenzar
DrawItem(TMenuItem(Remitente),ACanvas,ARect,Selected,'Caption1');
fin;
procedimiento TForm1.Caption2DrawItem(Remitente: TObject; ACanvas: TCanvas;
ARect: TRect Seleccionado: Booleano);
comenzar
DrawItem(TMenuItem(Remitente),ACanvas,ARect,Selected,'Caption2');
fin;
procedimiento TForm1.Caption3DrawItem(Remitente: TObject; ACanvas: TCanvas;
ARect: TRect Seleccionado: Booleano);
comenzar
DrawItem(TMenuItem(Remitente),ACanvas,ARect,Selected,'Caption3');
fin;
procedimiento TForm1.Caption4DrawItem(Remitente: TObject; ACanvas: TCanvas;
ARect: TRect Seleccionado: Booleano);
comenzar
DrawItem(TMenuItem(Remitente),ACanvas,ARect,Selected,'Caption4');
fin;
procedimiento TForm1.Caption5DrawItem(Remitente: TObject; ACanvas: TCanvas;
ARect: TRect Seleccionado: Booleano);
comenzar
DrawItem(TMenuItem(Remitente),ACanvas,ARect,Selected,'Caption5');
fin;
procedimiento TForm1.Caption6DrawItem(Remitente: TObject; ACanvas: TCanvas;
ARect: TRect Seleccionado: Booleano);
comenzar
DrawItem(TMenuItem(Remitente),ACanvas,ARect,Selected,'Caption6');
fin;
fin.