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] Afficher une CWnd sur un 2ème moniteur [FAQ]


Sujet :

MFC

  1. #1
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut [MFC] Afficher une CWnd sur un 2ème moniteur
    Bonjour à tous,

    j'ai une carte ATI avec 2 sorties et 2 écrans.
    lorque je lance une fenetre (CWnd, CDialog, ou CPropertySheet),
    elle s'ouvre uniquement sur le moniteur principal.
    Je voudrais qu'elle s'ouvre d'emblée sur le moniteur secondaire

    Comment faire ?
    Merci d'avance
    Philippe
    Philippe

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    faut regarder la config de tes moniteurs et voir s'il faut le mettre en coordonnées négatives. Voir GetMonitorInfo et SetWindowsPos

  3. #3
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut
    Bonjour,

    en effet, les coordonnées négatives fonctionnent, mais je n'arrive pas à initialiser ma CPropertySheet à de nouvelles coordonnées :
    j'ai tenté un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //_____________________________________________________________________________
    BOOL CSheet::PreCreateWindow(CREATESTRUCT& cs) {
     
    cs.x=0;   // pour commencer prudemment
    cs.y=50;
     
    return CPropertySheet::PreCreateWindow(cs);
    } //proc
    mais ma feuille apparait despérément au milieu.
    Si tu peux me dire comment la faire apparaitre à des coordonnées données, je pourrais en effet lui donner des coordonnées négatives

    Merci d'avance
    Philippe
    Philippe

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    setwindowpos

  5. #5
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut
    Certes... mais ceci ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //_____________________________________________________________________________
    BOOL CSheet::PreCreateWindow(CREATESTRUCT& cs) {
     
    SetWindowPos(this,10,50,0,0,SWP_NOSIZE);
     
    return CPropertySheet::PreCreateWindow(cs);
    } //proc
    où dois-je placer le SetWindowPos ?

    Merci d'avance
    Philippe
    Philippe

  6. #6
    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
    tu n'aurais pas coché la proprieté center de ta dialogue ?

  7. #7
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut
    Bonjour,

    non, je n'ai pas coché Center, sur aucune des dialogues qui composent ma CPropertySheet.

    Comme suggéré dans un autre message, j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CSheet ps   // CSheet est dérivée de CPropertySheet
    ps.SetWindowPos(....)
    ps.DoModal();
    mais ça plante car la fenetre n'est pas encore initialisée
    j'ai tenté aussi la surcharge suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //_____________________________________________________________________________
    BOOL CSheet::PreCreateWindow(CREATESTRUCT& cs) {
     
    SetWindowPos(this,10,50,0,0,SWP_NOSIZE);
     
    return CPropertySheet::PreCreateWindow(cs);
    } //proc
    mais ça ne fonctionne pas ...


    Comment faire ?
    Philippe
    Philippe

  8. #8
    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,
    la solution:
    http://www.developpez.net/forums/sho...65#post1390665

    Note: ce code est valable pour une CDialog ,pour une CPropertySheet
    il faut changer le nom de la classe de base dans la fonction DoModal...

  9. #9
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut
    Bonjour Farscape,

    merci pour cette solution MAIS ...
    j'ai peur d'avoir du mal à l'appliquer à une CPropertySheet :

    la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       m_lpszTemplateName = NULL;
       InitModalIndirect(pdata);
    ne fonctionne que dans une classe dérivée d'une CDialog.

    Comme ma classe est dérivée d'une CPropertySheet, la compil plante.
    et comme je suis largué par ce bout de code, je ne sais absolument pas comment le modifier
    (à part l'appel à DoModal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       // appel domodal 
       nResult = CPropertySheet::DoModal();
    Y'a - t-il une solution à ton avis ?
    Philippe
    Philippe

  10. #10
    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
    ,oups j'ai débloqué lol ,
    la propertysheet (que je n'utilise pas) ne derive pas d'une CDialog et donc n 'a pas de resource d'origine à part les pages.
    mais on peut faire ceci sans probleme en surchagant DoModal:
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    #include <afxpriv.h>
    #include <AFXIMPL.H> // attention ce header est definit dans les sources des MFC ,on peut rajouter le chemin des src MFC dans la recherche des includes...
     
    int CMyPropertySheet::DoModal()
    {
       ASSERT_VALID(this);
        ASSERT(m_hWnd == NULL);
     
        // register common controls
        VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG));
        AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG);
     
        // finish building PROPSHEETHEADER structure
        BuildPropPageArray();
     
        // allow OLE servers to disable themselves
        CWinApp* pApp = AfxGetApp();
        if (pApp != NULL)
            pApp->EnableModeless(FALSE);
     
        // find parent HWND
        HWND hWndTop;
        HWND hWndParent = CWnd::GetSafeOwner_(m_pParentWnd->GetSafeHwnd(), &hWndTop);
        AFX_OLDPROPSHEETHEADER* psh = GetPropSheetHeader();
        psh->hwndParent = hWndParent;
        BOOL bEnableParent = FALSE;
        if (hWndParent != NULL && ::IsWindowEnabled(hWndParent))
        {
            ::EnableWindow(hWndParent, FALSE);
            bEnableParent = TRUE;
        }
        HWND hWndCapture = ::GetCapture();
        if (hWndCapture != NULL)
            ::SendMessage(hWndCapture, WM_CANCELMODE, 0, 0);
     
        // setup for modal loop and creation
        m_nModalResult = 0;
        m_nFlags |= WF_CONTINUEMODAL;
     
        // hook for creation of window
        AfxHookWindowCreate(this);
        psh->dwFlags |= PSH_MODELESS;
        m_nFlags |= WF_CONTINUEMODAL;
        HWND hWnd = (HWND)::PropertySheet((PROPSHEETHEADER*)psh);
        if(m_nx || m_ny) // ma modification, trés modeste ...
            ::SetWindowPos(hWnd,NULL,m_nx,m_ny,0,0,SWP_NOSIZE);
    #ifdef _DEBUG
        DWORD dwError = ::GetLastError();
    #endif
        psh->dwFlags &= ~PSH_MODELESS;
        AfxUnhookWindowCreate();
     
        // handle error
        if (hWnd == NULL || hWnd == (HWND)-1)
        {
            TRACE1("PropertySheet() failed: GetLastError returned %d\n", dwError);
            m_nFlags &= ~WF_CONTINUEMODAL;
        }
     
        int nResult = m_nModalResult;
        if (ContinueModal())
        {
            // enter modal loop
            DWORD dwFlags = MLF_SHOWONIDLE;
            if (GetStyle() & DS_NOIDLEMSG)
                dwFlags |= MLF_NOIDLEMSG;
            nResult = RunModalLoop(dwFlags);
        }
     
        // hide the window before enabling parent window, etc.
        if (m_hWnd != NULL)
        {
            SetWindowPos(NULL, 0, 0, 0, 0, SWP_HIDEWINDOW|
                SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
        }
        if (bEnableParent)
            ::EnableWindow(hWndParent, TRUE);
        if (hWndParent != NULL && ::GetActiveWindow() == m_hWnd)
            ::SetActiveWindow(hWndParent);
     
        // cleanup
        DestroyWindow();
     
        // allow OLE servers to enable themselves
        if (pApp != NULL)
            pApp->EnableModeless(TRUE);
        if (hWndTop != NULL)
            ::EnableWindow(hWndTop, TRUE);
     
        return nResult;
    }
    mon header :
    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
     
    /////////////////////////////////////////////////////////////////////////////
    // CMyPropertySheet
     
    class CMyPropertySheet : public CPropertySheet
    {
        DECLARE_DYNAMIC(CMyPropertySheet)
     
    // Construction
    public:
        CMyPropertySheet(CWnd* pWndParent = NULL);
        virtual int    DoModal();
        void SetCoord(int x,int y){m_nx=x;m_ny=y;}
    // Attributes
    public:
        CMyPropertyPage1 m_Page1;
        CMyPropertyPage2 m_Page2;
        CMyPropertyPage3 m_Page3;
     
    // Operations
    public:
    int m_nx,m_ny; // initialisé a 0 dans le constructeur ....
     
    // Overrides
        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CMyPropertySheet)
        //}}AFX_VIRTUAL
     
    // Implementation
    public:
        virtual ~CMyPropertySheet();
         virtual void PostNcDestroy();
     
    // Generated message map functions
    protected:
        //{{AFX_MSG(CMyPropertySheet)
            // NOTE - the ClassWizard will add and remove member functions here.
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
    };
    utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CMyPropertySheet dlg;
    dlg.SetCoord(500,200);
    dlg.DoModal();

  11. #11
    Membre régulier Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Points : 99
    Points
    99
    Par défaut
    De plus en plus impressionnant !!
    Ca marche parfaitement !
    (sauf que la feuille apparait d'abord centrée, avant de se positionner à la position désirée, je regarderai plus tard si on peut changer ça)

    Merci pour le temps passé
    Bon dimanche
    Philippe
    Philippe

  12. #12
    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
    Citation Envoyé par Philippe320
    De plus en plus impressionnant !!
    Ca marche parfaitement !
    (sauf que la feuille apparait d'abord centrée, avant de se positionner à la position désirée, je regarderai plus tard si on peut changer ça)

    Merci pour le temps passé
    Bon dimanche
    Philippe
    salut,
    je ne suis pas sur que ça soit possible, le traitement d'initialisation est fait avec la fonction propertySheet, celle-ci au premier abord ne permet pas d'intervenir sur la position initiale...


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

Discussions similaires

  1. [MFC] afficher une ProgressBar dans une barre d'etat
    Par guillaume21 dans le forum MFC
    Réponses: 5
    Dernier message: 30/03/2007, 11h16
  2. Réponses: 8
    Dernier message: 17/04/2005, 19h58
  3. [MFC] afficher une boîte de dialogue
    Par bigboomshakala dans le forum MFC
    Réponses: 13
    Dernier message: 10/05/2004, 14h22
  4. Réponses: 3
    Dernier message: 28/01/2004, 14h55
  5. afficher une fenetre_B sur une autre fenetre_A
    Par dibak dans le forum C++Builder
    Réponses: 14
    Dernier message: 10/10/2003, 23h50

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