IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

[FAQ] [Défi] Amélioration d'un TMainMenu


Sujet :

Composants VCL Delphi

  1. #1
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut [FAQ] [Défi] Amélioration d'un TMainMenu
    Bon, à priori, comme la question de la semaine est en train de tomber à l'eau à cause du fait que le popupmenu est plus relié à la Toolbar qu'au enu (http://www.developpez.net/forums/vie...45546&start=15), et qu'en plus l'idée de défi de programmation vous intéresse majoritairement (http://www.developpez.net/forums/viewtopic.php?t=429583), je vous en propose un aussi sympa que redoutable sur les TMainMenu

    Comme vous le savez, on peut assigner une image à un Item de menu par le biais d'un imagelist. Cette image peut donc être changée à volonté en changeant la valeur de sa propriété ImageIndex.
    A volonté ? pas tout à fait...

    Pour la base, dans votre IDE, vous faites "Fichier-->Nouveau-->Autre...", puis vous allez dans l'onglet Projets et vous choisissez, selon votre plateforme Application Logo Win2000 ou bien Application Logo Win95/98.

    1)Question facile de mise en train :
    Dans votre TMainMenu, sous l'Item Fichier, vous avez L'item Quitter. L'utilisateur souhaiterais que l'image en vis à vis du mot "Quitter" soit représentée par une porte fermée par défaut, et une porte ouverte quand la souris passe dessus. Comment feriez-vous ?

    2)Question niveau Experts
    L'utilisateur souhaiterais que dans le TMainMenu, en vis-à-vis du mot "Aide", on représente par défaut l'image d'un téléphone raccroché, et, lorsque le menu est déroulé (et seulement dans ce cas), un téléphone décroché !
    Comment feriez vous ?

    C'est réalisable, je l'ai déjà fait, donc pas de : c'est pas possible à faire, hein ?


    Les images nécessaires sont fournies par Borland dans le répertoire :
    C:\Program Files\Fichiers communs\Borland Shared\Images\Buttons
    et s'appellent :
    - DoorOpen.bmp
    - DoorShut.bmp
    - Phone.bmp
    - PhoneRng.bmp

    Alors, si ça vous tente...
    Bidouilleuse Delphi

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Bon j'ai directement attaqué le deuxième :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    /// Mettre la propriété MainMenu1.Ownerdraw à True
     
    procedure TWin2kAppForm.FormCreate(Sender: TObject);
    begin 
      Phone1 := TBitmap.Create;
      Phone2 := TBitmap.Create;
     
      ImageList1.GetBitmap(16,Phone1);
      ImageList1.GetBitmap(17,Phone2);
     
      Phone1.Transparent := True;
      Phone2.Transparent := True;
      FileNew1.Execute; { définit le nom de fichier par défaut et efface le contrôle RichEdit }
    end;
     
    procedure TWin2kAppForm.Help1DrawItem(Sender: TObject; ACanvas: TCanvas;
      ARect: TRect; Selected: Boolean);
    begin  ///Evenement attribué aux MenuItems Primaires 
     
             If Selected then begin
               ACanvas.Brush.Color := ClNavy;
               ACanvas.Font.Color  := ClWhite;
               ACAnvas.FillRect(ARect);
                  If TMenuItem(Sender).Name <> 'Help1' then begin
                  ACanvas.TextOut(ARect.Left+2,ARect.Top+2,TMenuItem(Sender).Caption);
                  end else begin
                  ACanvas.TextOut(ARect.Left+18,ARect.Top+2,TMenuItem(Sender).Caption);
                  ACanvas.Draw(ARect.Left,ARect.Top +2,Phone2);
                  end;
             end else begin
     
               ACanvas.Brush.Color := ClBtnFace;
               ACanvas.Font.Color  := ClBlack;
               ACAnvas.FillRect(ARect);
     
                  If TMenuItem(Sender).Name <> 'Help1' then begin
                  ACanvas.TextOut(ARect.Left+2,ARect.Top+2,TMenuItem(Sender).Caption);
                  end else begin
                  ACanvas.TextOut(ARect.Left+18,ARect.Top+2,TMenuItem(Sender).Caption);
                  ACanvas.Draw(ARect.Left,ARect.Top +2,Phone1);
                  end;
             end;
     
    end;
     
    procedure TWin2kAppForm.Help1MeasureItem(Sender: TObject; ACanvas: TCanvas;
      var Width, Height: Integer);
    begin  //Evenement attribué à HELP1
         Width := Width +10;  
    end;
    Voila, je ne sais si c'est ce que tu attendais pour le résultat.

  3. #3
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Hauwke m'a suggéré quelque d'imposer quelques règles pour le défi...
    Voici ses questions et mes réponses à ce propo :

    Avez-vous le droit de rajouter des compo ou pas ?
    Oui, si ce sont les votres et que vous fournissez la source
    Sinon, non, parce qu'il n'y a pas besoin d'autre chose que le composant TMainMenu, et que Delphi standard, sans composants tiers doit suffire.

    Peut gagner dans les deux défis ou seulement dans un à la fois ?
    Non,non les deux

    Si on peut poster plusieurs fois ?
    Oui, bien sûr...

    ...Et donc si on peut utiliser le début de code des autres posteurs... ?
    Oui, mais seul votre propre code vous fera gagner...
    Par contre, je vous autorise à utiliser le code de Borland si vous en avez besoin (VCL, RTL)

    Comment est choisi le gagnant, le deuxième, le troisième ?
    Sur plusieurs critères :
    - Plus vous posterez une réponse tôt, mieux vous serez noté.
    - La manière dont vous animerez le post (entre-aide, suggestions, idées nouvelles, perspectives)
    - Le type de réponse données : composant complet, simple procédure, etc...
    - La concision, la clarté, les explications données (commentaire du code, pourquoi faites vous comme ça et qu'est-ce qui vous a amené à ce résultat)
    - L'aspect réutilisation.
    - etc...

    On a combien de temps pour le faire ?
    Je part en vacances dimanche, donc le gagnant sera désigné samedi soir

    Bonne chance, que le/la meilleur(e) gagne !
    Bidouilleuse Delphi

  4. #4
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par portu
    Bon j'ai directement attaqué le deuxième :

    Voila, je ne sais si c'est ce que tu attendais pour le résultat.
    Exactement ! Mais c'est pas beau (coloration de l'Item, et caractère de raccourci (&)) !
    Bidouilleuse Delphi

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par waskol
    Exactement ! Mais c'est pas beau (coloration de l'Item, et caractère de racourci (&)) !
    A oui, mais j'ai mis en AutoHotKeys MaManual !
    Et les couleurs, je respecte celles par défaut.

  6. #6
    Membre averti
    Avatar de Hauwke
    Inscrit en
    Septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 329
    Points : 400
    Points
    400
    Par défaut
    Premier code exploitable en 1h17mn...Y'a des hotlines qui viennent de prendre un coup de pieds aux fesses...
    Je serais curieux de savoir combien de temps celà aurait pris si la question avait été posée de façon plus classique sur le forum...
    "Dans le jeu, le pire ce n'est pas la défaite, c'est de ne pas jouer!" (mon grand-père)

  7. #7
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    bonjour, un petit essai


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    unit W2kMain;
     
    interface
     
    uses Windows, Classes, Graphics, Forms, Controls, Menus,
      Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, ImgList, StdActns,
      ActnList, ToolWin;
     
    type
      TWin2kAppForm = class(TForm)
        OpenDialog: TOpenDialog;
        SaveDialog: TSaveDialog;
        ActionList1: TActionList;
        FileNew1: TAction;
        FileOpen1: TAction;
        FileSave1: TAction;
        FileSaveAs1: TAction;
        FileSend1: TAction;
        FileExit1: TAction;
        EditCut1: TEditCut;
        EditCopy1: TEditCopy;
        EditPaste1: TEditPaste;
        HelpAbout1: TAction;
        StatusBar: TStatusBar;
        ImageList1: TImageList;
        RichEdit1: TRichEdit;
        MainMenu1: TMainMenu;
        File1: TMenuItem;
        FileNewItem: TMenuItem;
        FileOpenItem: TMenuItem;
        FileSaveItem: TMenuItem;
        FileSaveAsItem: TMenuItem;
        N1: TMenuItem;
        FileSendItem: TMenuItem;
        N2: TMenuItem;
        FileExitItem: TMenuItem;
        Edit1: TMenuItem;
        CutItem: TMenuItem;
        CopyItem: TMenuItem;
        PasteItem: TMenuItem;
        Help1: TMenuItem;
        HelpAboutItem: TMenuItem;
        SaveDialog1: TSaveDialog;
        ToolBar1: TToolBar;
        ToolButton1: TToolButton;
        ToolButton2: TToolButton;
        ToolButton3: TToolButton;
        ToolButton4: TToolButton;
        ToolButton5: TToolButton;
        ToolButton6: TToolButton;
        ToolButton7: TToolButton;
        ToolButton8: TToolButton;
        ToolButton9: TToolButton;
        PopupMenu1: TPopupMenu;
        Cut1: TMenuItem;
        Copy1: TMenuItem;
        Paste1: TMenuItem;
        procedure FileNew1Execute(Sender: TObject);
        procedure FileOpen1Execute(Sender: TObject);
        procedure FileSave1Execute(Sender: TObject);
        procedure FileSaveAs1Execute(Sender: TObject);
        procedure FileSend1Execute(Sender: TObject);
        procedure FileExit1Execute(Sender: TObject);
        procedure HelpAbout1Execute(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FileExitItemDrawItem(Sender: TObject; ACanvas: TCanvas;
          ARect: TRect; Selected: Boolean);
        procedure Help1DrawItem(Sender: TObject; ACanvas: TCanvas;
          ARect: TRect; Selected: Boolean);
        procedure Help1MeasureItem(Sender: TObject; ACanvas: TCanvas;
          var Width, Height: Integer);
      private
        FFileName: String;
        FDoorShutIndex, FDoorOpenIndex, FPhoneIndex, FPhoneRngIndex : Integer;
      public
        { Public declarations }
      end;
     
    var
      Win2kAppForm: TWin2kAppForm;
     
    implementation
     
    uses
      SysUtils, Mapi, about, SHFolder;
     
    {$R *.dfm}
     
    resourcestring
      SUntitled  = 'Untitled';
      SOverwrite = 'OK to overwrite %s';
      SSendError = 'Error sending mail';
     
    function DefaultSaveLocation: string;
    var
      P: PChar;
    begin
      {
        returns the location of 'My Documents' if it exists, otherwise it returns
        the current directory.
      }
      P := nil;
      try
        P := AllocMem(MAX_PATH);
        if SHGetFolderPath(0, CSIDL_PERSONAL, 0, 0, P) = S_OK then
          Result := P
        else
          Result := GetCurrentDir;
      finally
        FreeMem(P);
      end;
    end;
     
    procedure TWin2kAppForm.FileNew1Execute(Sender: TObject);
    begin
      SaveDialog.InitialDir := DefaultSaveLocation;
      FFileName := SUntitled;
      RichEdit1.Lines.Clear;
      RichEdit1.Modified := False;
    end;
     
    procedure TWin2kAppForm.FileOpen1Execute(Sender: TObject);
    begin
      if OpenDialog.Execute then
      begin
        RichEdit1.Lines.LoadFromFile(OpenDialog.FileName);
        FFileName := OpenDialog.FileName;
        RichEdit1.SetFocus;
        RichEdit1.Modified := False;
        RichEdit1.ReadOnly := ofReadOnly in OpenDialog.Options;
      end;
    end;
     
    procedure TWin2kAppForm.FileSave1Execute(Sender: TObject);
    begin
      if (FFileName = SUntitled) or (FFileName = '') then
        FileSaveAs1Execute(Sender)
      else
      begin
        RichEdit1.Lines.SaveToFile(FFileName);
        RichEdit1.Modified := False;
      end;
    end;
     
    procedure TWin2kAppForm.FileSaveAs1Execute(Sender: TObject);
    begin
      with SaveDialog do
      begin
        FileName := FFileName;
        if Execute then
        begin
          if FileExists(FileName) then
            if MessageDlg(Format(SOverwrite, [FileName]),
              mtConfirmation, mbYesNoCancel, 0) <> idYes then Exit;
          RichEdit1.Lines.SaveToFile(FileName);
          FFileName := FileName;
          RichEdit1.Modified := False;
        end;
      end;
    end;
     
    procedure TWin2kAppForm.FileSend1Execute(Sender: TObject);
    var
      MapiMessage: TMapiMessage;
      MError: Cardinal;
    begin
      with MapiMessage do
      begin
        ulReserved := 0;
        lpszSubject := nil;
        lpszNoteText := PChar(RichEdit1.Lines.Text);
        lpszMessageType := nil; 
        lpszDateReceived := nil; 
        lpszConversationID := nil; 
        flFlags := 0;
        lpOriginator := nil; 
        nRecipCount := 0;
        lpRecips := nil;
        nFileCount := 0;
        lpFiles := nil; 
      end;
     
      MError := MapiSendMail(0, Application.Handle, MapiMessage,         
        MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0);
      if MError <> 0 then MessageDlg(SSendError, mtError, [mbOK], 0);
    end;
     
    procedure TWin2kAppForm.FileExit1Execute(Sender: TObject);
    begin
      Close;
    end;
     
    procedure TWin2kAppForm.HelpAbout1Execute(Sender: TObject);
    begin
      AboutBox.ShowModal;
    end;
     
    procedure TWin2kAppForm.FormCreate(Sender: TObject);
    Var Abitmap : Tbitmap;
    begin
      ABitmap := Tbitmap.Create;
      Abitmap.LoadFromFile('C:\Program Files\Fichiers communs\Borland Shared\Images\Buttons\DoorOpen.bmp');
      FDoorOpenIndex := imagelist1.AddMasked( Abitmap, ClOlive);
      Abitmap.LoadFromFile('C:\Program Files\Fichiers communs\Borland Shared\Images\Buttons\DoorShut.bmp');
      FDoorShutIndex := Imagelist1.AddMasked( Abitmap, ClOlive);
      Abitmap.LoadFromFile('C:\Program Files\Fichiers communs\Borland Shared\Images\Buttons\Phone.bmp');
      FPhoneIndex := Imagelist1.AddMasked( Abitmap, ClOlive);
      Abitmap.LoadFromFile('C:\Program Files\Fichiers communs\Borland Shared\Images\Buttons\PhoneRng.bmp');
      FPhoneRngIndex := Imagelist1.AddMasked( Abitmap, ClOlive);
      Abitmap.Free;
     
      FileNew1.Execute; { sets the default file name and clears the RichEdit Control }
    end;
     
     
    procedure TWin2kAppForm.FileExitItemDrawItem(Sender: TObject;
      ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
    Var
    DrawRect : Trect;
    AText : String;
    begin
    if selected then
      Begin
      DrawRect := rect(Arect.Left , Arect.Top ,
        Arect.Left + 2 + imagelist1.Width, Arect.Bottom - 1 );
      DrawEdge( ACanvas.Handle, DrawRect, BDR_RAISEDINNER	,BF_RECT);
     
      DrawRect := rect( DrawRect.Left + 1 , DrawRect.Top + 1,
        DrawRect.Right - 1, DrawRect.Bottom - 1);
      imagelist1.Draw(ACanvas, Drawrect.left , Drawrect.top , FDoorOpenIndex);
     
      DrawRect := rect( Arect.Left + 3 + imagelist1.Width, Arect.Top ,
        Arect.Right - 1, Arect.Bottom - 1);
      Acanvas.Brush.Color := clHighlight;
      Acanvas.Font.Color := clHighlightText;
      Acanvas.FillRect(Drawrect);
      end
    else
      Begin
      ACanvas.Brush.Color := clMenu;
      ACanvas.Font.Color := clMenuText;
      Acanvas.FillRect(Arect);
      imagelist1.Draw(ACanvas, Arect.left + 1, Arect.top + 1, FDoorShutIndex);
      End;
    drawrect := rect( Arect.Left + 22, Arect.top + 3, arect.Right, Arect.Bottom);
    AText := (sender as Tmenuitem).caption;
    DrawText( Acanvas.Handle, pchar(atext), length(atext), drawrect, DT_LEFT	);
    end;
     
    procedure TWin2kAppForm.Help1DrawItem(Sender: TObject; ACanvas: TCanvas;
      ARect: TRect; Selected: Boolean);
    Var
    Atext : String;
    DrawRect : Trect;
    begin
    Acanvas.FillRect( Arect);
    if selected then
      Begin
      DrawEdge( ACanvas.Handle,ARect, BDR_SUNKENOUTER	,BF_RECT);
      DrawRect := rect(Arect.Left , Arect.Top ,
        Arect.Left + 2 + imagelist1.Width, Arect.Bottom - 1 );
      imagelist1.Draw(ACanvas, Arect.left + 1, Arect.top + 1, FPhoneRngIndex);
      end
    else
      Begin
      DrawRect := rect(Arect.Left , Arect.Top ,
        Arect.Left + 2 + imagelist1.Width, Arect.Bottom - 1 );
      imagelist1.Draw(ACanvas, Arect.left + 1, Arect.top + 1, FPhoneIndex);
      End;
     
    drawrect := rect( Arect.Left + 22, Arect.top + 1, arect.Right, Arect.Bottom);
    AText := (sender as Tmenuitem).caption;
    DrawText( Acanvas.Handle, pchar(atext), length(atext), drawrect, DT_LEFT	);
    end;
     
    procedure TWin2kAppForm.Help1MeasureItem(Sender: TObject; ACanvas: TCanvas;
      var Width, Height: Integer);
    begin
    Width := width + imagelist1.Width + 4;
    end;
     
    end.

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    c'est une superbe idée
    Citation Envoyé par waskol
    Par contre, je vous autorise à utiliser le code de Borland si vous en avez besoin (VCL, RTL)
    Je me permets de préciser :
    à l'utiliser au travers de composants et appels de fonction/procédure et non à pas à reprendre et publiciter le code de la VCL et du runtime, cf. copyright.

  9. #9
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Laurent Dardenne
    Salut,
    c'est une superbe idée
    Merci beaucoup !
    Et puis j'en ai d'autres en stock des comme ça... :p

    Citation Envoyé par Laurent Dardenne
    à l'utiliser au travers de composants et appels de fonction/procédure et non à pas à reprendre et publiciter le code de la VCL et du runtime, cf. copyright.
    Of course !


    Pour bjl, je teste ça demain matin
    Bidouilleuse Delphi

  10. #10
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par bjl
    bonjour, un petit essai


    C'est un bel essai, mais il y a des problèmes de couleur avec l'Item de menu 'Aide' qui se retrouve être de la même couleur que le menu qui se déroule mais pas de la même couleur que ses voisins 'Fichier' et 'Edition'

    Pareil avec l'Item 'Quitter', l'image de menu n'est pas "enrobée" par la couleur "Highlight" comme le texte lui même.

    En tout cas, bravo !
    Bidouilleuse Delphi

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    salut

    modif sur le code de bjl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
     
    procedure TWin2kAppForm.FileExitItemDrawItem(Sender: TObject;
      ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
    Var
      OutRect  : Trect;
      AText : String;
      fo : Tfont;
      Brush : TBrush;
    begin
       AText := (sender as Tmenuitem).caption;
      OutRect := ARect;
      OutRect.Right := OutRect.Left   +imagelist1.Width+4;
      OutRect.Top   := OutRect.Bottom -imagelist1.Height-4;
      OutRect.Right := OutRect.Left   +imagelist1.Width  + 4;
      OutRect.Top   := OutRect.Bottom -imagelist1.Height - 4;
      InflateRect(OutRect, 0,-1);
     
      if selected then
      Begin
        DrawEdge(ACanvas.Handle, OutRect, BDR_RAISEDINNER   ,BF_RECT);
        InflateRect(OutRect, -2,-1);
        imagelist1.Draw(ACanvas,OutRect.left , OutRect.top , FDoorOpenIndex);
      end
      else
      Begin
        Acanvas.FillRect(OutRect);
        InflateRect(OutRect, -2,-1);
        imagelist1.Draw(ACanvas, OutRect.left, OutRect.top , FDoorShutIndex);
      End;
      OutRect := ARect;
      MyDrawText(Acanvas,OutRect,atext);
    end;


    Je m'occupe de l'aide ensuite

    bon apres inspection j'utilise pas le meme evenement et j'ai creer une methode supplementaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    Procedure TWin2kAppForm.MyDrawText(Acanvas : Tcanvas;var outrect : trect;atext : String);
    begin
      InflateRect(OutRect,-1,-1);
      OutRect.Left  := OutRect.Left   +imagelist1.Width  + 4;
      OutRect.Top   := OutRect.Bottom -imagelist1.Height - 2;
      Acanvas.FillRect(OutRect);
      InflateRect(OutRect, -2,0);
      DrawText( Acanvas.Handle, pchar(atext), length(atext), OutRect, DT_LEFT   );
    end;
     
    procedure TWin2kAppForm.Help1AdvancedDrawItem(Sender: TObject;
      ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState);
    var
     selected : boolean;
     Atext : String;
     OutRect   : Trect;
    begin
      AText := (sender as Tmenuitem).caption;
      OutRect := Arect;
     
      Acanvas.FillRect(Arect);
      InflateRect(OutRect,-1,-1);
      OutRect.Left := OutRect.Left+2;
      OutRect.Right := OutRect.Left + 2 + imagelist1.Width;
      if odHotLight in State then
      begin
        DrawEdge(ACanvas.Handle,Arect, BDR_RAISEDINNER,BF_RECT);
      end;
     
      selected := odselected in State;
      if selected then
      Begin
        DrawEdge( ACanvas.Handle,ARect, BDR_SUNKENOUTER   ,BF_RECT);
        imagelist1.Draw(ACanvas, OutRect.left , OutRect.top , FPhoneRngIndex);
      end
      else
      Begin
        imagelist1.Draw(ACanvas,OutRect.left , OutRect.top, FPhoneIndex);
      End;
       OutRect := ARect;
       MyDrawText(Acanvas,OutRect,atext);
    end;
    a savoir on peut deporter l'ecriture de texte dans une methode
    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  12. #12
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Hé bien ça n'est pas mal tout ça ! Félicitations à vous 3, on peut vous applaudir très fort

    Cependant, Il y a toujours un problème de coloration d'item qui persiste et ce qui serait bien, c'est d'avoir ce genre de code sous forme de procedure par exemple afin qu'il soit réutilisable.

    Je vous posterais mon code bientôt
    Bidouilleuse Delphi

  13. #13
    Membre averti
    Avatar de Hauwke
    Inscrit en
    Septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 329
    Points : 400
    Points
    400
    Par défaut
    Bonjour,
    Citation Envoyé par Waskol
    Je vous posterais mon code bientôt
    La publication du résultat n'était-elle pas prévu samedi soir avant un départ en vacances?
    Cordialement,
    Hauwke

  14. #14
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Hauwke
    Bonjour,
    Citation Envoyé par Waskol
    Je vous posterais mon code bientôt
    La publication du résultat n'était-elle pas prévu samedi soir avant un départ en vacances?
    Cordialement,
    Hauwke
    Excusez , moi pour le bientôt , prenez le comme si c'était "Samedi soir".

    Et bien sur, le défi reste toujours ouvert jusqu'à Samedi soir

    C'était histoire d'encourager les concurents (ils en ont bien besoin), et inciter de nouveaux participants à poster leur code
    Bidouilleuse Delphi

  15. #15
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    salut

    Dit m'en plus sur le probleme de coloration
    j'ai pas vu le probleme a quelle momment intervient il ?

    Pour paufiner mes petite fonction

    bon en attendant ta reponse voila sous forme de procedure non object

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    Procedure MyDrawText(Acanvas : Tcanvas;var outrect : trect;Width,Height: Integer;atext : String);
    begin
      InflateRect(OutRect,-1,-1);
      OutRect.Left  := OutRect.Left   +Width  + 4;
      OutRect.Top   := OutRect.Bottom -Height - 2;
      Acanvas.FillRect(OutRect);
      InflateRect(OutRect, -2,0);
      DrawText( Acanvas.Handle, pchar(atext), length(atext), OutRect, DT_LEFT   );
    end;
     
    Procedure DessItemmenu(ACanvas : Tcanvas;Img : Timagelist;ARect: Trect;selected : Boolean;index1,index2 : integer;AText : String );
    Var
      OutRect  : Trect;
    Begin
      OutRect := ARect;
      OutRect.Right := OutRect.Left   +Img.Width+4;
      OutRect.Top   := OutRect.Bottom -Img.Height-4;
      OutRect.Right := OutRect.Left   +Img.Width  + 4;
      OutRect.Top   := OutRect.Bottom -Img.Height - 4;
      InflateRect(OutRect, 0,-1);
     
      if selected then
      Begin
        DrawEdge(ACanvas.Handle, OutRect, BDR_RAISEDINNER   ,BF_RECT);
        InflateRect(OutRect, -2,-1);
        img.Draw(ACanvas,OutRect.left , OutRect.top , index1);
      end
      else
      Begin
        Acanvas.FillRect(OutRect);
        InflateRect(OutRect, -2,-1);
        img.Draw(ACanvas, OutRect.left, OutRect.top , index2);
      End;
      OutRect := ARect;
      MyDrawText(Acanvas,OutRect,img.Width,img.Height,atext);
    end;
     
    Procedure DessAdvItemmenu(ACanvas : Tcanvas;Img : Timagelist;ARect: Trect;State : TOwnerDrawState;index1,index2 : integer;AText : String );
    var
     selected : boolean;
     OutRect   : Trect;
    Begin
      OutRect := Arect;
      Acanvas.FillRect(Arect);
      InflateRect(OutRect,-1,-1);
      OutRect.Left := OutRect.Left+2;
      OutRect.Right := OutRect.Left + 2 + img.Width;
      if odHotLight in State then
      begin
        DrawEdge(ACanvas.Handle,Arect, BDR_RAISEDINNER,BF_RECT);
      end;
     
      selected := odselected in State;
      if selected then
      Begin
        DrawEdge( ACanvas.Handle,ARect, BDR_SUNKENOUTER   ,BF_RECT);
        img.Draw(ACanvas, OutRect.left , OutRect.top ,index2);
      end
      else
      Begin
        img.Draw(ACanvas,OutRect.left , OutRect.top, index1);
      End;
      OutRect := ARect;
      MyDrawText(Acanvas,OutRect,img.Width,img.Height,atext);
    End;
     
    procedure TWin2kAppForm.FileExitItemDrawItem(Sender: TObject;
      ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
    begin
      DessItemmenu(ACanvas,ImageList1,ARect,selected,FDoorOpenIndex,FDoorShutIndex,(sender as Tmenuitem).caption);
    end;
    procedure TWin2kAppForm.Help1AdvancedDrawItem(Sender: TObject;
      ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState);
    begin
      DessAdvItemmenu(ACanvas,ImageList1,ARect,state,FPhoneIndex,FPhoneRngIndex,(Sender as TMENUITEM).caption );
    end;
     
    procedure TWin2kAppForm.Help1MeasureItem(Sender: TObject; ACanvas: TCanvas;
      var Width, Height: Integer);
    begin
      Width := width + imagelist1.Width + 4;
    end;
    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  16. #16
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Je tourne sous Windows XP avec le theme "Vert Olive" (Propriétés d'affichage--> Apparences)
    Bidouilleuse Delphi

  17. #17
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    salut

    a bin oui je voi mieux maintenant le probleme
    bon je vais corriger le bug du tmainmenu

    voila le resultat des course

    a mettre dans le Formcreate

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      For i:=0 to Pred(MainMenu1.Items.Count) do
      Begin
        if i = 2 Then
          MainMenu1.Items[i].OnAdvancedDrawItem := Help1AdvancedDrawItem
        else
          MainMenu1.Items[i].OnAdvancedDrawItem := OnadAdvItemmenu;
      end;
    annule et remplace les autre code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    Procedure MyDrawText(Acanvas : Tcanvas;var outrect : trect;img : TimageList;atext : String);
    begin
      InflateRect(OutRect,-1,-1);
      if assigned(img) Then
      begin
        OutRect.Left  := OutRect.Left   +img.Width  + 4;
        OutRect.Top   := OutRect.Bottom -img.Height - 2;
      end;
      Acanvas.FillRect(OutRect);
      InflateRect(OutRect, -2,0);
      DrawText( Acanvas.Handle, pchar(atext), length(atext), OutRect, DT_LEFT   );
    end;
     
    Procedure TWin2kAppForm.MyDrawMainMenuitem(Sender: TObject;
      ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
    Begin
      ACanvas.Brush.Color := clOlive;
      MyDrawText(Acanvas,ARect,nil,(Sender as TMenuItem).caption);
    End;
     
    Procedure DessItemmenu(ACanvas : Tcanvas;Img : Timagelist;ARect: Trect;selected : Boolean;index1,index2 : integer;AText : String );
    Var
      OutRect  : Trect;
    Begin
      OutRect := ARect;
      OutRect.Right := OutRect.Left   +Img.Width+4;
      OutRect.Top   := OutRect.Bottom -Img.Height-4;
      OutRect.Right := OutRect.Left   +Img.Width  + 4;
      OutRect.Top   := OutRect.Bottom -Img.Height - 4;
      InflateRect(OutRect, 0,-1);
     
      if selected then
      Begin
        DrawEdge(ACanvas.Handle, OutRect, BDR_RAISEDINNER   ,BF_RECT);
        InflateRect(OutRect, -2,-1);
        img.Draw(ACanvas,OutRect.left , OutRect.top , index1);
      end
      else
      Begin
        Acanvas.FillRect(OutRect);
        InflateRect(OutRect, -2,-1);
        img.Draw(ACanvas, OutRect.left, OutRect.top , index2);
      End;
      OutRect := ARect;
      MyDrawText(Acanvas,OutRect,img,atext);
    end;
     
    Procedure DessAdvItemmenu(ACanvas : Tcanvas;Img : Timagelist;ARect: Trect;State : TOwnerDrawState;index1,index2 : integer;AText : String );
    var
     selected : boolean;
     OutRect   : Trect;
    Begin
      selected := odselected in State;
      OutRect := Arect;
      if not(selected) Then
        ACanvas.Brush.Color := clBtnFace
      else
        ACanvas.Brush.Color := clHighlight ;
     
      Acanvas.FillRect(Arect);
      if odHotLight in State then
      begin
        DrawEdge(ACanvas.Handle,Arect, BDR_RAISEDINNER,BF_RECT);
      end;
     
      InflateRect(OutRect,-1,-1);
      OutRect.Left := OutRect.Left+2;
      If Assigned(img) Then
      begin
        OutRect.Right := OutRect.Left + 2 + img.Width;
        if selected then
        Begin
          DrawEdge( ACanvas.Handle,ARect, BDR_SUNKENOUTER   ,BF_RECT);
          img.Draw(ACanvas, OutRect.left , OutRect.top ,index2);
        end
        else
        Begin
          img.Draw(ACanvas,OutRect.left , OutRect.top, index1);
        End;
      end;
      OutRect := ARect;
      MyDrawText(Acanvas,OutRect,img,atext);
    End;
    procedure TWin2kAppForm.OnadAdvItemmenu(Sender: TObject;
      ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState);
    begin
      DessAdvItemmenu(ACanvas,nil,ARect,state,0,0,(Sender as TMENUITEM).caption );
    end;
     
    procedure TWin2kAppForm.FileExitItemDrawItem(Sender: TObject;
      ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
    begin
      DessItemmenu(ACanvas,ImageList1,ARect,selected,FDoorOpenIndex,FDoorShutIndex,(sender as Tmenuitem).caption);
    end;
    procedure TWin2kAppForm.Help1AdvancedDrawItem(Sender: TObject;
      ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState);
    begin
      DessAdvItemmenu(ACanvas,ImageList1,ARect,state,FPhoneIndex,FPhoneRngIndex,(Sender as TMENUITEM).caption );
    end;
     
     
    procedure TWin2kAppForm.Help1MeasureItem(Sender: TObject; ACanvas: TCanvas;
      var Width, Height: Integer);
    begin
      Width := width + imagelist1.Width + 4;
    end;

    bon j'en laisse un peu on peut encor ameliorer


    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  18. #18
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Ha oui, c'est bien mieux

    Sinon, comme c'est un défi, je vais vous faire, amis compétiteurs, une annonce qui va vous mettre sur le flanc, en émoi profond, vous rendre sceptique, impatients, etc...

    La solution que je vous posterais Samedi soir, en même temps que les résultats :
    - Ne contient aucun code de la VCL Borland
    - Pas une seule ligne de code de dessin (DrawEdge, Draw, DrawText, etc...)
    - est 100% réutilisable et respecte les themes, les couleurs et tout et tout
    - est franchement tordue et pas belle du tout

    J'attend donc vos idée de génie.

    Sinon, en classement provisoire, nous avons d'après mes critères :
    - d'une très courte tête : anapurna
    - exequo : portu et bjl
    Bidouilleuse Delphi

  19. #19
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par waskol
    Ha oui, c'est bien mieux

    Sinon, comme c'est un défi, je vais vous faire, amis compétiteurs, une annonce qui va vous mettre sur le flanc, en émoi profond, vous rendre sceptique, impatients, etc...

    La solution que je vous posterais Samedi soir, en même temps que les résultat :
    - Ne contient aucun code de la VCL Borland
    - Pas une seule ligne de code de dessin (DrawEdge, Draw, DrawText, etc...)
    - est 100% réutilisable et respecte les themes, les couleurs et tout et tout
    - est franchement tordue et pas belle du tout


    J'attend donc vos idée de génie.

    Sinon, en classement provisoire, nous avons d'après mes critères :
    - d'une très courte tête : anapurna
    - exequo : portu et bjl
    Figure toi que je m'y attendais à celle là .
    J'ai un peu cherché un truc tordu mais ne donne rien. Je chercherai encore demain et je compte bien trouver la solution

  20. #20
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par portu
    Figure toi que je m'y attendais à celle là .
    J'ai un peu cherché un truc tordu mais ne donne rien. Je chercherai encore demain et je compte bien trouver la solution
    En fait, j'ai une solution beaucoup plus propre, mais qui réutilise 80% du code de Borland. Comme il y a du Copyright, ce n'est pas "postable" sur le forum.

    J'en toucherais quand même un mot à l'occasion, pour dire comment faire.

    Bref, en fait, j'ai deux solutions à disposition : une "clean" mais improposable, l'autre tordue mais 100% OpenSource faite maison
    Bidouilleuse Delphi

Discussions similaires

  1. [Customer Portal] FAQ améliorée avec Salesforce.
    Par Tiffado dans le forum Salesforce.com
    Réponses: 7
    Dernier message: 16/05/2012, 14h19
  2. [CSS] [FAQ] Améliorer la qualité du rendu des images strechées
    Par FremyCompany dans le forum Contribuez
    Réponses: 0
    Dernier message: 21/05/2007, 18h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo