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

API, COM et SDKs Delphi Discussion :

Problème avec GetWindowRgn


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 294
    Points : 171
    Points
    171
    Billets dans le blog
    1
    Par défaut Problème avec GetWindowRgn
    Je sous sous W10, avec Delphi 6 Personal Edition.

    Je veux récupérer les coordonnées de la région d'un contrôle Delphi, dans une DLL, à partir de son handle. Et je n'arrive pas à faire marcher l'API GetWindowRgn qui me retourne systématiquement ERROR.

    Voici une simulation avec un code Delphi trivial, juste pour mettre le problème en évidence. Créer un projet VCL, placer un TEDIT et un TBUTTON sur la form, et changer le source comme suit:
    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      rgn: HRGN;
      rr: TRect;
    begin
      rgn := CreateRectRgn(0,0,0,0);
      if GetWindowRgn(Edit1.Handle,rgn)=ERROR then showmessage('error');
      GetRgnBox(rgn,rr);
      showmessage(format('%d,%d/%d,%d',[rr.Left,rr.Top,rr.Right,rr.Bottom]));
    end;
     
    end.
    J'ai toujours le message "error", et, évidemment, GetRgnBox ne peut retourner que les valeurs données dans CreateRectRgn.

    Question: pourquoi GetWindowRgn ne veut pas marcher ? C'est pourtant banal... Si j'utilise l'API GetWindowRect, j'ai les bonnes valeurs. Mais je veix passer par la gestion des régions dans le cadre de mon projet, pour d'autres raisons.

    Qu'est-ce que je n'ai pas compris ?

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 877
    Points : 11 373
    Points
    11 373
    Billets dans le blog
    6
    Par défaut
    Cela peut-il être un problème de droits ? Ce n'est pê pas la même chose de demander les coordonnées d'un rectangle sur une fenêtre et d'obtenir une copie d'une région de cette même fenêtre ? Ces codes fonctionnent-ils l'un comme l'autre à partir d'une même application ?

  3. #3
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 294
    Points : 171
    Points
    171
    Billets dans le blog
    1
    Par défaut
    Oui. Il s'agit bien d'un objet du même programme, même processus, même thread. Exactement comme dans ce mini-programme: obtenir la région d'un contrôle du même programme. Mêê ici; dans ce petit code, ça ne marche pas. J'ai regardé des dizaines d'exemples en Delphi pour l'utilisation de cet API, et je ne comprends pas ce qui blioque.

  4. #4
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 294
    Points : 171
    Points
    171
    Billets dans le blog
    1
    Par défaut
    J'ai trouvé !

    Lorsqu'on reçoit l'erreur sur un premier GetWindowRgn sur cet objet, ça signifie que l'objet n'a pas encore de région, bizarrement. Donc, il faut lui affectuer une région identique au rectangle retourné par GetWindowRect, puis l'appel suivant à GetWindowRgn réussit.

    Je posterai toute à l'heure la solution complète...

  5. #5
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 294
    Points : 171
    Points
    171
    Billets dans le blog
    1
    Par défaut
    Voici la solution:
    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      rgn, rgn2: HRGN;
      rr, rr2: TRect;
    begin
      rgn := CreateRectRgn(0,0,0,0);                            // créer une région vide
      if GetWindowRgn(Edit1.Handle,rgn)=ERROR then begin        // tenter de récupérer la région de l'objet
        // ici, on sait que l'objet visé n'a PAS ENCORE de région Windows
        GetWindowRect(Edit1.Handle,rr);                         // récupérer le rectangle de l'objet
        rgn := CreateRectRgn(0,0,rr.Right-RR.Left+1,rr.Bottom-RR.Top+1);  // créer une région à partir du rectangle
        SetWindowRgn(Edit1.Handle,rgn,true);                    // imposer cette région à l'objet
        rgn := CreateRectRgn(0,0,0,0);                          // ecréer une région vide
        if GetWindowRgn(Edit1.Handle,rgn)=ERROR then showmessage('error');  // et récupérer la vraie région
     
        GetRgnBox(rgn,rr2);                                     // récuperer le rectangle de la région
        showmessage(format('%d,%d/%d,%d',[rr2.Left,rr2.Top,rr2.Right,rr2.Bottom]));   // cette fois, les résultats sont bons !
     
        // on va utiliser cette région, juste pour une démonstration:
        rgn2 := CreateRectRgn(2,2,rr2.Right-rr2.Left+1-2,rr2.Bottom-rr2.Top+1-2);  // créer une région SANS les bordures
        SetWindowRgn(Edit1.Handle,rgn2,true);                  // imposer cette région à l'objet
        DeleteObject(rgn);                                     // libérer la région qui ne sert plus
      end;
     
    end;
     
    end.
    Les commentaires expliquent ce qui se passe. A titre de démonstration, je veux supprimer le bord 3D autour de l'objet EDIT1. Je sais qu'il est suffusant de rogner deux pixels de chaque côté (on pourrait également établir ces écarts de façon plus générale, mais ça dépasse le cadre de cette démonstration).

    Donc, je tente de récupérer la région de l'objet. Si ça réussi, alors l'objet a déjà une région, le cadre est déjà supprimé et je ne fais rien.
    Si ça échoue, par contre, je récupère le rectangle Windows de l'objet, je crée une région à partir de ce rectangle et le l'affecte à l'objet.

    Certes, j'aurais pu directement réduire la région pour exclure les bordures. Mais je veux montrer l'usage de GetWindowRgn, et donc le laisse la région entière.
    Puis, pour la démo, je refais GetWindowRgn qui cette fois n'échoue pas et me retourne ma région que je viens de créer.
    A partir de cette région, je récupère la box de la région (c'est juste pour montrer une utilisation du résultat de GetWindowRgn - j'aurais pu travailler directement à partir du résultat de GetWindowRect).
    Je recrée une nouvelle région, cette fois en excluant les deux pixels sur les 4 bords et le l'applique l'objet.
    On voit le résultat: le bord 3D de EDIT1 a disparu.

    Voilà. J'ai compris comment utiliser GetWindowRgn, et c'était mon but.

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 796
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 796
    Points : 13 475
    Points
    13 475
    Par défaut
    Pourquoi récupérer le rectangle du contrôle puisque seule la zone cliente t'intéresse. Passe plutôt par GetClientRect. Tu seras en coordonnées "contrôle" et non "fiche" et ça évitera les calculs.

    Il y a également un handle leak puisqu'il manque un DeleteObject(Rgn) avant la ligne 36

  7. #7
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 294
    Points : 171
    Points
    171
    Billets dans le blog
    1
    Par défaut
    Pourquoi récupérer le rectangle du contrôle puisque seule la zone cliente t'intéresse. Passe plutôt par GetClientRect. Tu seras en coordonnées "contrôle" et non "fiche" et ça évitera les calculs.
    Ce n'est pas si simple. GetClientRect retourne un rectangle (0,0,largeur,hauteur), puisqu'il retourne les coordonnées des coins en haut et en bas, mais en coordonnées relatives justement par rapport à la zone client. J'avais montré ce code juste comme un exemple pour montrer une utilsiation de la région récupérée.

    Il y a également un handle leak puisqu'il manque un DeleteObject(Rgn) avant la ligne 36
    Exact.

    Pour montrer l'application que j'en ai fait dans ma DLL, voici les deux fonctiions que j'ai construites à partir de cer exemple:
    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
    function ClientAreaAsRegion(hnd: HWND):integer; stdcall; export;
    var
      I: Integer;
      RgnCtrl, rgn: HRGN;
      wr, cr, rr: TRect;
      dx, dy: integer;
    begin
      GetWindowRect(hnd,wr);
      GetClientRect(hnd,cr);
     
      rgn := CreateRectRgn(0,0,10,10);
      GetWindowRect(hnd,wr);
      GetClientRect(hnd,cr);
    //showmessage(format('%d,%d/%d,%d  %d,%d/%d,%d',[wr.left,wr.top,wr.right,wr.bottom, cr.left,cr.top,cr.right,cr.bottom]));
     
      dx := max(2,round((wr.Right - wr.Left - cr.Right)/2));
      dy := max(2,wr.Bottom-wr.Top - dx - cr.Bottom);
     
      rgn := CreateRectRgn(dx,dy,cr.Right,cr.Bottom);
      SetWindowRgn(hnd,rgn,true);                    // imposer cette région à l'objet
      result := 0;
    end;
    exports ClientAreaAsRegion;
     
    function WindowAreaAsRegion(hnd: HWND):integer; stdcall; export;
    var
      I: Integer;
      RgnCtrl, rgn: HRGN;
      wr, rr: TRect;
      dx: integer;
    begin
      SetWindowRgn(hnd,0,true);
      result := 0;
    end;
    exports WindowAreaAsRegion;
    La première fonction sert à "couper" la bordure 3D de certains objets identifiés par leur handle (TEDIT, TMEMO, TCOMBOBOX et TFORM testés à ce jour). La seco de remet l'état initial. Comme tu peux voir, je me sers de GetWindowRect et GetClientRect pour déterminer les largeurs des bordures gauche, bas et doite (dx) et celle du haut (dy). Ainsi, cela s'adapte à tous les objets cités ci-dessus, et je vais progressivement appliquer cela à d'autres. Pourquoi ? Je cherche à donner un moyen aux programmeurs du langage, pour lequel je développe la DLL, de donner un look "flat" à leur GUI, chose qui n'est actuellement pas possible dans ce langage.

    Telles qu'elles sont présentées, ces deux fonctions marchent très bien.

  8. #8
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 294
    Points : 171
    Points
    171
    Billets dans le blog
    1
    Par défaut
    Voici la version "finale" de mes deux fonctions, utilisant ma manipulation de régions pour changer l'aspect de certains contrôles:
    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
    function ClientAreaAsRegion(hnd: HWND):integer; stdcall; export;
    var
      I: Integer;
      rgn: HRGN;
      wr, cr, rr: TRect;
      dx, dy, mini: integer;
      ClassName: string;
      len: Integer;
    begin
      result := -1;
      try
        mini := 2;
        SetLength(ClassName, 256);
        len := GetClassName(hnd, PChar(ClassName), Length(ClassName));
        if len=0 then RaiseLastOSError;
        SetLength(ClassName, len);
        if ClassName='TButton' then mini := 3;
     
        GetWindowRect(hnd,wr);
        GetClientRect(hnd,cr);
     
        rgn := CreateRectRgn(0,0,10,10);
        GetWindowRect(hnd,wr);
        GetClientRect(hnd,cr);
     
        dx := max(mini,round((wr.Right - wr.Left - cr.Right)/2));
        dy := max(mini,wr.Bottom-wr.Top - dx - cr.Bottom);
     
        rgn := CreateRectRgn(dx,dy,cr.Right-dx,cr.Bottom-dy);
        SetWindowRgn(hnd,rgn,true);                    // imposer cette région à l'objet
        result := 0;
      except
      end;
    end;
    exports ClientAreaAsRegion;
     
    function WindowAreaAsRegion(hnd: HWND):integer; stdcall; export;
    var
      I: Integer;
      RgnCtrl, rgn: HRGN;
      wr, rr: TRect;
      dx: integer;
    begin
      result := -1;
      try
        SetWindowRgn(hnd,0,true);
        result := 0;
      except
      end;
    end;
    exports WindowAreaAsRegion;
    Ces fonctions retournent -1 en cas d'erreur, et zéro en cas de réussite. Elles marchent sur les objets FORM, BUTTON, EDIT, MEMO, COMBO, LIST, SPIN, STRINGGRID, CHECKBOX et PROGRESSBAR. Le résultat n'est pas satisfaisant sur SCROLLBAR et elles ne marchent pas sur TRACKBAR. Pour ce dernier, la raison en est que le dessin de ces objets est implémenté selon une méhode différente: TRACKBAR a un ClientRect identique à son WindwRect.

    Quoi qu'il en soit, techniquement, le problème de GetWindowRgn est résolu - j'ai fini par comprendre les contraintes de son utilisation, et dans le cadre de ces fonctions, j'ai pu m'en passer. je continuerai à affiner ces fonctions et à en élargir le champ d'application, mais c'est un autre sujet et sort du cadre de ce fil de discussion.

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 796
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 796
    Points : 13 475
    Points
    13 475
    Par défaut
    Toujours un handle leak Cette ligne 22 ne sert à rien.

    Pourquoi réinventer la roue et ne pas simplement retourner le résultat de SetWindowRgn ?
    Et si SetWindowRgn échoue, il faut un DeleteObject(Rgn).

    RaiseLastOSError et ce bloc try..except vide ne servent à rien. Exit simplement.

    Le nom WindowAreaAsRegion est mal choisi puisque tu supprimes la région.
    Et ici aussi, ce bloc try..except n'a aucune utilité puisque rien ne peut générer d'exception.

  10. #10
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 294
    Points : 171
    Points
    171
    Billets dans le blog
    1
    Par défaut
    Toujours un handle leak Cette ligne 22 ne sert à rien.
    Exact ! Un résidu que j'ai oublié de supprimer.

    RaiseLastOSError et ce bloc try..except vide ne servent à rien. Exit simplement.
    Ok. Appliqué.

    Le nom WindowAreaAsRegion est mal choisi puisque tu supprimes la région.
    Oui. En fait, je le renomme UseClientAreaAsRegion.

    Voilà le résultat:
    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
    function UseClientAreaAsRegion(hnd: HWND):integer; stdcall; export;
    var
      I: Integer;
      rgn: HRGN;
      wr, cr, rr: TRect;
      dx, dy, mini: integer;
      ClassName: string;
      len: Integer;
    begin
       mini := 2;
       result := -1;
        SetLength(ClassName, 256);
        len := GetClassName(hnd, PChar(ClassName), Length(ClassName));
        if len=0 then exit;
        SetLength(ClassName, len);
        if ClassName='TButton' then mini := 3;
     
        GetWindowRect(hnd,wr);
        GetClientRect(hnd,cr);
     
        GetWindowRect(hnd,wr);
        GetClientRect(hnd,cr);
     
        dx := max(mini,round((wr.Right - wr.Left - cr.Right)/2));
        dy := max(mini,wr.Bottom-wr.Top - dx - cr.Bottom);
     
        rgn := CreateRectRgn(dx,dy,cr.Right-dx,cr.Bottom-dy);
        if SetWindowRgn(hnd,rgn,true)=ERROR then begin
          DeleteObject(rgn);
          exit;
        end;
        result := 0;
    end;
    exports UseClientAreaAsRegion;
     
    function UseWindowAreaAsRegion(hnd: HWND):integer; stdcall; export;
    var
      I: Integer;
      RgnCtrl, rgn: HRGN;
      wr, rr: TRect;
      dx: integer;
    begin
      result := -1;
      try
        SetWindowRgn(hnd,0,true);
        result := 0;
      except
      end;
    end;
    exports UseWindowAreaAsRegion;
    Merci pour les corrections ! Il y a toujours quelque chose à apprendre - le plus important ici était le handle leak. J'espère avoir nettoyé le code...

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 796
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 796
    Points : 13 475
    Points
    13 475
    Par défaut
    Citation Envoyé par KlausGunther Voir le message
    J'espère avoir nettoyé le code...
    Il y a encore du code et des variables inutiles.

    Et le nom UseWindowAreaAsRegion n'est pas correct puisqu'il n'y a pas/plus de région. ClearWindowRegion serait plus logique/compréhensible.

  12. #12
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 294
    Points : 171
    Points
    171
    Billets dans le blog
    1
    Par défaut
    Oui, quelques variables qui ne sont plus utilisées. Et le changement de nom d'une des fonctions:
    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
    function UseClientAreaAsRegion(hnd: HWND):integer; stdcall; export;
    var
      rgn: HRGN;
      wr, cr: TRect;
      dx, dy, mini: integer;
      ClassName: string;
      len: Integer;
    begin
       mini := 2;
       result := -1;
        SetLength(ClassName, 256);
        len := GetClassName(hnd, PChar(ClassName), Length(ClassName));
        if len=0 then exit;
        SetLength(ClassName, len);
        if ClassName='TButton' then mini := 3;
     
        GetWindowRect(hnd,wr);
        GetClientRect(hnd,cr);
     
        GetWindowRect(hnd,wr);
        GetClientRect(hnd,cr);
     
        dx := max(mini,round((wr.Right - wr.Left - cr.Right)/2));
        dy := max(mini,wr.Bottom-wr.Top - dx - cr.Bottom);
     
        rgn := CreateRectRgn(dx,dy,cr.Right-dx,cr.Bottom-dy);
        if SetWindowRgn(hnd,rgn,true)=ERROR then begin
          DeleteObject(rgn);
          exit;
        end;
        result := 0;
    end;
    exports UseClientAreaAsRegion;
     
    function ClearWindowRegion(hnd: HWND):integer; stdcall; export;
    var
      I: Integer;
      RgnCtrl, rgn: HRGN;
      wr, rr: TRect;
      dx: integer;
    begin
      result := -1;
      try
        SetWindowRgn(hnd,0,true);
        result := 0;
      except
      end;
    end;
    exports ClearWindowRegion;
    Merci beaucoup de m'aider à épurer mon code !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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