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 régulier
    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
    Points : 85
    Points
    85
    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
    Alice

    A coeur vaillant, rien d'impossible !

  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,
    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 régulier
    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
    Points : 85
    Points
    85
    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
    Alice

    A coeur vaillant, rien d'impossible !

  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
    Points : 17 323
    Points
    17 323
    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 régulier
    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
    Points : 85
    Points
    85
    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
    Alice

    A coeur vaillant, rien d'impossible !

  6. #6
    Membre régulier
    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
    Points : 85
    Points
    85
    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
    Alice

    A coeur vaillant, rien d'impossible !

+ 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