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 :

changer la couleur d'un edit avec les messages


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut changer la couleur d'un edit avec les messages
    bonjour à tous

    j'aimerais changer la couleur de fond des edits d'une application tierce.
    J'arrive à récupérer les handles de ces champs.
    Avec ceux-ci et les procédures systeme / messages on peux faire beaucoup de choses, comme les rendre invisibles, enabled, les déplacer etc....

    mais malgré mes essais et recherches je ne parviens pas à modifier cette fichue couleur

    je pensais à qqchose comme : sendmessage (handlecible,WM_CTLCOLOREDIT, clred,0);

    est-ce seulement possible ?

    merci pour vos lumières

    David

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    Tu ne peux pas !

    WM_CTLCOLOREDIT est un message traité par la fenêtre parente du contrôle en question, celle-ci se charge de redessiner le contrôle.
    De plus, MSDN précise que le message WM_CTLCOLOREDIT n'est jamais envoyé d'un thread à un autre...

    Donc à moins de "hooker" la procédure de traitement des messages de la fenêtre parent de ton contrôle (pas simple du tout !), je ne vois pas comment y parvenir...
    --
    Philippe.
    Philippe.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Merci pour ton aide Ph.B.

    Je trouve tout de même très étonnant que l'on puisse lire/écrire le contenu d'un edit (WM_GETTEXT,WM_SETTEXT), modifier ses coordonnées, modifier la status enabled ou visible, etc... le tout avec un simple commande api et le handle, alors que pour la couleur... peanuts !

    Bah, tant pis. Je vais continuer à dessiner un cadre autour de mes edits (sur le device de l'écran).
    C'est pas une méthode trop classe et faut gérer l'effacement en changeant de edit focused mais bon, c'est mieux que rien.

    ++

  4. #4
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut Autre solution...
    Plutôt que de dessiner sur le bureau, tu peux également faire un truc comme ça en redimensionnant la fiche où tu en as besoin...

    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
    object Form1: TForm1
      Left = 0
      Top = 0
      BorderStyle = bsNone
      Caption = 'Form1'
      ClientHeight = 375
      ClientWidth = 651
      Color = clBtnFace
      TransparentColor = True
      TransparentColorValue = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object shp1: TShape
        Left = 0
        Top = 0
        Width = 651
        Height = 375
        Align = alClient
        Brush.Style = bsClear
        Pen.Color = clRed
        ExplicitLeft = 144
        ExplicitTop = 40
        ExplicitWidth = 65
        ExplicitHeight = 65
      end
    end

  5. #5
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut Avec XE2
    Et en Firemonkey, comme on peut jouer sur la transparence et l'opacité, c'est encore mieux

    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
    object Form1: TForm1
      Left = 0
      Top = 0
      BiDiMode = bdLeftToRight
      Caption = 'Form1'
      BorderStyle = bsNone
      ClientHeight = 400
      ClientWidth = 600
      Transparency = True
      Visible = False
      StyleLookup = 'backgroundstyle'
      object Viewport3D1: TViewport3D
        Align = alClient
        Width = 600.000000000000000000
        Height = 400.000000000000000000
        Opacity = 0.500000000000000000
        OnClick = Viewport3D1Click
        Color = claTomato
      end
    end

  6. #6
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut VCL pure
    Plutôt que de faire qu'un rectangle, on peut également,, avec la VCL (et non pas Firemonkey) créer une zone avec une opacité moindre...

    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
    object Form1: TForm1
      Left = 0
      Top = 0
      AlphaBlend = True
      AlphaBlendValue = 128
      BorderStyle = bsNone
      Caption = 'Form1'
      ClientHeight = 375
      ClientWidth = 651
      Color = clRed
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object shp1: TShape
        Left = 0
        Top = 0
        Width = 651
        Height = 375
        Align = alClient
        Brush.Style = bsClear
        Pen.Color = clFuchsia
        Pen.Width = 3
        OnMouseUp = shp1MouseUp
        ExplicitLeft = 272
        ExplicitTop = 168
        ExplicitWidth = 65
        ExplicitHeight = 65
      end
    end

  7. #7
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut Exemple avec transparence
    Un truc codé vite fait pour illustrer la transparence... (xe2+vlc)

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Merci Whiler
    Malheureusement ta solution ne correspond pas exactement à ce que je souhaite obtenir.
    Mon application n'est pas celle qui contient les contrôles à mettre en évidence.
    j'aimerais changer la couleur de fond des edits d'une application tierce.
    Elle est même réduite dans la barre des tâches.
    Par contre ce sont les champs d'une appli tierce que je veux pouvoir mettre en évidence.
    Lorsque je passe d'un champ à un autre, avec tab par expl, le nouveau champ qui reçoit le focus devient celui qui est encadré (c'est là que j'aurais aimé que ce soit carrément son fond qui change de couleur)

  9. #9
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour David,

    j'aimerais changer la couleur de fond des edits d'une application tierce.
    Comme je te l'ai déjà dit, ce n'est pas possible du fait de la manière dont est traité le dessin du contrôle Edit sous Windows, à moins de "hooker" la procédure de traitement des messages de la fenêtre de l'application tierce.

    Ce qu'a voulu dire Whiler, c'est d'utiliser une fenêtre transparente et colorée que tu placerais sur le contrôle Edit de la fenêtre de l'application tierce, mais tu dois aussi prendre en compte les déplacements, masquage et affichage de la fenêtre tierce...

    Après, je me pose la question : quelle est la finalité de faire cela ?
    Peut-être y a-t-il d'autres approches à étudier...
    --
    Philippe.
    Philippe.

  10. #10
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Après, je me pose la question : quelle est la finalité de faire cela ?
    Moi, j'verrai bien une sorte d'appli tutoriel... qui guide l'utilisateur à travers une appli tierce...

    Citation Envoyé par David Voir le message
    Malheureusement ta solution ne correspond pas exactement à ce que je souhaite obtenir.
    Mon application n'est pas celle qui contient les contrôles à mettre en évidence.
    As-tu regardé le sample que j'ai mis dans mon précédent message ? l'exemple est par défaut sur les explorateurs windows (c'est pas moi qui aie écrit explorer.exe ) Ce n'est pas ce que tu souhaites faire, mais ça peut te donner des idées... qui t'éviteront de dessiner sur le canvas du desktop...

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    @Philippe
    Ce qu'a voulu dire Whiler, c'est d'utiliser une fenêtre transparente et colorée que tu placerais sur le contrôle Edit
    Autant pour moi je n'avais pas compris comme ça...
    Maintenant gérer une fenêtre supplémentaire me semble plus "lourd" qu'un simple tracé (qui a bien sur aussi ses inconvénients).
    Quant à mon idée de départ je l’abandonne, puisque ce n'est pas possible.

    Après, je me pose la question : quelle est la finalité de faire cela ?
    Eh bien dans mon cas, le but est de pouvoir travailler sur une appli Z qui contient beaucoup de champs de saisie en ayant un focalisation bien plus visible qu'un curseur tout plat qui clignote.
    J'avais également dans l'idée d'étendre le principe à la mise en évidence des valeurs dépassant des limites (exlp: le champ devient rouge si valeur>valeurmax)
    Avec un Record contenant les handles et les états la procédure de dessin sur l'écran reste simple et j'ai plusieurs cadres activables en même temps .
    Tout ceci reste une fonction de confort pour laquelle je ne peux investir trop de temps par rapport au reste du projet.

    @Whiler
    As-tu regardé le sample que j'ai mis dans mon précédent message ?
    oui, merci beaucoup, mais je n'ai pas pu le faire tourner comme je ne dispose pas de xe2
    Je vais essayer de l'adapter pour voir ce que cela donne.

    Voilà, comme la question était de savoir le changement de couleur est possible et que la réponse est "non", je mets [résolu].

    Et encore merci à vous pour vous être penché sur le problème

  12. #12
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    Citation Envoyé par David Voir le message
    oui, merci beaucoup, mais je n'ai pas pu le faire tourner comme je ne dispose pas de xe2
    Je vais essayer de l'adapter pour voir ce que cela donne.
    En nettoyant les uses, ça devrait le faire (Winapi. System. Vcl. ...)

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    En nettoyant les uses, ça devrait le faire (Winapi. System. Vcl. ...)
    Tout simplement !

    et encore merci d'avoir pris le temps de coder ça

  14. #14
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    Citation Envoyé par David Voir le message
    Tout simplement !

    et encore merci d'avoir pris le temps de coder ça
    Pas de soucis.. ça m'a amusé et surtout, ça faisait déjà quelques années que j'voulais me faire un truc du genre et que je remettais à plus tard... maintenant, je l'ai dans mes cartons en cas de besoin

    Et sinon... t'en penses quoi ? tu préfères toujours dessiner ou tu penses que la fenêtre transparente n'est pas si mal ? (t'as le droit de toujours préférer le premier, mais pas de dire que c'est compliqué)

  15. #15
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Non, en soit ce n'est pas compliqué.
    Je dirais juste que ça commence à être un code assez conséquent par rapport à l'effet escompté (un malheureux changement de couleur qui aurait pu se résumer à un Sendmessage ) mais aussi par rapport au temps que je peux passer sur de telles fonctions de confort (et là je me force, parcequ’en vérité ce sont mes préférées ! ).

    Mais ne jouons pas les aigris parceque quelque chose ne marche pas comme on veut, surtout si quelqu'un nous propose une autre approche

    Et sinon... t'en penses quoi ? tu préfères toujours dessiner ou tu penses que la fenêtre transparente n'est pas si mal ?
    Bon, comme tu me le demandes, je dois t'avouer que je prèfère toujours l'idée du dessin sur le desktop.

    Malgré sont coté "bricolage" ses avantages font encore pencher la balance de son coté :
    * très peu de code supplémentaire à mon code existant (en fait juste le tracé)
    * pas de fenêtres au dessus de l'appli Z qui est celle ou l'utilisateur final travaille. Il doit pouvoir cliquer sur un champ de cette appli (ou n’importe où d’ailleurs) et non sur une fenêtre au-dessus (même transparente ) qui lui ferait perdre l'activation.
    * Mon appli A doit pouvoir se faire oublier pendant que l'on travaille sur Z (surtout quand l'utilisateur enchaine les alt-tab)
    * Mon appli peut être inactive et même réduite dans la barre des tâches. Pas avec les fenêtres. Si je clique sur Z pour y travailler tout est caché.

    Il y a surement moyen d'améliorer cela en forçant le stay on top etc,
    mais c'est une gestion que j'aimerais vraiment éviter car j'en reviens.
    Mon objectif est vraiment une seule fenêtre principale (elle-même déjà forcée stay on top et découpée avec des régions pour laisser apparaitre l'appli Z ).

    Tout ceci me donne un sentiment de légerté comparé à une création/gestion de fenêtres (notamment leur comportement en fonction des changement de fenêtre active et des manipulations utilisateur).

    Celà reste bien sur un avis très personnel, j’espère ne pas te froisser.
    Mais tu voulais savoir ce que j'en pensais

  16. #16
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Bonjour

    Une autre approche serait de dessiner directement sur le canvas de l'application qui contient tes champs d'édition. J'ai écris un exemple avec le TEdit de la Table des caractères de Windows. Pour le mettre en œuvre, crée un projet vierge avec un TTimer dont tu fixera la propriété Interval à 50. Puis insère le code suivant. Exécute et regarde 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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    var
      hWndTableCar:     Integer;
      hdcPaint:         Integer;
      OldPen, Pen:      hPen;
      OldBrush, Brush0: hBrush;
     
    function OuvreTableCaracteres: Boolean;
    var
      WinDir:  array[0..255] of char;
      Temps:   Integer;
    begin
      Result:=False;
      GetWindowsDirectory(WinDir, 255);
      ShellExecute(Form1.Handle,'Open', PChar(Windir + '\system32\charmap.exe'),nil,nil,SW_SHOWDEFAULT);
      Temps:=GetTickCount;
      repeat
        hWndTableCar:=FindWindow(nil, 'Table des caractères');
        if (GetTickCount>Temps+5000) then
          Exit;
      until (hWndTableCar<>0);
      Result:=True;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      if OuvreTableCaracteres = False then
        begin
          MessageBox(0, 'La table des caractères n''a pu être ouverte...', 'Erreur fatale', MB_ICONSTOP);
          Application.Terminate;
          Exit;
        end;
      ShowWindow(hWndTableCar, SW_SHOWNORMAL);
      SetForegroundWindow(hWndTableCar);
      hdcPaint:=GetDc(hWndTableCar);
     
      // Création du cadre Rouge
      Pen := CreatePen(PS_InsideFrame, 3, clRed);
      OldPen := SelectObject(hdcPaint, Pen);
      Brush0 := GetStockObject(Null_Brush);
      OldBrush := SelectObject(hdcPaint, Brush0);
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    Const
      CadreX= 128;
      CadreY= 310;
      CadreLong= 150;
      CadreHaut= 25;
    begin
      // Affichage du cadre
      Rectangle(hdcPaint, CadreX, CadreY, CadreX+CadreLong, CadreY+CadreHaut);
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      // Suppression du cadre Rouge
      SelectObject(hdcPaint, OldBrush);
      SelectObject(hdcPaint, OldPen);
      ReleaseDC(hWndTableCar, hdcPaint);
      DeleteObject(Pen);
    end;
    Evidemment, il te faudra créer dans ton application autant d'objets rectangle que tu as de TEdit, mais ce n'est pas le bout du monde. Le plus dur sera de trouver leurs coordonnées, mais une fois que tu les a recensés, le reste est du gâteau...
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  17. #17
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    @DOLPat :
    Une autre approche serait de dessiner directement sur le canvas de l'application
    Oui ! C'est 1000x mieux que de dessiner sur le bureau !
    Voilà qui m'assure de ne pas tracer sur une appli qui serait resté au-dessus de l'appli cible de même que la conservation du tracé lors d'ouvertures/fermetures de fenêtres modales.

    Dans mon cas je ne passerai pas par un Timer car j'en ai déjà un pour les frappes clavier et un second qui s'occupe de détecter les changements de fenêtre active. Tous deux finissent par une procédure de recherche du contrôle ayant la focalisation et, en conséquence, du tracé (ou de l’effacement) du cadre (mon tracé est même en périphérie du contrôle pour ne pas être partiellement effacé lorsque le contrôle se redessine quand on y saisit du texte)

    il te faudra créer dans ton application autant d'objets rectangle que tu as de TEdit
    En fait, cette partie je l'ai déjà.
    J'ai créé une classe avec en propriété le handle du contrôle visé et des méthodes diverses de lecture, écriture etc... et bien sur la propriété "focused" qui me permet de tester si je dois tracer le cadre ou non.

    Chaque champ utile de l'appli se voit donc attribué une instance de cette classe.
    Pour finir une méthode de classe peut passer en revue toutes les instances pour voir si l'une d'elles est celle qui détient le focus.

    En tout cas je vais suivre ton conseil et tracer sur l'appli à la place du bureau.
    Ce que je vais également faire c'est faire une copie bitmap du champ focalisé, un changement de couleur du fond et le recoller le résultat au même endroit. Ça devrait me donner un résultat proche de ce que je souhaitais.

    Un grand merci pour ton aide !

  18. #18
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    @David: Tu m'as pas froissé (par contre, pour info, une fenêtre transparente ne prend pas le focus qd on clique à travers elle )

    Par ailleurs, j'aime bien la solution de DOLPat

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    Perso, je préfère l'approche de Whiler avec une fenêtre transparente
    Empêcher son activation est assez simple en surchargeant CreateParams. Voir en gérant WM_MOUSEACTIVATE ou WM_NCHITTEST.

    Citation Envoyé par David Voir le message
    Dans mon cas je ne passerai pas par un Timer car j'en ai déjà un pour les frappes clavier et un second qui s'occupe de détecter les changements de fenêtre active. Tous deux finissent par une procédure de recherche du contrôle ayant la focalisation et, en conséquence, du tracé (ou de l’effacement) du cadre (mon tracé est même en périphérie du contrôle pour ne pas être partiellement effacé lorsque le contrôle se redessine quand on y saisit du texte)...
    ...Chaque champ utile de l'appli se voit donc attribué une instance de cette classe.
    Pour finir une méthode de classe peut passer en revue toutes les instances pour voir si l'une d'elles est celle qui détient le focus.
    Et toi qui parlais de complication

    La meilleure façon serait de hooker WM_SETFOCUS. Mais si tu veux vraiment utiliser un timer, passe par GetGUIThreadInfo qui te donnera directement le handle du champ dans hwndFocus

  20. #20
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Et toi qui parlais de complication
    Que trouves-tu compliqué ?
    Je n'ai pas compris si tu parles:
    * de la méthode finale de mise en évidence du contrôle actif
    * ou bien de la gestion globale des contrôles utiles (ma classe)?
    * de la méthode d’interception des événements (clavier, focalisation, premier plan)
    * ou de tout !

    Si tu fais plutôt allusion à la gestion avec une classe dédiée, je dois préciser qu'elle ne sert pas qu'à cette tâche de mise en évidence visuelle mais sert aussi (et surtout) à la manipulation et au contrôle des valeurs des nombreux champs présents dans l'appli cible. Le but étant de pouvoir les utiliser comme s'il s'agissait de contrôles de ma propre appli ou j'écrirais : "editNomClient.text:=..." etc....

    Empêcher son activation est assez simple en surchargeant CreateParams. Voir en gérant WM_MOUSEACTIVATE ou WM_NCHITTEST.
    Merci, je vais essayer.
    Penses-tu que c'est le genre de technique utilisée pour les affichages "OSD" utilisés par certains drivers de clavier qui à l'appui de caps lock, par expl, affichent en bas de l'écran un texte comme "Capslock ON" qui reste bien audessus de toutes les appli pendant qq secondes et ce, même si on est entrain d'en déplacer une ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Changer la couleur d'un pixel avec VTK
    Par Romuuuuu dans le forum C++
    Réponses: 1
    Dernier message: 23/04/2008, 11h08
  2. Réponses: 5
    Dernier message: 30/01/2008, 20h24
  3. Modifier la couleur d'un STATIC avec les API windows
    Par Mirsa dans le forum Visual C++
    Réponses: 31
    Dernier message: 27/11/2006, 11h18
  4. changer la couleur de mon Form1 toutes les secondes
    Par stacker_junior dans le forum C++Builder
    Réponses: 9
    Dernier message: 10/05/2006, 19h36
  5. Changer la couleur d'un mot avec ksh
    Par mzt.insat dans le forum Linux
    Réponses: 7
    Dernier message: 04/05/2006, 12h37

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