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 :

[MFC] - MDI : CDialogBar resize....


Sujet :

MFC

  1. #1
    Membre confirm�
    Avatar de Alice9
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Mai 2004
    Messages : 124
    Par d�faut [MFC] - MDI : CDialogBar resize....
    Bonjour � toutes et � tous,

    Encore une fois je me bats � grand coup de CDialogBar (vive les bo�tes flottantes)...

    Donc j'ai une application MDI avec plusieurs CDialogBar.
    Mon probl�me aujourd'hui est de laisser � l'utilisateur le pouvoir de redimensionner une bo�te de dialogue flottante.

    Quand je lance l'application, j'aper�oit bien le changement de mon curseur pour me signaler que je peux changer la largeur et la hauteur de ma bo�te.
    Mais quand je veux le faire, mon curseur se bloque comme si la bo�te ne pouvait pas se redimensionner.
    Deplus j'ai impl�menter la fonction li�e � l'�v�nement WM_SIZE de ma bo�te, mais je n'y passe jamais pour le redimentsionnement !!


    Auriez vous une id�e de la manip � r�aliser pour pouvoir resizer ce genre de bo�te ?

    J'ai essay� de placer les options de bo�tes vScroll et hScroll pour les ascenseurs. Mais l� m�me probl�me aucune action de r�aliser m�me si la bo�te est plus petite que ce qu'elle contient.

    l� le programme arrive bien dans les fonctions de scrolle mais rien ne se passe !! Si vous pouviez m'aider ... svp !



    Alice

  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
    Par d�faut
    salut,
    je pense qu'il va falloir l'aider un petit peu ,
    Pour cela spy est notre ami.
    Il va falloir jouer avec le message WM_GETMINMAXINFO (voir faq) pour le contr�le de la taille.
    Et voir ce que tu peux faire avec le message WM_EXITSIZEMOVE
    Qui devrait te permettre de faire toi-m�me le resize final

  3. #3
    Membre confirm�
    Avatar de Alice9
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Mai 2004
    Messages : 124
    Par d�faut


    Dans la classe de ma bo�te de dialogBar, je n'ai acc�s ni � l'�v�nement WM_GETMINMAXINFO ni � l'�v�nement WM_EXISTSIZEMOVE.


    par contre j'ai bien mis l'option CBRS_SIZE_DYNAMIC comme propri�t� de ma bo�te de dialogBar lors de la cr�ation de son instance :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    m_dlgBar_Image.Create(this, IDD_DLGBAR_IMAGE, 
    		CBRS_NOALIGN|CBRS_GRIPPER|CBRS_SIZE_DYNAMIC, IDD_DLGBAR_IMAGE)
    sigh...

    Alice

  4. #4
    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
    Par d�faut
    pour getminmaxinfo onglet classinfo topmost frame:
    pour l'autre regarde un peu avec MSDN sur le message :
    WM_EXITSIZEMOVE
    The WM_EXITSIZEMOVE message is sent one time to a window, after it has exited the moving or sizing modal loop. The window enters the moving or sizing modal loop when the user clicks the window's title bar or sizing border, or when the window passes the WM_SYSCOMMAND message to the DefWindowProc function and the wParam parameter of the message specifies the SC_MOVE or SC_SIZE value. The operation is complete when DefWindowProc returns.

    A window receives this message through its WindowProc function.

  5. #5
    Membre confirm�
    Avatar de Alice9
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Mai 2004
    Messages : 124
    Par d�faut
    quand je fait un pas � pas, je ne passe pas dans ces fonctions.

    En fa�t et je me r�p�te : d�s que l'on veut avec le curseur, redimensionner la bo�te. celui se comporte comme si la bo�te avait une dimension fixe.
    or je lui ai donn� la propi�t� CBRS_SIZE_DYNAMIC !!!

    D�j� sur ce point, je trouve que c'est un comportement anormal ...

    tu aurais une id�e ?


    Alice

  6. #6
    Membre confirm�
    Avatar de Alice9
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Mai 2004
    Messages : 124
    Par d�faut


    �a y est j'ai trouv� !!!

    Bon pour ceux que �a int�resse, la solution est la suivante :

    premi�rement, il faut surcharger la fonction CalcDynamicLayout (fonction li�e � CDialogBar).
    pour cela ajouter dans myDlgBar.Cpp, le code suivant :
    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
    CSize CMyDlgBar;:CalcDynamicLayout(int nLength, DWORD dwMode)
    {
    CRect rect ; // vue client de la boîte
    	m_pMainFrame->GetClientRect(rect) ; // récupération préalable d'un pointeur sur la mainFrame
    // 	CMDIFrameWnd *m_pMainFrame;  déclaré dans le .h en public
    // dans la mainframe après création de ma boîte, je mets m_myDlgBar.m_pMainFrame = this
     
    // si le mode est barre aggrippée horizontalement ou verticalement
    // appel à la fonction de base correspondante
    	if (dwMode & (LM_HORZDOCK | LM_VERTDOCK))
        {
    		return CDialogBar::CalcDynamicLayout(nLength,dwMode) ;
        }
     
        if (dwMode & LM_MRUWIDTH) return m_szFloat;
        if (dwMode & LM_COMMIT) return m_szFloat; // already committed
     
    // le mode : redimensionnement de la boîte
    // on récupère les nouvelles dimensions de la taille de la boîte
        ((dwMode & LM_LENGTHY) ? m_szFloat.cy : m_szFloat.cx) = nLength;
     
        m_szFloat.cx = max(m_szFloat.cx, m_szMin.cx);
        m_szFloat.cy = max(m_szFloat.cy, m_szMin.cy);
     
        return m_szFloat;
    }
    Bien entendu cette fonction est d�clar� dans le .h en tant que fonction publique.
    Toujours dans le .h, d�clarer :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    CSize m_szFloat ; // taille en cours de la boîte
     CSize m_szMin ; // nouvelle taille de la boîte
    Ne pas oubli� de donner une taille initiale � ces 2 variables !!!

    Dans un 2�me temps, dans le fichier MainFrame, surcharger la fonction GetClientRect :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void CMainFrame::GetClientRect(LPRECT lpRect)
    {
    	CRect rect ;
    	CFrameWnd::GetClientRect(lpRect) ; // récupération de la taille de la vue client 
            // si une barre d'état est visible
            // on déduit de la surface totale de la vue client les dimensions que prend la barre d'état
            // si dans l'application vous avez une CToolBar faire de même !!
    	if (m_wndStatusBar.IsWindowVisible())
    	{
    		m_wndStatusBar.GetClientRect(rect) ;
    		lpRect->bottom -= rect.Height() ;
    	}
    }
    Ne pas oublier de la d�clarer en public dans le .h

    De cette mani�re, on obtient une bo�te flottante redimensionnable avec la souris !



    Alice

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 9
    Dernier message: 16/05/2005, 17h43
  2. R�ponses: 12
    Dernier message: 15/02/2005, 15h34
  3. R�ponses: 3
    Dernier message: 09/02/2005, 16h43
  4. R�ponses: 12
    Dernier message: 02/02/2005, 16h52
  5. [MFC]Property Sheet resizable
    Par fr66 dans le forum MFC
    R�ponses: 4
    Dernier message: 14/06/2004, 17h28

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