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

C++Builder Discussion :

Modifier la couleur de la bordure d'une fenêtre


Sujet :

C++Builder

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut Modifier la couleur de la bordure d'une fenêtre
    Bonjour,

    J'utilise c++ builder XE, mais je pense que ça n'a pas vraiment d'importance.
    J'ai vu quelques posts sur le sujet mais sans trouver de solutions, j'ai du mal à croire que cela ne soit pas possible !!!
    Je veux donc changer la couleur de la bordure des fenêtres de mon application afin d'utiliser les couleurs de la charte graphique de mon client.
    Mais impossible de trouver comment faire, c'est dingue non ???

    merci !
    Pascale38

  2. #2
    Membre averti Avatar de hariman
    Homme Profil pro
    Développeur Java, Android
    Inscrit en
    Janvier 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Développeur Java, Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 200
    Points : 413
    Points
    413
    Par défaut
    Bonjour,

    Je crains que les bordures de fenêtres ne soient personnalisables, ça doit correspondre au thème de Windows.

    Si j'étais toi, j'enlèverais ces bordures.
    Il existe plusieurs fonctions dans l'API Windows pour manipuler les fenêtres.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    C'est complètement aberrant de ne pas pouvoir choisir la couleur non ???
    Le problème c'est que dans la charte graphique du client, il a les bordures windows classiques avec icônes etc... Je ne peux donc pas les enlever !!

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Il est aussi possible de faire une fenêtre sans bordure (BorderStyle à bsNone), et de dessiner soit-même les coutours, la méthode OnPaint est conçu pour cela !
    Peut-être qu'en coutournant la WndProc on peut accéder au Bordure ... mais bon, il faut penser qu'en 2K c'est 2 pixels, en XP c'est 5, et Vista c'est 10 ... à chaque version de l'OS, il y a un thème différent !

    Après si le client est assez débile pour accepter une charte graphique non conforme au système d'exploitation, celui qui lui a vendu ça est un charlatan ou un incompétent pour ne pas le savoir !
    En plus, cela va lui coûter plus cher pour juste un aspect graphique, et la reproduction des élements retirer par bsNone comme le glissement ou agrandissment de la fenêtre !

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    En effet, en fait on est pas sensé changé la couleur des bordures...
    Y'en a juste un dans la boite qui a fait un doc pour l'aspect de l'appli en question et qui a un peu trop extrapolé la charte graphique, mort de rire !!

    Désolée pour le dérangement !!!

    merci et bonnes fêtes à tous !!

    Pascale38

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Avec un Hook sur le message WM_PAINT, tu peux redessiner par dessus une autre application, y compris dans la Barre de Taches et les bordures !
    WM_PAINT est contournable dans la WndProc

    Je l'ai déjà fait à titre expérimental en Delphi, tient voici une traduction en C++Builder

    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
    void __fastcall TVCLManipForm::FormPaint(TObject *Sender)
    {
      TRect WindowRect = this->BoundsRect;
      WindowRect = Rect(0, 0, WindowRect.Width(), WindowRect.Height());
     
      HDC DCHandle = GetWindowDC(WindowHandle);
      HBRUSH BrushHandle = CreateSolidBrush(clRed);
     
      FrameRect(DCHandle, &WindowRect, BrushHandle);
      InflateRect(&WindowRect, -1, -1);
      FrameRect(DCHandle, &WindowRect, BrushHandle);
      InflateRect(&WindowRect, -1, -1);
      FrameRect(DCHandle, &WindowRect, BrushHandle);
     
      DeleteObject(BrushHandle),
      ReleaseDC(WindowHandle, DCHandle);
    }
    Je te laisse apprécier l'instabilité de la chose, cela doit pouvoir s'améliorer !
    Il faut aussi capturer WM_SIZE et WM_ERASEBKGND ... comme dans ajuster la taille de l'image avec de la form c'est pour dessiner une image dans la zone client d'un MDI, tu peux l'adapter pour le contour !



    Sinon, tu peux aussi changer les couleur de l'OS, tu peux changer pour l'ensemble du compte ! cela impactera les bordures !

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    Oui je sais qu'on peut changer les couleurs de l'OS, mais dans le doc il est bien précisé :
    "Les couleurs de bandeau et texte doivent etre indépendant du systeme Windows sur lequel l’application est lancée."

    Merci pour ton code, pour l'instant je vais en rester là, je verrai au retour de vacances du client !!

  8. #8
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut
    Tu peux aussi hooker le message Windows WM_NCPAINT. L'avantage c'est que le système l'envoie quand il le faut, ce qui évite de traiter les autres messages (WM_SIZE, etc...):

    Fichier .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      void __fastcall MessageNcPaint(TMessage &Message);
     
    BEGIN_MESSAGE_MAP
      MESSAGE_HANDLER(WM_NCPAINT, TMessage, MessageNcPaint)
    END_MESSAGE_MAP(TControl)
    Fichier .cpp
    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
    void __fastcall TForm1::MessageNcPaint(TMessage &Message)
    {
      HDC hdc;
      RECT Rect;
      int i;
     
      hdc = GetDCEx(Handle, (HRGN) Message.WParam, DCX_WINDOW | DCX_INTERSECTRGN | 0x10000);
     
      // Paint into this DC
      GetWindowRect(Handle, &Rect);
      Rect.right -= Rect.left; Rect.left = 0;
      Rect.bottom -= Rect.top; Rect.top = 0;
      SelectObject(hdc, GetStockObject(BLACK_PEN));
      for (i = 0; i < 5; i++) {
        Rectangle(hdc, Rect.left, Rect.top, Rect.right, Rect.bottom);
        InflateRect(&Rect, -1, -1);
      }
     
      ReleaseDC(Handle, hdc);
    }

  9. #9
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut Pascale38
    Regarde ce lien

Discussions similaires

  1. Modifier la couleur des différentes cases d'une uitable
    Par yop3112 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 06/07/2015, 18h16
  2. Modifier la couleur de bordure d'une fenêtre WPF
    Par SandyF dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 21/09/2010, 18h29
  3. Modifier la couleur d'un lien depuis une frame
    Par emmeline.a dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 30/07/2010, 14h36
  4. Modifier la couleur de ma police d'une colonne d'un datagridView
    Par skunkies dans le forum Windows Forms
    Réponses: 1
    Dernier message: 03/12/2008, 16h52

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