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

Delphi Discussion :

Griser une fenêtre en arrière plan


Sujet :

Delphi

  1. #41
    Membre habitué
    Inscrit en
    Octobre 2002
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 343
    Points : 152
    Points
    152
    Par défaut
    kurkaine a écrit :
    ne pas surcharger mon application avec des fenêtres superposé.
    En fait, je n'ai toujours pas pu tester votre programme, j'ai des problèmes pour adapter en C++. Mais j'y arriverai... J'espère.

    Ce que je voulais dire, c'est que mon app est MDI. Disons que j'ai une fiche qui gère les clients. Ensuite, l'utilisateur peut ouvrir une fiche pour ajouter des clients (non MDI). Déjà à ce niveau, je souhaiterai griser la fenêtre de gestion des clients, car j'ai remarqué que certain utilisateur (novice) avait du mal à se repérer et aussi pour des raisons d'IHM. Durant la phase d'insertion d'un nouveau client, l'utilisateur peut faire une erreur d'insertion et je lui envoie un messg d'erreur, ce qui fait que j'ai trois fenêtre superposé.

    Donc voilà, la fenêtre en premier plan doit être la seule normale. Je suis très très impatient de tester votre programme.

  2. #42
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par aityahia
    j'ai juste changer 'activeform par Application.MainForm
    Je ne suis pas d'accord avec ça. Car si je suis dans une application avec des fenêtres normal et que j'appelle plusieurs showmodal les uns à la suite des autres. Au bout du deuxième appel la fenêtre que je dois griser, n'est plus la MainForm, mais bien celle qui est active. C'est pour ça qu'il faut à mon avis laisser ActiveForm. Ensuite je ne vois pas comment la MainForm peut être de type MDIChild, elle sera forcément de type MDIForm (Dans le cas des applications MDI bien sur). Je reposte une nouvelle version dans la matinée pour la gestion de toutes les fenêtres.

  3. #43
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    quand on exécute la fonction sur la mainform toutes les fiche MDIchild enfants son griser dans un seul bitmap qui reflete tutes les fiche, tu peut faire un test

  4. #44
    Membre habitué
    Inscrit en
    Octobre 2002
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 343
    Points : 152
    Points
    152
    Par défaut Conversion C++
    Bon, j'ai réussi à convertir le code en c++ builder. Mais j'ai des erreurs d'affichage et je ne vois pas d'ou elle sort :

    - Clique sur un bouton pour ouvrir la fiche 2en ShowModal : La fiche principale est vide, c'est à dire aucun composant n'est affiché. Je dois mettre le ShowModal après FormGrise.Release pour résoudre ce pb.

    - Lorsque je ferme la fiche 2, alors la fiche 1 (principale) est grisée... Lorsque je ré-appuie sur le bouton pour ouvrir la fiche 2, il se passe la même chose, sauf que si je ferme la fiche 2, ma fiche 1 est invisible et et il s'est passé qq chose d'étrange : à la place de ma fiche 1, j'ai une capture d'écran grisé de la taille de ma fiche 1.

    - Lorsque je ferme la fiche 2, mon appli reste grisé !!!!

    Ce pb peut-être résolu ?

  5. #45
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Me revoila. j'ai finalement changé la manière de faire. Maintenant lorsqu'on grise, on ne grise que la partie client de la fenêtre et l'on créé une frame que l'on met en premier plan sur la fenêtre qui contient l'image grisé. Beaucoup plus simple je trouve, et du coup cela marche avec les fenêtres MDI et Normal. J'ai également rajouté un paramètre (Optionnel bien sur) pour dire si l'on grise juste la fenêtre qui appelle le showmodal ou toutes les fenêtres.

    Voici la nouvelle unité :

    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
    {*------------------------------------------------------------------------------
     Unité permettant de griser une form lorsqu'elle appelle un showmodal pour
     en afficher une autre
     
     @Author    tiki06 (Avec l'aide de Sub0)
     @Version   02-août-2006 Version initiale
     @Version   04-août-2006 Changement complet dans la manière de griser les fenêtres
    -------------------------------------------------------------------------------}
    Unit UGriserForm;
     
    Interface
     
    Uses Windows, Forms, Types, Graphics, ExtCtrls, SysUtils, Controls;
     
     
    const
      PIXELCOUNTMAX = 32768;
      WS_EX_LAYERED = $80000;
      FRAME_NAME    = 'GrayScaleFrame';
     
     
    type
      pRGBArray   = ^TRGBArray;
      TRGBArray   = ARRAY[0..PIXELCOUNTMAX-1] OF TRGBTriple;
     
      TFormToDisable = (FdCurrentWindow,
                        FdAllWindows);
     
     
    Procedure GriserFenetre(FenetreAGriser: TForm);
    Procedure ReactiverFenetreNormal(FenetreAReactiver: TForm);
    Function  CustomShowModal(Fenetre: TForm; FormToDisable: TFormToDisable = FdCurrentWindow):integer;
     
     
    implementation
     
     
    {*----------------------------------------------------------------------------
      procedure pour griser la fenêtre passé en paramètre
     
      @param    FenetreAGriser Form a griser
    -----------------------------------------------------------------------------}
    Procedure GriserFenetre(FenetreAGriser: TForm);
    var
      WindowHandle          : THandle;
      deviceContext         : HDC;
      BitmapForm            : Tbitmap;
      icolor                : integer;
      r,g,b                 : byte;
      iheight,iwidth        : integer;
      RowOriginal           : pRGBArray;
      FrameGrise            : TFrame;
    begin
      if (FenetreAGriser.FindComponent(FRAME_NAME)=nil) then
      begin
        WindowHandle:= FenetreAGriser.Handle;
        deviceContext:= GetDC(WindowHandle);
        try
          BitmapForm             := Tbitmap.Create;
          BitmapForm.PixelFormat := pf24bit;
          BitmapForm.Width       := FenetreAGriser.ClientWidth;
          BitmapForm.Height      := FenetreAGriser.ClientHeight;
     
          BitBlt(BitmapForm.Canvas.Handle, 0, 0, BitmapForm.Width, BitmapForm.Height,
            deviceContext, 0, 0, SRCCOPY);
     
        finally
          ReleaseDC(WindowHandle, deviceContext);
        end;
     
        for iHeight := 0 to BitmapForm.height-1 do
        begin
          RowOriginal  := pRGBArray(BitmapForm.Scanline[iHeight]);
          for iWidth := 0 to BitmapForm.width-1 do
          begin
            r:=RowOriginal[iWidth].rgbtRed;
            g:=RowOriginal[iWidth].rgbtGreen;
            b:=RowOriginal[iWidth].rgbtBlue;
            icolor:=(r+g+b) div 3;
            RowOriginal[iWidth].rgbtRed   := icolor;
            RowOriginal[iWidth].rgbtGreen := icolor;
            RowOriginal[iWidth].rgbtBlue  := icolor;
          end;
        end;
     
        with TFrame.Create(FenetreAGriser) do
        begin
          Visible:=False;
          Name:=FRAME_NAME;
          Parent:=FenetreAGriser;
          Left:=0;
          Top:=0;
          Width:=FenetreAGriser.ClientWidth;
          Height:=FenetreAGriser.ClientHeight;
          BringToFront;
          FrameGrise:=(FenetreAGriser.FindComponent(FRAME_NAME) as TFrame);
          with TImage.Create(FenetreAGriser) do
          begin
            Align:=alClient;
            Parent:=FrameGrise;
            Picture.Bitmap.Assign(BitmapForm);
          end;
          Visible:=True;
        end;
     
      end;
    end;
     
    {*----------------------------------------------------------------------------
      procedure pour réactiver une fenêtre grisé
     
      @param    FenetreAReactiver Form a réactiver
    -----------------------------------------------------------------------------}
    Procedure ReactiverFenetreNormal(FenetreAReactiver: TForm);
    var
      FrameGrise:TFrame;
    begin
      FrameGrise:=(FenetreAReactiver.FindComponent(FRAME_NAME) as TFrame);
      if FrameGrise<>nil then FreeAndNil(FrameGrise);
    end;
     
    {*----------------------------------------------------------------------------
      Fonction pour afficher une fenêtre en showmodal et griser soit toutes les
      fenêtres affichées, soit juste celle qui appelle le showmodal
     
      @param    Fenetre        Form a afficher en Showmodal
      @param    FormToDisable  Paramètre optionnel pour déterminer si on grise
                               toutes les fenêtres (FdAllWindows) ou seulement celle
                               qui appelle le showmodal (FdCurrentWindow)
    -----------------------------------------------------------------------------}
    Function CustomShowModal(Fenetre: TForm; FormToDisable: TFormToDisable):integer;
    var
      i         : integer;
      bAppliMdi : Boolean;
    begin
      bAppliMdi:=Screen.ActiveForm.FormStyle=fsMDIChild;
      if FormToDisable=FdCurrentWindow then
        GriserFenetre(Screen.ActiveForm)
      else
      begin
        if bAppliMdi then
          GriserFenetre(Application.MainForm)
        else
        begin
          for i:=0 to Screen.FormCount-1 do
          begin
            if (Screen.Forms[i]<>nil) and
               (Screen.Forms[i]<>Fenetre) and
               (Screen.Forms[i].Visible) and
               (Screen.Forms[i].FormStyle in [fsNormal,FsStayOnTop])  then
              GriserFenetre(Screen.Forms[i])
          end;
        end;
      end;
      Result:=Fenetre.ShowModal;
      if FormToDisable=FdCurrentWindow then
        ReactiverFenetreNormal(Screen.ActiveForm)
      else
      begin
        if bAppliMdi then
          ReactiverFenetreNormal(Application.MainForm)
        else
        begin
          for i:=0 to Screen.FormCount-1 do
          begin
            if (Screen.Forms[i]<>nil) and
               (Screen.Forms[i]<>Fenetre) and
               (Screen.Forms[i].Visible) and
               (Screen.Forms[i].FormStyle in [fsNormal,FsStayOnTop])  then
              ReactiverFenetreNormal(Screen.Forms[i])
          end;
        end;
      end;
    end;
     
     
    End.

    Du coup désolé pour toi kurkaine il va falloir que tu revois ton code. mais c'est vrai que j'aurais du mal à t'aider ne connaissant pas le C++. Il faudrait trouver quelqu'un sur le site connaissant les 2 pour t'aider là dessus. Il doit bien y en avoir. aityahia je te laisse faire des test avec l'unité.

  6. #46
    Membre habitué
    Inscrit en
    Octobre 2002
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 343
    Points : 152
    Points
    152
    Par défaut
    L'espoir fait vivre
    Quand y'a de la vie y'a d'lespoir

    Bah, j'en presque fait une histoire personel, alors... Si ça marche après, je me met au Delphi ...

    PS: le c++ me parait plus complexe et limité d'un point de vue langage de programmation (que si on compare les possibilitées d'écriture, pas les performances que je ne connais absolument pas). Par exemple "if BorderStyle in [bsSingle,bsToolWindow]" n'est pas possible en C++. De plus, je trouve le Delphi bien plus proche de l'algorithmie, c'est sympa

  7. #47
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Par exemple "if BorderStyle in [bsSingle,bsToolWindow]" n'est pas possible en C++.
    Ca tombe bien car si tu regarde bien le dernier code on utilise plus cette partie là.
    Si tu as des questions sur le code en Delphi code n'hésite pas par contre.

    Allez courage.

  8. #48
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    j'ai testé sa marche bien mais tous de meme j'ai une petit remarque la bare de titre et toujour en couleur ce qui est un peut


    pour kurkaine

    possible que je vais traduire ce code en C++ j'ai déja fais sa plusieur fois

    de C++ -> delphi et de delphi-> C++

  9. #49
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par aityahia
    j'ai testé sa marche bien mais tous de meme j'ai une petit remarque la bare de titre et toujour en couleur ce qui est un peut


    pour kurkaine

    possible que je vais traduire ce code en C++ j'ai déja fais sa plusieur fois

    de C++ -> delphi et de delphi-> C++
    Je sais pour la barre de titre, mais c'est une solution plus simple et surtout qui permet de moins se prendre la tête avec les border... etc et qui simplifie aussi entre le MDI et le non MDI.
    Bonne nouvelle pour kurkaine, ça serait sympa si on arrivait à avoir une version Delphi et C++ de l'unité. De quoi nourrir la rubrique sources des 2 langages.

    Bon on va partir sur cette version. je vais faire un composant et une unité de tout ça, rajouter quelques exemples d'utilisation puis je zip le tout et l'envoi au responsable de la rubrique Sources Delphi. Je vous laisse faire pour la version C++ car là je ne vous serais pas d'un grand secours.

  10. #50
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Salut à tous.

    Bon, j'arrive peut-être un peu après la bataille, j'espère qu'il n'est pas trop tard, j'ai mon grain de sel à mettre :
    j'ai bien compris l'idée de griser une form qui devient inactive quand elle en appelle une autre, et ch'suis d'accord, mais y a un truc strange :
    j'ai joué avec une form bleue, pour voir : ben elle devient grise aussi, et ça,
    ça risque de surprendre *grave* un utilisateur non averti !

    Car dans le monde de maintenant, les forms avec la couleur clBtnFace y en a de - en -, j'ai l'impression...

    Et si une form a des couleurs diverses et variées (shapes...) et que toutes les couleurs se barrent d'un coup, je vous dis pas la tête de Joe User !

    Faudrait peut-être repenser le truc en remplaçant "griser" par "assombrir".
    Ch'sais pas si c'est possible, par contre.

    Autre chose : si l'on rajoute un StatusBar à la Mainform, il lui apparaît les ascenceurs quand elle se grise...

    Mes 2 cts,
    JP

  11. #51
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Salut Jipété et pas de problème pour tes remarques elles sont toutes bonnes à prendre. Par contre fait le test en mettant plein de choses de couleurs différentes sur ta form et tu verras que tout est gris mais que les tons de gris ne sont pas les mêmes en fonction des couleurs que tu as. il y en a bien des plus ou moins sombre, ou plus ou moins clairs selon les couleurs initiales. Le but était de mettre la fenêtre grisé car elle devient inactive. et les couleurs reviennet quand elle reprend le focus. Beaucoup de composant sous windows et dans Delphi quand tu les désactive ou les mets en enabled:=False se retrouvent grisés. Mais je comprends ta remarque. Ceci dit je pense qu'il y aura toujours des utilisateurs qui seront perdus avec cette méthode, et d'autres qui trouveront que la méthode que tu proposes (Juste assombrir) n'est pas terrible non plus. Le Top serait une unité qui permet de faire les 2 (Ca me donne des idées, je vais m'y pencher, voir ce que l'on peut pondre). Restez à l'écoute, je vous tiens au courant (Après ce week-end par contre, car là ou je vais pas de PC...).

    Par contre pour la statusbar je vais jeter un oeil pour voir ce que cela fait et essayer de trouver une solution.

    PS : Bon week-end à tous et si vous avez des idées ou remarques que vous avancez sur des choses concernant le dev, n'hésitez pas..

    A+.

  12. #52
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Avec des images ça sera plus parlant !


    Or donc ci-dessous une form moche, avec des couleurs affreuses, avec tout en haut une ToolBar, dessous une CoolBar, dessous une Shape, puis un Memo, une ListView et un TreeView :


    Un truc sympa, je crois, ça serait :


    Hélas, on gagne ça :


    Pas très fun, isn't ?

    Alors je pense qu'il faudrait, en début de procédure "grisante" :
    1- faire une copie écran de la form appelante ;
    2- triturer graphiquement l'image résultante (la mienne est une simple diminution de la luminosité, 25% de moins) ;
    3- créer une form sans titre sans bordures sans rien, avec juste une image, *cette* image modifiée, justement ;
    4- et la faire afficher devant la form appelante, puis faire afficher Form2 ;
    5- au close de Form2 on détruit l'image et la form qui la contenait.

    Facile à écrire, mais hélas je n'y connais rien en graphisme sous Delphi... :-(

    Mes 2 cts,
    JP

  13. #53
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Et voila la nouvelle version de notre unité. J'ai résolu le problème des scrollbar lors des statusBar sur la Form, et j'ai rajouté des paramètres (Optionnel bien sur) pour définir comment on souhaite désactiver la Form pour pouvoir soit la griser, l'assombrir ou l'éclaircir.

    Voici le 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
    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
    {*------------------------------------------------------------------------------
     Unité permettant de désactiver une form lorsqu'elle appelle un showmodal pour
     en afficher une autre(Avec différentes méthodes : griser, assombrir, eclaircir)
     
     @Author    tiki06 (Avec l'aide de Sub0)
     @Version   02-août-2006 Version initiale
     @Version   04-août-2006 Changement complet dans la manière de griser les fenêtres
     @Version   07-août-2006 Correction pour le problème des scrollBar quand il y
                             a une StatusBar sur la Form. Ajout de différente méthodes
                             pour désactiver la Form : Griser, Assombrir, Eclaircir
    -------------------------------------------------------------------------------}
    Unit UDisableForm;
     
    Interface
     
    Uses Windows, Forms, Types, Graphics, ExtCtrls, SysUtils, Controls, Math;
     
     
    const
      PIXELCOUNTMAX   = 32768;
      WS_EX_LAYERED   = $80000;
      FRAME_NAME      = 'DisableFrame';
      DEFAULT_PERCENT = 40;
     
     
    type
      pRGBArray   = ^TRGBArray;
      TRGBArray   = ARRAY[0..PIXELCOUNTMAX-1] OF TRGBTriple;
     
      TFormToDisable = (FdCurrentWindow, FdAllWindows);
     
      TDisableMethod = (DmGrayscaleForm, DmDarkForm, DmLightForm);
     
     
    Procedure ChangerCouleursPixels(Var PixelAChanger:TRGBTriple; DisableMethod:TDisableMethod; Pourcentage: Integer);
    Procedure GriserFenetre(FenetreAGriser: TForm; DisableMethod:TDisableMethod; Pourcentage: Integer);
    Procedure ReactiverFenetreNormal(FenetreAReactiver: TForm);
    Function  CustomShowModal(Fenetre: TForm; FormToDisable: TFormToDisable = FdCurrentWindow; DisableMethod:TDisableMethod = DmGrayscaleForm; Pourcentage : Integer = DEFAULT_PERCENT):integer;
     
     
    implementation
     
     
    var
      bVertScrl, bHorzScrl : Boolean;
     
     
    {*------------------------------------------------------------------------------
      procedure pour changer la couleur d'un pixel passé en paramètre
     
      @param    PixelAChanger  Pixel sur lequel il faut changer la couleur
      @param    DisableMethod  Méthode pour désactiver la Form : Griser    : DmGrayscaleForm
                                                                 Assombrir : DmDarkForm
                                                                 Eclaircir : DmLightForm
      @param    Pourcentage    Pourcentage pour les méthodes Assombrir et Eclaircir
    -------------------------------------------------------------------------------}
    Procedure ChangerCouleursPixels(Var PixelAChanger:TRGBTriple; DisableMethod:TDisableMethod; Pourcentage: Integer);
    Var
      icolor                : integer;
      r,g,b                 : byte;
    begin
      Case DisableMethod of
     
      DmGrayscaleForm:    /// Griser la Form
        begin
          r:=PixelAChanger.rgbtRed;
          g:=PixelAChanger.rgbtGreen;
          b:=PixelAChanger.rgbtBlue;
          icolor:=(r+g+b) div 3;
          PixelAChanger.rgbtRed   := icolor;
          PixelAChanger.rgbtGreen := icolor;
          PixelAChanger.rgbtBlue  := icolor;
        end;
     
      DmDarkForm:         /// Assombrir la Form
        begin
          r:=PixelAChanger.rgbtRed;
          g:=PixelAChanger.rgbtGreen;
          b:=PixelAChanger.rgbtBlue;
          PixelAChanger.rgbtRed   := Max(Min(Round(r*Pourcentage/100), 255), 0);
          PixelAChanger.rgbtGreen := Max(Min(Round(g*Pourcentage/100), 255), 0);
          PixelAChanger.rgbtBlue  := Max(Min(Round(b*Pourcentage/100), 255), 0);
        end;
     
      DmLightForm:        /// Eclaircir la Form
        begin
          r:=PixelAChanger.rgbtRed;
          g:=PixelAChanger.rgbtGreen;
          b:=PixelAChanger.rgbtBlue;
          PixelAChanger.rgbtRed    := Round(R*Pourcentage/100) + Round(255 - Pourcentage/100*255);
          PixelAChanger.rgbtGreen  := Round(G*Pourcentage/100) + Round(255 - Pourcentage/100*255);
          PixelAChanger.rgbtBlue   := Round(B*Pourcentage/100) + Round(255 - Pourcentage/100*255);
        end;
     
      end;
    end;
     
    {*------------------------------------------------------------------------------
      procedure pour griser la fenêtre passé en paramètre
     
      @param    FenetreAGriser Form a griser
      @param    DisableMethod  Méthode pour désactiver la Form : Griser    : DmGrayscaleForm
                                                                 Assombrir : DmDarkForm
                                                                 Eclaircir : DmLightForm
      @param    Pourcentage    Pourcentage pour les méthodes Assombrir et Eclaircir
    -------------------------------------------------------------------------------}
    Procedure GriserFenetre(FenetreAGriser: TForm; DisableMethod:TDisableMethod; Pourcentage: Integer);
    var
      WindowHandle          : THandle;
      deviceContext         : HDC;
      BitmapForm            : Tbitmap;
      iheight,iwidth        : integer;
      RowOriginal           : pRGBArray;
      FrameGrise            : TFrame;
    begin
      if (FenetreAGriser.FindComponent(FRAME_NAME)=nil) then
      begin
        bHorzScrl:=FenetreAGriser.HorzScrollBar.Visible;
        bVertScrl:=FenetreAGriser.VertScrollBar.Visible;
        FenetreAGriser.HorzScrollBar.Visible:=False;
        FenetreAGriser.VertScrollBar.Visible:=False;
        WindowHandle:= FenetreAGriser.Handle;
        deviceContext:= GetDC(WindowHandle);
        try
          BitmapForm             := Tbitmap.Create;
          BitmapForm.PixelFormat := pf24bit;
          BitmapForm.Width       := FenetreAGriser.ClientWidth;
          BitmapForm.Height      := FenetreAGriser.ClientHeight;
     
          BitBlt(BitmapForm.Canvas.Handle, 0, 0, BitmapForm.Width, BitmapForm.Height,
            deviceContext, 0, 0, SRCCOPY);
     
        finally
          ReleaseDC(WindowHandle, deviceContext);
        end;
     
        for iHeight := 0 to BitmapForm.height-1 do
        begin
          RowOriginal  := pRGBArray(BitmapForm.Scanline[iHeight]);
          for iWidth := 0 to BitmapForm.width-1 do
          begin
            ChangerCouleursPixels(RowOriginal[iWidth],DisableMethod,Pourcentage);
          end;
        end;
     
        with TFrame.Create(FenetreAGriser) do
        begin
          Visible:=False;
          Name:=FRAME_NAME;
          Parent:=FenetreAGriser;
          Left:=0;
          Top:=0;
          Width:=FenetreAGriser.ClientWidth;
          Height:=FenetreAGriser.ClientHeight;
          HorzScrollBar.Visible:=False;
          VertScrollBar.Visible:=False;
          BringToFront;
          FrameGrise:=(FenetreAGriser.FindComponent(FRAME_NAME) as TFrame);
          with TImage.Create(FenetreAGriser) do
          begin
            Align:=alClient;
            Parent:=FrameGrise;
            Picture.Bitmap.Assign(BitmapForm);
          end;
          Visible:=True;
        end;        
     
      end;
    end;
     
    {*----------------------------------------------------------------------------
      procedure pour réactiver une fenêtre grisé
     
      @param    FenetreAReactiver Form a réactiver
    -----------------------------------------------------------------------------}
    Procedure ReactiverFenetreNormal(FenetreAReactiver: TForm);
    var
      FrameGrise:TFrame;
    begin
      FenetreAReactiver.HorzScrollBar.Visible:=bHorzScrl;
      FenetreAReactiver.VertScrollBar.Visible:=bVertScrl;
      FrameGrise:=(FenetreAReactiver.FindComponent(FRAME_NAME) as TFrame);
      if FrameGrise<>nil then FreeAndNil(FrameGrise);
    end;
     
    {*----------------------------------------------------------------------------
      Fonction pour afficher une fenêtre en showmodal et griser soit toutes les
      fenêtres affichées, soit juste celle qui appelle le showmodal
     
      @param    Fenetre        Form a afficher en Showmodal
      @param    FormToDisable  Paramètre optionnel pour déterminer si on grise
                               toutes les fenêtres (FdAllWindows) ou seulement celle
                               qui appelle le showmodal (FdCurrentWindow)
      @param    DisableMethod  Méthode pour désactiver la Form : Griser    : DmGrayscaleForm
                                                                 Assombrir : DmDarkForm
                                                                 Eclaircir : DmLightForm
      @param    Pourcentage    Pourcentage pour les méthodes Assombrir et Eclaircir
    -----------------------------------------------------------------------------}
    Function CustomShowModal(Fenetre: TForm; FormToDisable: TFormToDisable; DisableMethod:TDisableMethod; Pourcentage : Integer):integer;
    var
      i         : integer;
      bAppliMdi : Boolean;
    begin
      bAppliMdi:=Screen.ActiveForm.FormStyle=fsMDIChild;
      if FormToDisable=FdCurrentWindow then
        GriserFenetre(Screen.ActiveForm,DisableMethod,Pourcentage)
      else
      begin
        if bAppliMdi then
          GriserFenetre(Application.MainForm,DisableMethod,Pourcentage)
        else
        begin
          for i:=0 to Screen.FormCount-1 do
          begin
            if (Screen.Forms[i]<>nil) and
               (Screen.Forms[i]<>Fenetre) and
               (Screen.Forms[i].Visible) and
               (Screen.Forms[i].FormStyle in [fsNormal,FsStayOnTop])  then
              GriserFenetre(Screen.Forms[i],DisableMethod,Pourcentage)
          end;
        end;
      end;
      Result:=Fenetre.ShowModal;
      if FormToDisable=FdCurrentWindow then
        ReactiverFenetreNormal(Screen.ActiveForm)
      else
      begin
        if bAppliMdi then
          ReactiverFenetreNormal(Application.MainForm)
        else
        begin
          for i:=0 to Screen.FormCount-1 do
          begin
            if (Screen.Forms[i]<>nil) and
               (Screen.Forms[i]<>Fenetre) and
               (Screen.Forms[i].Visible) and
               (Screen.Forms[i].FormStyle in [fsNormal,FsStayOnTop])  then
              ReactiverFenetreNormal(Screen.Forms[i])
          end;
        end;
      end;
    end;
     
     
    End.

    J'attends vos commentaires.

    A+.

  14. #54
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Salustre !

    J'attends vos commentaires.
    Alors là, moi je dis BRA-VO !
    C'est GÉ-ANT !

    Tu as bien compris mes images, je viens de tester avec trois forms,
    ça fonctionne impec !

    Juste une info pour ceux qui vont vouloir jouer vite : quand je disais que j'assombrissais la luminosité de mon image de 25%, ça revient à passer 75 en paramètre (100 - 25). C'est comme ça que tu l'as codé ?
    (J'ai pas regardé le code, j'ai joué avec !)

    Merci de ce code,
    JP

  15. #55
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par Jipété
    Juste une info pour ceux qui vont vouloir jouer vite : quand je disais que j'assombrissais la luminosité de mon image de 25%, ça revient à passer 75 en paramètre (100 - 25). C'est comme ça que tu l'as codé ?
    (J'ai pas regardé le code, j'ai joué avec !)
    Oui en effet c'est bien comme ça que ça a été codé.

    Donc si tout est bon, je vais faire un zip et envoyer ça au responsable Sources Delphi.

    Bon dev.

    A+.

  16. #56
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Yep !

    Donc si tout est bon, je vais faire un zip et envoyer ça au responsable Sources Delphi.
    On se calme
    Je me prends une jolie "Violation d'accès" sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Result:=Fenetre.ShowModal;
    après avoir fait ça dans un truc à moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TMainForm.btn_testecranClick(Sender: TObject);
    begin
      with Tfrm_testecran.Create(Application) do
        //try ShowModal;
        try CustomShowModal(frm_testecran, FdCurrentWindow, DmDarkForm, 75);
        finally Free;
      end;
    end;
    Et c'est pareil sans la protection Try... Finally.

    Merdum, hein !

    JP

  17. #57
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par Jipété
    On se calme
    Je me prends une jolie "Violation d'accès" sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Result:=Fenetre.ShowModal;
    après avoir fait ça dans un truc à moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TMainForm.btn_testecranClick(Sender: TObject);
    begin
      with Tfrm_testecran.Create(Application) do
        //try ShowModal;
        try
          CustomShowModal(frm_testecran, FdCurrentWindow, DmDarkForm, 75);
        finally
          Free;
      end;
    end;
    Et c'est pareil sans la protection Try... Finally.

    Merdum, hein !

    JP
    Ok, en fait si tu vérifies bien ton code frm_testecran est à NIL quand tu appelles la fonction, car tu ne l'as pas affecté. Donc il faudrait plutôt faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TMainForm.btn_testecranClick(Sender: TObject);
    begin
      frm_testecran:=Tfrm_testecran.Create(Application);
      with frm_testecran do
        //try ShowModal;
        try 
          CustomShowModal(frm_testecran, FdCurrentWindow, DmDarkForm, 75);
        finally 
          Free;
      end;
    end;
    Ceci dit mon code avait besoin d'être amélioré car il ne prenait pas en compte ce cas là. C'est donc chose faite maintenant. Je vais attendre un peu avant le zip au cas ou quelqu'un trouve d'autres problèmes.

    A+

    PS : Juste pour donner mon avis par contre, moi je ferais plutôt un Release à la place du Free.
    Fichiers attachés Fichiers attachés

  18. #58
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    'Soir !

    Ok, en fait si tu vérifies bien ton code frm_testecran est à NIL quand tu appelles la fonction, (...)
    Impec, ton bout de code pour ma form !
    (Suis *très* fort en copier/coller mais très très moyen dans plein d'autres choses... )

    PS : Juste pour donner mon avis par contre, moi je ferais plutôt un Release à la place du Free.
    Ah OK (d'autant plus que je viens de regarder l'aide).
    Et merci (je sais plus où j'avais pompé mes qq lignes il y a longtemps...)

    Merci d'avoir corrigé mon truc, et un grand MERCI pour ton unité !

    JP

  19. #59
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    pour la barre dest titre c'est a cause du frame qui est loger dans la Form alors en peut pas griser les barre des titres de la fenetre appelante.

    pour la version C++ elle sera posté dès que part en congé j'ai pas C++ builder installer au travail.

Discussions similaires

  1. Capturer l'image d'une fenêtre en arrière plan
    Par Etanne dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 09/06/2013, 02h29
  2. Bouger la souris sur une fenêtre en arrière plan
    Par youtpout978 dans le forum C#
    Réponses: 4
    Dernier message: 26/06/2011, 14h13
  3. comment lancer une fenètre en arrièr plan
    Par moon93 dans le forum wxPython
    Réponses: 2
    Dernier message: 16/07/2007, 10h25
  4. Griser une fenêtre en arrière plan
    Par kurkaine dans le forum C++Builder
    Réponses: 8
    Dernier message: 04/08/2006, 15h28

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