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

MFC Discussion :

Probleme de Resize "proportionnel" d'une fenetre


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 15
    Points : 11
    Points
    11
    Par défaut Probleme de Resize "proportionnel" d'une fenetre
    Bonjour,

    C'est mon premier message alors soyez indulgent....

    Mon probleme est le suivant. J'ai une boite de dialogue (CDialog) avec un cadre que je peux redimensionner a la souris.
    Lorsque je le redimensionne en Y, j'aimerai qu'il se redimentionne automatique selon un ratio en X. (même punition si je cherche a la redimensionner en X)
    Pour cela, j'ai intercepter le message WM_SIZING puis fait mes petits calculs et envoyer un SetWindowsPos à la fin.
    Cela fonctionne. Mais la nouvelle partie que je redimensionne n'arrete pas de flasher. Alternant entre le fond de l'ecran (derriere ma fenetre) et ma fenetre elle-même. Elle ne flashe pas une fois dimensionner mais en cours de dimensionnement lorsque je deplace la souris en restant appuyer pour aggrandir cette fenetre.

    En fait en cours de dimensionnement, si je regarde dans l'evenement WM_NCCALCSIZE, je vois qu'il me donne alternativement 2 "fenetres" differente. Une correspondant a ma position d'origine avant de deplacer la souris et l'autre etant ma fenetre en cours de deplacement. Donc succesivement, il me dessine ma fenetre avec ces dimension d'origine puis ma fenetre avec ces nouvelles dimensions. D'ou l'effet flashage

    Une idée ?

    Pour un premier message, euuuu, je ne sais pas si je suis vraiment tres clair.
    Autre détail que vous aurez sans doute compris, je debute

    Un grand merci deja de m'avoir lu.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut et bienvenue sur le forum,
    il faudrait voir la technique employée .
    un peu de code correspondant aux fonctions concernées.
    sinon pour info il y a une classe de gestion de layout dans la faq:
    http://c.developpez.com/faq/vc/?page...#LayoutControl
    avec un exemple.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    ben il est un peu barbare mon 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
     
    	case WM_EXITSIZEMOVE:
    			SetWindowPos(0,0,0,(long)X, (long)Y,SWP_NOMOVE | SWP_NOOWNERZORDER );
    			break;
     
    		case WM_NCCALCSIZE:
    			if(wParam == TRUE)
    			{
     
    				NCCALCSIZE_PARAMS *t=(NCCALCSIZE_PARAMS*) lParam;
    				memory[ii] = t->rgrc[0].right -t->rgrc[0].left);
    				memory2[ii++] = vWidth;
     
    				if(ii == 399)
    					ii=0;
    			}
    			break;
     
     
    			case WM_SIZING:
    				{
    					LPRECT lprc = (LPRECT) lParam;
     
    					switch(wParam)
    					{
     
    						case WMSZ_BOTTOM :
    							{
    								CRect Rect;
    								GetWindowRect(Rect);
     
    								X = (float)Rect.Height() / ratio;
    								Y = Rect.Height();
     
    								vWidth = X;
    								vHeight = Y;
     
     
    								SetWindowPos(0,0,0,(long)X, (long)Y, SWP_NOMOVE | SWP_NOOWNERZORDER );
    							}
    							break;

    Les tableaux memory et memory2 me servent juste a comprendre ce qui se passe.
    Ainsi si par exemple ma fenetre a l'origine est de 50->300 en X et 20->150 en Y, j'obtient dans memory lorsque je bouge la fenetre pour l'aggrandrir :

    Memory Memory2
    302 302
    300 302
    304 304
    300 304
    306 306
    300 306

    etc, etc.

    D'ou le flashage.
    Lorsque je deplace la souris d'une valeur j'ai 2 appels dans WM_NCCALCSIZE. Le premier est la bonne nouvelle dimension et le second et la dimension d'origine.
    Je pense que je peux faire quelque chose avec la structure fournit avec WM_NCCALCSIZE , met j'ai beau lire et relire la doc , faire de multiple essais, je n'arrive a rien.

    Merci encore

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    J'ai trouvé !
    Et je suis pas peu fier

    En fait il ne faut pas que j'envois le SetWindowPos dans le WMSZ_BOTTOM mais que dans ce même WMSZ_BOTTOM j'envois :
    SendMessage(WM_SIZING,WMSZ_LEFT,(LPARAM)lprc);

    lprc contenant mes nouvelles valeurs calculées.

    1 journée sur le même probleme mais ca fait du bien quand a la fin on trouve.

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

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