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 :

[AfxMessageBox] Comment la positionner


Sujet :

MFC

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Inscrit en
    Avril 2005
    Messages
    125
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 125
    Par d�faut [AfxMessageBox] Comment la positionner
    Bonjour,

    Je cherche � positionner une AfxMessageBox en lui donnant des coordonn�es absolues. (Un peu comme un MoveWindow d'une CWnd.)

    J'ai demand� � Google qui ne m'a pas beaucoup avanc� sur le sujet.

    Quelqu'un aurait il une id�e ?

    Merci de votre aide.

  2. #2
    Membre confirm�
    Inscrit en
    Avril 2005
    Messages
    125
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 125
    Par d�faut
    J'ai trouv� une solution qui pourrait m�riter d'�tre am�lior�e.
    Je vous la propose :

    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
     
    HHOOK hHook;
    ///////////////////////////////////////////////////////////////
    LRESULT CALLBACK   HookProc(UINT code , WPARAM wParam, LPARAM lParam)
    {
    	if (code == HCBT_ACTIVATE)
    	{
    		CRect  RectFrame;
    		BOOL bRect = ::GetWindowRect((HWND) wParam,&RectFrame);
     
    		// Lecture de la résolution de l'écran
    		int nResolution = GetSystemMetrics(SM_CXSCREEN);		if( nResolution > 0 )
    		{
    			// Lecture de la hauteur de l'écran
    			CWnd* pWnd = CWnd::GetDesktopWindow();
    			CRect  RectEcran;
    			pWnd->GetWindowRect(&RectEcran);
     
    			// Coordonnées du coin haut gauche de la boite de dialogue
    			int nOffsetGauche = (nResolution - RectFrame.Width())/2;
    			int nOffsetHaut = (RectEcran.Height() - RectFrame.Height()) / 2 ;
     
    			// Mise à jour de la position de la fenêtre
    			BOOL b = ::SetWindowPos((HWND)wParam,HWND_TOP,nOffsetGauche,nOffsetHaut,RectFrame.Width(),RectFrame.Height(),SWP_NOZORDER);	
    		}
    		UnhookWindowsHookEx (hHook);
    	}
    	return 0;
    }
     
    ///////////////////////////////////////////////////////////////
    int CentreAfxMessageBox(LPCTSTR lpszText, UINT nType, UINT nIDHelp)
    {
    	hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC)HookProc, 0, GetCurrentThreadId() );
     
    	int nRetour = AfxMessageBox ( lpszText,nType, nIDHelp);
     
    	UnhookWindowsHookEx (hHook);
    	return nRetour;
    }
    Le but �tant d'appeler la m�thode CentreAfxMessageBox(...) � la place de la m�thode AfxMessageBox avec le m�me prototypage.

    Cela fonctionne bien quand CentreAfxMessageBox est appel� depuis la fenetre principale.
    Je l'utilise en double �cran, le message est alors centr� sur le premier �cran (car la m�thode GetSystemMetrics(SM_CXSCREEN) renvoie la r�solution d'un des deux �crans).

    Par contre, lorsque l'appel se fait depuis une boite de dialogue interm�diaire, j'ai laiss� l'appel � la m�thode de base (AfxMessageBox). La raison est que AfxMessageBox centre tout seul le message sur la fen�tre parente (la boite de dialogue interm�diaire qui elle est bien positionn�e).

    Une id�e d'am�lioration serait donc de rep�rer si on vient de la fen�tre principale de l'application ou d'une boite de dialogue. Dans le premier cas, on centre sur l'�cran de gauche, dans le second, on ne fait rien et on laisse g�rer AfxMessageBox.

    Une autre piste serait de rep�rer si le message chevauche les deux �crans (ce qui �tait mon probl�me de base en mode bureau �tendu). Dans ce cas, le repositionner au milieu du premier �cran, sinon ne rien faire.
    L'ennui est que le code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    CWnd* pWnd = CWnd::GetDesktopWindow();
    CRect  RectEcran;
    pWnd->GetWindowRect(&RectEcran);
    ne me ram�ne qu'un des deux �crans (r�solution = 1024 au lieu de 2048)

    Des id�es pour aller plus loin ?

Discussions similaires

  1. comment se positionner sur une ligne de table mysql ?
    Par pas30 dans le forum Requ�tes
    R�ponses: 3
    Dernier message: 13/01/2007, 13h43
  2. R�ponses: 4
    Dernier message: 30/10/2006, 16h46
  3. R�ponses: 7
    Dernier message: 25/08/2006, 17h31
  4. [C#] Comment se positionner dans un DataGridview
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    R�ponses: 4
    Dernier message: 12/05/2006, 12h45
  5. R�ponses: 3
    Dernier message: 27/04/2006, 10h01

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