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

Windows Discussion :

[Win32 C++] border WM_PAINT


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 33
    Points : 21
    Points
    21
    Par défaut [Win32 C++] border WM_PAINT
    Bonjour,


    J'ai des fenêtres de type WS_SIZEBOX, je voudrais pouvoir changer la couleur des bordures dynamiquement par exemple quand la fenêtre prend le focus,
    je pensais pouvoir le faire dans WndProc(WM_PAINT) de ma fenêtre fille, cependant j'ai l'impression que je ne peux repeindre ici que la zone client et donc pas les bordures,

    Est ce que quelqu'un aurait une solution, faut-il que je calcule depuis ma fenêtre parent toute les bordures de mes filles pour les re-dessinner (un peu relou surtout qu'il faut que je change de couleur pour celle qui est focussée) ?
    Ou y a t-il un moyen complètement différent ?
    Merci pour vos réponses,

    Bonne journée

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    La technique est expliquée ici.

  3. #3
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    La fonction GetWindowDC retourne un hDC qui permet de peindre sur la fenêtre entière et pas seulement dans la zone client.

    Voir : http://msdn.microsoft.com/en-us/libr...47(VS.85).aspx

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par Prof Voir le message
    Bonjour.

    La fonction GetWindowDC retourne un hDC qui permet de peindre sur la fenêtre entière et pas seulement dans la zone client.

    Voir : http://msdn.microsoft.com/en-us/libr...47(VS.85).aspx
    Et donc ?

  5. #5
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Réponse à :

    " je pensais pouvoir le faire dans WndProc(WM_PAINT) de ma fenêtre fille, cependant j'ai l'impression que je ne peux repeindre ici que la zone client et donc pas les bordures "

  6. #6
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Ah d'accord. Oui la technique GetWindowDC suffit si on veut une fenêtre rectangulaire.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Même si personnellement, j'ai tendance à préférer WM_NCPAINT + WM_NCCALCSIZE + WM_NCHITTEST pour mes bordures de fenêtre personnalisées.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    Bonjour,
    Super le lien pour les fenêtres un peu custum, mais j'ai tenter et effectivement, ça décale mon problème, parce que ma zone client je ne veux pas y toucher vu que tout mes redimensionnement sont bien calé dessus, et donc là le tuto décale la bordure sur la zone client, ce que ne le fait pas trop.
    En fait j'ai 4 fenêtres filles collée, un genre le viewport de 3ds d'ailleurs c'est un peu ça que je veux faire
    Si je récupère le dc de la fenêtre fille j'aurai accès à la bordure alors?
    Je vais tenter.
    J'ai pas eu trop le temps de coder en ce moment

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    en fait je vous montre le code du paint ça sera plus simple :

    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
    HDC hDC;
    PAINTSTRUCT ps;
    RECT r;
    
    GetClientRect(inHwnd, &r);
    
    const int BORDER_W = 4;
    
    r.left		= BORDER_W;
    r.top		= BORDER_W;
    r.right		-= BORDER_W - 1;
    r.bottom	-= BORDER_W - 1;
    
    //	hDC = ::GetWindowDC( inHwnd ); 
    hDC = BeginPaint(inHwnd, &ps);
    
    HBRUSH hbrush;
    hbrush = CreateSolidBrush(RGB(255, 0, 0));
    SelectObject(hDC, hbrush);
    
    Rectangle( hDC, -5, -5, r.right, r.bottom );
    
    //	RoundRect(hDC, r.left, r.top, r.right, r.bottom, 2 * (CORNER_R - BORDER_W), 2 * (CORNER_R - BORDER_W));
    DeleteObject(hbrush);
    EndPaint(inHwnd, &ps);
    return 0L;

    J'ai changé en ça :

    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
    HDC hDC;
    PAINTSTRUCT ps;
    RECT r;
    
    GetWindowRect(inHwnd, &r);
    
    const int BORDER_W = 4;
    
    r.left		= BORDER_W;
    r.top		= BORDER_W;
    r.right		-= BORDER_W - 1;
    r.bottom	-= BORDER_W - 1;
    
    hDC = ::GetWindowDC( inHwnd ); 
    
    //	hDC = BeginPaint(inHwnd, &ps);
    
    HBRUSH hbrush;
    hbrush = CreateSolidBrush(RGB(255, 0, 0));
    SelectObject(hDC, hbrush);
    
    Rectangle( hDC, -5, -5, r.right, r.bottom );
    
    //	RoundRect(hDC, r.left, r.top, r.right, r.bottom, 2 * (CORNER_R - BORDER_W), 2 * (CORNER_R - BORDER_W));
    DeleteObject(hbrush);
    //	EndPaint(inHwnd, &ps);
    return 0L;
    Et effectivement ça colorise bien les bordures, cependant ça colorise aussi l'interieur, normal je fait un ::Rectangle, mais j'ai du clipping avec l'affichage directX.
    Est ce que c'est "lourd" de dessinner 4 lines ?
    Et est ce que je m'y prend bien ainsi ? pasqu'il n'y a plus de BeginPaint - EndPaint en passant par GetDC

    Merci pour vos réponses

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    Bonsoir,

    J'ai résolu mon problème, grace au petit lien et à la doc msdn j'ai un peu mieu capté la gestion des paint.
    Donc je n'ai pas besoin de redéfinir la zone client dans le resize comme on le fait dans le tuto puisque je reste "rectangle"

    Je fais mon traitement dans WM_NCPAINT car d'après mes tests c'est ici que la bordure est redessinée par la callback par défaut, et donc il y a juste à refaire mes bordures ici comme ça :

    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
    case WM_NCPAINT:
    {
    	if( cw->GetFather() != NULL )
    	{
    		HDC hDC;
    		PAINTSTRUCT ps;
    		RECT r;
    
    		GetWindowRect(inHwnd, &r);
    
    		int width = r.right - r.left+1;
    		int height = r.bottom - r.top+1;
    
    
    		COLORREF c;
    		if( cw->GetHwnd() == ::GetFocus() )
    		{
    			c = RGB(255, 0, 0);
    		}
    		else
    		{
    			c = RGB(120, 120, 120);
    		}
    
    		hDC = ::GetWindowDC( inHwnd ); 
    		
    		HBRUSH hbrush;
    		hbrush = CreateSolidBrush( c );
    		HPEN pen = CreatePen( PS_NULL, 0, c );
    
    		SelectObject(hDC, hbrush);
    		SelectObject(hDC, pen);
    
    	//	int xb = GetSystemMetrics(SM_CXSIZEFRAME);
    	//	int yb = GetSystemMetrics(SM_CYSIZEFRAME);
    		const int border = 8;
    
    		Rectangle( hDC, 0, 0,				width, border );
    		Rectangle( hDC, width-border, 0,	width, height );
    		Rectangle( hDC, 0, height-border,	width, height );
    		Rectangle( hDC, 0, 0,	border, height );
    		
    		DeleteObject(hbrush);
    		DeleteObject(pen);
    
    		ReleaseDC( inHwnd, hDC );
    		return 0L;
    	}
    }
    Merci pour vos réponses, bonne nuit !

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Traiter le message WM_NCCALCSIZE te permettrait de changer la taille de la bordure et la barre de titre. Ça peut être intéressant...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    Oui effectivement, j'ai vu ton message d'hier que ce matin en cliquant sur résolu, et j'ai juste eu le temps de regarder vite fait la doc sur WM_NCCALCSIZE.
    ça semble intéressant pour bien finir le custum des bordures ( il y a toujours un petit défaut =) )

    Merci pour les infos

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est ce qui m'a permis de faire ceci.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    Merki ! le top! tout ce que je voulais et même plus =)
    Bon code !

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

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. [Kylix] kylix3 ----> win32
    Par blue dans le forum EDI
    Réponses: 3
    Dernier message: 28/01/2003, 11h27
  3. gcc et win32
    Par MatRem dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 16/01/2003, 12h22
  4. [API win32] Récupérer le répertoire d'un profile
    Par sbeu dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 27/09/2002, 12h38
  5. convertir un nom long (win32) en format dos (8+3)
    Par kylekiller dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2002, 13h34

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