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 :

Intercepter WM_SIZE d'un control enfant


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut Intercepter WM_SIZE d'un control enfant
    Bonjour à tous,

    J'aimerais intercepter le message WM_SIZE mais pour un contrôle créé dynamiquement. Je m'explique :

    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
    BOOL CMyDialog::OnInitDialog()
    {
       CDialog::OnInitDialog();
    
       // m_MyControl dérive de CWnd
       m_MyControl.Create( NULL, _T(""), WS_VISIBLE, CRect(10, 10, 0, 0), this, 1 );
    }
    
    LRESULT CMyDialog::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message) 
        {
             case WM_SIZE :  // Ici, j'aimerais intercepter ce message mais pour pour le contrôle m_MyControl et non pour la fenêtre.
        }
    }
    Sinon, est-ce que je dois m'y prendre autrement ?
    Merci

  2. #2
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    Le premier paramêtre de Create est NULL; hors il faut passer le nom d'une WNDCLASS ou classe de fenêtre par exemple BUTTON,STATIC,EDIT...

    // Ici, j'aimerais intercepter ce message mais pour pour le contrôle m_MyControl et non pour la fenêtre.
    Oui mais c'est la fenêtre qui redimensionne le controle pas l'utilisateur.
    Le controle il ne reçoit pas un message de redimensionnement parce que c'est un controle pas une fenêtre..

    Pour le redimensionner il faut appeler MoveWindow ou SetWindoPos.

    Au besoin il faut "subclasser" le controle..
    Il faut déclarer une WndProc c.a.d une procédure CALLBACK de gestion de message et avec SetWindowLong rattacher cette WndProc au controle.
    Dans cette WndProc on peut gérer WM_SIZE propre au controle et tous les autres messages..

    Sinon regarder
    CWnd::SubclassDlgItem
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class CMyButton : public CButton {...};
    // m_myButton is a CMyButton object member of CAboutDlg
     
    BOOL CAboutDlg::OnInitDialog() 
    {
       CDialog::OnInitDialog();
       // IDC_BUTTON1 is the ID for a button on the 
       // dialog template used for CAboutDlg.
       m_myButton.SubclassDlgItem(IDC_BUTTON1, this);   
     
       return TRUE;   // Return TRUE unless you set the focus to a control
                      // EXCEPTION: OCX Property Pages should return FALSE
    }

  3. #3
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Merci !!!
    J'ai trouvé la solution avant de lire votre post, mais finalement tout cela fonctionne à merveille. Je vois que je n'étais pas sur la mauvaise piste

    Mais dis-moi, est-ce tout semble bien ?

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
     
    LRESULT CALLBACK TrappeCtrlNewWndProc(HWND hWnd,UINT Message, WPARAM wParam, LPARAM lParam); 
    LONG TrappeOldWndProc; 
     
    BOOL CSommaire2Dlg::OnInitDialog()
    {
         CDialog::OnInitDialog();
     
         m_SommaireTrappeCtrl.Create( NULL, _T("STATIC"), WS_VISIBLE, CRect(10, 10, 0, 0), this, 1 );
     
         TrappeOldWndProc = SetWindowLong(m_SommaireTrappeCtrl, GWL_WNDPROC, (long)TrappeCtrlNewWndProc); 
     
         return TRUE;
    }
     
    LRESULT CALLBACK TrappeCtrlNewWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) 
    { 
      switch(Message)
      { 
        case WM_SIZE : 
    	LRESULT result = CallWindowProc( (WNDPROC)TrappeOldWndProc, hWnd, NULL, wParam, lParam);
     
    	// Get parent
    	HWND hWndParent = GetParent(hWnd);
     
    	// Get parent rect
    	RECT rcParent;
    	GetClientRect(hWndParent, &rcParent);
     
    	// Get parent rect
    	RECT rcTrappeCtrl;
    	GetWindowRect(hWnd, &rcTrappeCtrl);
     
    	// Get new size of trappe control
    	int w = LOWORD(lParam);
    	int h = HIWORD(lParam);
     
    	// Set trappe control in the middle (horizontally)
    	SetWindowPos(hWnd, hWndParent, 
    		((rcParent.right - rcParent.left) - w) / 2, rcTrappeCrl.top, 
    			0, 0, SWP_NOSIZE | SWP_SHOWWINDOW );
     
    	return result;
    	break; 
      } 
     
      // Call default function
      return CallWindowProc((WNDPROC) TrappeOldWndProc,hWnd,Message,wParam,lParam); 
    } 
     
    void CSommaire2Dlg::OnClose()
    {
        // Reset winproc function
        SetWindowLong(m_SommaireTrappeCtrl, GWL_WNDPROC, (long)TrappeOldWndProc); 
     
        // Destroy trappe control
        m_SommaireTrappeCtrl.DestroyWindow();
     
        CDialog::OnClose();
    }
    Encore merci pour ton aide

  4. #4
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    Mais dis-moi, est-ce tout semble bien ?
    autant arreter d'utiliser les MFC si c'est pour le faire directement avec l'API Win32 ... tu te prives de toutes les fonctionnalités MFC en faisant comme ça

    MyCustomWnd.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class CMyCustomWnd : public CWnd
    {
      DECLARE_DYNAMIC(CMyCustomWnd)
     
    public:
     
      DECLARE_MESSAGE_MAP()
     
      afx_msg void OnSize(UINT nType,int cx,int cy);
    };
    MyCustomWnd.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    IMPLEMENT_DYNAMIC(CMyCustomWnd,CWnd)
     
    BEGIN_MESSAGE_MAP(CMyCustomWnd,CWnd)
      ON_WM_SIZE()
    END_MESSAGE_MAP()
     
    void CMyCustomWnd::OnSize(UINT nType,int cx,int cy)
    {
      // ... TODO
    }
    Le premier paramêtre de Create est NULL; hors il faut passer le nom d'une WNDCLASS ou classe de fenêtre par exemple BUTTON,STATIC,EDIT...
    non, si le nom de la classe est NULL, les MFC en fourniront une par défaut.
    c'est fait dans CWnd:: PreCreateWindow() il me semble.

    @+

  5. #5
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Malheureusement stephdim, je ne crois pas que tu es bien saisie ce que je voulais faire.

    En fait, je veux INTERCEPTER le message WM_SIZE d'un des ENFANTS de mon dialog. Tout ceci À PARTIR de la classe de mon DIALOG.

    Pourquoi ? Parce que mon contrôl enfant peut changer de taille dynamiquement et ce en fonction d'un facteur d'acquisition de données que seul lui contrôle à l'interne.

    Sinon, j'aurais aussi pu intercepter le message WM_SIZE à l'intérieur de ma classe dérivée et par la suite envoyé un message REFLECTED (du genre WM_CHILD_RESIZED à mon parent (mon Dialog).

  6. #6
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    En fait, je veux INTERCEPTER le message WM_SIZE d'un des ENFANTS de mon dialog. Tout ceci À PARTIR de la classe de mon DIALOG.
    oui et qu'est ce qui t'empeches d'appeler par la suite une méthode de ton CDialog depuis ta child window ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void CMyCustomWnd::OnSize(UINT nType,int cx,int cy)
    {
      CMonDialog *pDialog=STATIC_DOWNCAST(CMonDialog,GetParent());
      pDialog->OnChildResized(...);    // ta propre fonction
    }
    tu fais exactement la meme chose dans ta méthode, sauf que tu subclasses à la main la fenetre ...

    EDIT: (j'avais pas tout lu )

    Sinon, j'aurais aussi pu intercepter le message WM_SIZE à l'intérieur de ma classe dérivée et par la suite envoyé un message REFLECTED (du genre WM_CHILD_RESIZED à mon parent (mon Dialog).
    oui une autre façon de faire mais un peu compliqué à mettre en oeuvre pour ce cas précis ... c'est valable si le parent n'est pas toujours le meme Dialog par exemple

    @+

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

Discussions similaires

  1. [TabItem] Comment acceder aux controles enfant ?
    Par adrienfehr dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 08/09/2008, 09h36
  2. Réponses: 1
    Dernier message: 04/03/2008, 13h34
  3. Réponses: 3
    Dernier message: 07/07/2007, 10h35
  4. Réponses: 9
    Dernier message: 23/05/2006, 15h33
  5. Réponses: 3
    Dernier message: 26/04/2006, 20h16

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