Embellissez votre menu avec Delphi
De nombreux programmes sous Windows ont de très beaux menus, comme la longue bannière Windows de haut en bas sur le côté gauche du menu « Démarrer » de Windows, ou il y a une petite icône sur le côté gauche de chaque barre de menu comme Word See Seeing. ces menus sympas, pensez-vous que votre propre menu a l'air ennuyeux ? Aucun contrôle tiers n'est nécessaire et les fonctions ci-dessus peuvent être réalisées à l'aide de Delphi.
Si vous souhaitez implémenter un menu personnalisé, vous devez modifier la taille du menu lors du dessin du menu pour l'adapter aux graphiques dessinés sur le menu, puis dessiner l'effet de menu dont vous avez besoin. Dans Delphi, chaque élément de menu correspond à un contrôle TmenuItem. Ce type de contrôle possède deux événements : OnDrawItem et OnMeasureItem. Pour implémenter un menu personnalisé, vous devez d'abord introduire ces deux événements :
L'événement OnMeasureItem est défini comme suit :
tapez TMenuMeasureItemEvent = PRocedure (Expéditeur : TObject ; ACanvas : TCanvas ;
var Largeur, Hauteur : Entier) de l'objet ;
propriété OnMeasureItem : TMenuMeasureItemEvent ;
Cet événement est généré lorsque la barre de menu surveille sa propre taille. Le paramètre Acanvas définit l'objet de dessin à dessiner, et les paramètres Largeur et Hauteur spécifient la taille par défaut de l'élément de menu. Avez-vous remarqué la var avant ces deux définitions ? signifie que vous pouvez utiliser l'événement OnMeasureItem. Changer ces deux valeurs dans la fonction de traitement signifie changer la taille du menu.
L'événement OnDrawItem est défini comme suit :
tapez TMenuDrawItemEvent = procédure (Expéditeur : TObject ; ACanvas : TCanvas ;
ARect : TRect ; Sélectionné : Booléen) de l'objet ;
propriété OnDrawItem : TMenuDrawItemEvent ;
Cet événement est déclenché lorsque le menu est dessiné. Le paramètre Acanvas définit l'objet de dessin du menu, le paramètre Arect spécifie la zone de dessin du menu et le paramètre Selected définit si l'élément de menu actuel est sélectionné.
Comme vous pouvez le voir dans l'introduction ci-dessus, pour implémenter un menu personnalisé, il vous suffit d'écrire du code dans l'événement OnMeasureItem pour modifier la taille des éléments de menu, puis de dessiner l'effet dont vous avez besoin dans l'événement OnDrawItem.
Ci-dessous, je vais donner un exemple spécifique pour illustrer. Cet exemple consiste à faire en sorte que votre propre menu affiche la fonction de la barre de bannière comme le menu Démarrer de Windows. Dans le même temps, ce programme peut également remplir la barre de menu sélectionnée avec un dégradé de couleurs (tout comme le menu de la barre des tâches du logiciel de site Web chinois 3721). L'idée du programme est la suivante : créez d'abord un long bitmap, puis modifiez la largeur et la hauteur des éléments de menu dans l'événement OnMeasureItem de chaque barre de menu en fonction du texte et des images à afficher dans le menu et des besoins. du programme, puis copiez la partie correspondante du bitmap dans l'élément de menu de l'événement OnDrawItem. Si la barre de menu est sélectionnée, changez d'abord la couleur du pinceau du paramètre Acanvas, puis remplissez tour à tour les parties correspondantes de la barre de menu, réalisant ainsi un remplissage de couleur dégradé de la barre de menu sélectionnée. Enfin, le texte est affiché dans la barre de menu.
Présentons la procédure spécifique. Tout d'abord, utilisez un logiciel d'image pour créer un long fichier bitmap (vous pouvez définir le rapport hauteur/largeur de l'image en fonction de vos besoins, dans mon image, il est de 10:1). Créez un nouveau projet dans Delphi, ajoutez un contrôle TImage à Form1 et définissez la propriété AutoSize du contrôle sur True. Ajoutez ensuite un contrôle TMainMenu à Form1, définissez sa propriété OwnerDraw sur True (c'est très important, sinon le programme ne peut pas être implémenté) et ajoutez 6 objets TMenuItem sous le TMainMenu (cliquez avec le bouton droit sur le contrôle TMainMenu, puis cliquez sur la fenêtre contextuelle). (élément de menu Designer de menu supérieur, vous pouvez ajouter une barre de menu dans la fenêtre de conception), définissez leurs propriétés de nom sur Caption1, Caption2, ..., Caption6 respectivement.
Voici une liste de programmes spécifique :
Menu Propriétaire de l'unité ;
interface
utilise
Windows, messages, SysUtils, classes, graphiques, contrôles, formulaires, boîtes de dialogue,
Menus, ExtCtrls, StdCtrls, ImgList ;
taper
TForm1 = classe(TForm)
MenuMain1 : TMainMenu ;
Main1 : TMenuItem ;
Légende1 : TMenuItem ;
Légende2 : TMenuItem ;
Légende3 : TMenuItem ;
Légende4 : TMenuItem ;
Légende5 : TMenuItem ;
Légende6 : TMenuItem ;
Image1 : TImage ;
procédure Caption1MeasureItem (Expéditeur : TObject ; ACanvas : TCanvas ;
var Largeur, Hauteur : Entier);
procédure Caption2MeasureItem (Expéditeur : TObject ; ACanvas : TCanvas ;
var Largeur, Hauteur : Entier);
procédure Caption3MeasureItem (Expéditeur : TObject ; ACanvas : TCanvas ;
var Largeur, Hauteur : Entier);
procédure Caption4MeasureItem (Expéditeur : TObject ; ACanvas : TCanvas ;
var Largeur, Hauteur : Entier);
procédure Caption5MeasureItem (Expéditeur : TObject ; ACanvas : TCanvas ;
var Largeur, Hauteur : Entier);
procédure Caption6MeasureItem(Expéditeur : TObject ; ACanvas : TCanvas ;
var Largeur, Hauteur : Entier);
procédure Caption1DrawItem (Expéditeur : TObject ; ACanvas : TCanvas ;
ARect : TRect ; Sélectionné : Booléen );
procédure Caption2DrawItem (Expéditeur : TObject ; ACanvas : TCanvas ;
ARect : TRect ; Sélectionné : Booléen );
procédure Caption3DrawItem (Expéditeur : TObject ; ACanvas : TCanvas ;
ARect : TRect ; Sélectionné : Booléen );
procédure Caption4DrawItem (Expéditeur : TObject ; ACanvas : TCanvas ;
ARect : TRect ; Sélectionné : Booléen );
procédure Caption5DrawItem (Expéditeur : TObject ; ACanvas : TCanvas ;
ARect : TRect ; Sélectionné : Booléen );
procédure Caption6DrawItem (Expéditeur : TObject ; ACanvas : TCanvas ;
ARect : TRect ; Sélectionné : Booléen );
privé
{Déclarations privées}
publique
procédure DrawItem (Expéditeur : TMenuItem ; ACanvas : TCanvas ; ARect : TRect ;
Sélectionné : Booléen ; strOUt : String);
{Déclarations publiques}
fin;
var
Formulaire1 : TForm1 ;
i,iH,Ind,iW,iRate:Integer ;
rTemp:TRect;
iG1,iG2 : entier ;
mise en œuvre
{$R *.DFM}
procédure TForm1.DrawItem(Expéditeur : TMenuItem ; ACanvas : TCanvas ;ARect : TRect ;
Sélectionné : Booléen ; strOut : String);
var
j : entier ;
commencer
i:=ARect.Bottom -ARect.Top; //Obtient la hauteur et la largeur de la texture
Ind:=Expéditeur.MenuIndex;
iH:=Round(Image1.Height/6*Ind); //Obtenir la position de la texture
// Copiez le bitmap à la position correspondante sur l'image dans le menu
StretchBlt(ACanvas.Handle,ARect.Left,ARect.Top,iW,i,Image1.Canvas.Handle,0,iH,
Image1.Largeur,Ronde(Image1.Hauteur/6),SRCCOPY);
si sélectionné, alors commencez // L'élément de menu est sélectionné
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 start //Définir l'effet de dégradé de couleur via la boucle
ACanvas.Brush.Color := RVB(0,0,j*25);
ACanvas.FillRect(rTemp);
rTemp.Left := rTemp.Left +iG1;
rTemp.Right := rTemp.Left +iG1;
fin;
fin
sinon commencer //Cet élément de menu n'est pas sélectionné
ACanvas.Brush.Color := cl3DLight; //Définit la couleur d'arrière-plan sur gris clair
rTemp:=ARect;
rTemp.Left := rTemp.left+iW;
ACanvas.FillRect(rTemp);
ACanvas.Font.Color := clBlack;
fin;
//Définit le mode de remplissage du pinceau Canvas sur transparent
ACanvas.Brush.Style:=bsClear;
//Texte de sortie dans le menu
ACanvas.TextOut(ARect.Left+iW+5,ARect.Top,strOut);
fin;
procédure TForm1.Caption1MeasureItem(Sender : TObject ; ACanvas : TCanvas ;
var Largeur, Hauteur : Entier);
commencer
//Modifiez la largeur et la hauteur du menu dans l'événement OnMeasureItem Les cinq programmes suivants sont identiques.
//Modifie la largeur et la hauteur du menu pour s'adapter au texte
Hauteur:=ACanvas.TextHeight('Caption1')+5;
Largeur:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Hauteur/(Hauteur*6));
iW:=Round(Image1.Width /iRate);
Largeur:=Largeur+iW; //Modifier la largeur du menu en fonction du calcul pour accueillir du texte supplémentaire
fin;
procédure TForm1.Caption2MeasureItem(Sender : TObject ; ACanvas : TCanvas ;
var Largeur, Hauteur : Entier);
commencer
Hauteur:=ACanvas.TextHeight('Caption1')+5;
Largeur:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Hauteur/(Hauteur*6));
iW:=Round(Image1.Width /iRate);
Largeur :=Largeur+iW ;
fin;
procédure TForm1.Caption3MeasureItem(Sender : TObject ; ACanvas : TCanvas ;
var Largeur, Hauteur : Entier);
commencer
Hauteur:=ACanvas.TextHeight('Caption1')+5;
Largeur:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Hauteur/(Hauteur*6));
iW:=Round(Image1.Width /iRate);
Largeur :=Largeur+iW ;
fin;
procédure TForm1.Caption4MeasureItem(Sender : TObject ; ACanvas : TCanvas ;
var Largeur, Hauteur : Entier);
commencer
Hauteur:=ACanvas.TextHeight('Caption1')+5;
Largeur:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Hauteur/(Hauteur*6));
iW:=Round(Image1.Width /iRate);
Largeur :=Largeur+iW ;
fin;
procédure TForm1.Caption5MeasureItem(Sender : TObject ; ACanvas : TCanvas ;
var Largeur, Hauteur : Entier);
commencer
Hauteur:=ACanvas.TextHeight('Caption1')+5;
Largeur:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Hauteur/(Hauteur*6));
iW:=Round(Image1.Width /iRate);
Largeur :=Largeur+iW ;
fin;
procédure TForm1.Caption6MeasureItem(Sender : TObject ; ACanvas : TCanvas ;
var Largeur, Hauteur : Entier);
commencer
Hauteur:=ACanvas.TextHeight('Caption1')+5;
Largeur:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Hauteur/(Hauteur*6));
iW:=Round(Image1.Width /iRate);
Largeur :=Largeur+iW ;
fin;
procédure TForm1.Caption1DrawItem(Expéditeur : TObject ; ACanvas : TCanvas ;
ARect : TRect ; Sélectionné : Booléen );
commencer
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption1');
fin;
procédure TForm1.Caption2DrawItem(Expéditeur : TObject ; ACanvas : TCanvas ;
ARect : TRect ; Sélectionné : Booléen );
commencer
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption2');
fin;
procédure TForm1.Caption3DrawItem(Expéditeur : TObject ; ACanvas : TCanvas ;
ARect : TRect ; Sélectionné : Booléen );
commencer
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption3');
fin;
procédure TForm1.Caption4DrawItem(Expéditeur : TObject ; ACanvas : TCanvas ;
ARect : TRect ; Sélectionné : Booléen );
commencer
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption4');
fin;
procédure TForm1.Caption5DrawItem(Expéditeur : TObject ; ACanvas : TCanvas ;
ARect : TRect ; Sélectionné : Booléen );
commencer
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption5');
fin;
procédure TForm1.Caption6DrawItem(Expéditeur : TObject ; ACanvas : TCanvas ;
ARect : TRect ; Sélectionné : Booléen );
commencer
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption6');
fin;
fin.