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 :

CWinApp/CMainFrame sans CView : comment récupérer l'active area de ma fenêtre?


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Par défaut CWinApp/CMainFrame sans CView : comment récupérer l'active area de ma fenêtre?
    Bonjour à tous,

    Je dois développer une fonction d'impression pour une application C++/ MFC de type CWinApp mais sans SDI ou MDI, je n'ai donc pas de CView associé à mon objet CMainFrame.
    Pour illustrer mes propos, la méthode OnCreate:

    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
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    		return -1;
     
    	// create a view to occupy the client area of the frame
    	if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
    		CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
    	{
    		TRACE0("Failed to create view window\n");
    		return -1;
    	}
     
            ......ETC......
    }
    L'objet m_wndView est un objet OpenGL héritant de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public CWnd, public OGLViewport
    J'ai trouvé sur mon forum préféré de quoi imprimer ma fenêtre avec la méthode CopyWindowToBitmap(pWnd,true) et PrintBmp(pBmp) mais CopyWindowToBitmap(CWnd*, bool) prend un pointeur sur un CWnd en paramètre donc j'imprime la fenêtre globale : "active area" (scène OpenGL) et menu, bar d'outils & cie.....
    Or je dois absolument imprimer uniquement la partie "active area" de ma fenêtre (le dessin OpenGL), pas de menu ni barre d'outils & cie.
    Le code travaille bien avec pWnd->GetClientRect(&rectClient) mais je récupère quand même les menus, bar d'outils & cie.

    Comment puis-je récupérer les coordonnées de l'active area (la seule partie cliente de la fenêtre) d'un objet Cwnd?
    Est-ce possible?


    Merci pour votre aide,
    ca fait des heures que je parcours les forums et le web en vain....
    Bonne journée à tous.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    pWnd représente quelle fenêtre? CMainFrame? Car, alors ce devrait plutôt être quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ... CMainFrame::Imprimer(...)
    {
    CWnd Client;
    Client.Attach(m_wndView);
    CopyWindowToBitmap(&m_wndView,true);
    Client.Detach();
    }
    En fait, pour rester dans une logique MFC, je dirais que tu ne devrais pas avoir un membre HWND m_wndView, mais un CWnd m_wndView et faire le CWnd::Attach après la création de ta fenêtre.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Par défaut
    Bonjour,
    Pardon, je n'ai pas été très précise concernant le code; depuis MainFrame.cpp, j'appelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CWnd* pWnd=  this->GetActiveWindow();
     
    		if(pWnd)
    		{
    			CBitmap *pBmp=CopyWindowToBitmap(pWnd,true);
    			PrintBmp(pBmp);    
    			pBmp->DeleteObject();
    			delete pBmp;
    		}
    Donc pWnd représente l'active window de CMainFrame.
    Et la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CopyWindowToBitmap(pWnd,true)
    appelle donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetClientRect(&rectClient)
    sur cet objet CWnd et j'obtiens malgré tout la totalité de la fenêtre avec barre d'outils et menu et non pas uniquement la "client area" sans que je comprenne pourquoi.

    Autre précision, mon objet m_wndView, utilisé pour créer la vue OpenGL occupant la "client area" du CMainFrame est définit comme suit:
    COGLWnd est définit comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class OGLWNDLIB_API COGLWnd : public CWnd, public OGLViewport
    {
    ....
    }
    J'espère être plus claire.
    Merci encore pour vos suggestions et votre aide,
    je me bats avec ce menu et cette toolbar...

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 464
    Par défaut
    Est-ce que la méthode indiquée dans l'Url suivante ne marche pas ?
    http://www.developer.com/net/cplus/article.php/603861

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Par défaut
    Voilà, tout mon problème est là, je n'ai aucun objet qui dérive de CView donc je ne peux pas utiliser le OnPrint (CDC* pDC, CPrintInfo* pInfo) par défaut proposé par l'archi SDI ou MDI des MFCs/visual C++.

    Bacelar, dans l'url que tu me proposes, le code est implémenté dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void COpenGLView::OnPrint(CDC* pDC, CPrintInfo* pInfo) {
    ...}
    Et COpenGLView est définit comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class COpenGLView : public CView {
    ...}
    Moi, dans mon prototype d'application, je n'ai pas ce schéma de classes MFC là, je dérive uniquement de CWnd et non de CView qui elle gère l'impression et la preview, la totale quoi.......arghhhhh....et je ne peux pas tout redévelopper, surtout en 4 jours

    Merci quand même pour ton aide
    Quelqu'un d'autre a une idée?

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    As-tu essayé avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CopyWindowToBitmap(&m_wndView,true)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    As-tu essayé avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CopyWindowToBitmap(&m_wndView,true)
    AAAAAAAAAAAAAAAAAAAAAAAH, j'ai tout essayé sauf ça mais je suis nulle, de chez nulle, put@%¤! J'ai quoi devant les yeux?!
    MERCI, comment dire.... merci mille fois!

    [j'ai honte tellement c'était évident, chuis désolée...]

    Mais merci encore

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

Discussions similaires

  1. Comment récupérer le nom du fichier sans l'extension ?
    Par altahir007 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2009, 13h20
  2. Réponses: 2
    Dernier message: 14/01/2007, 23h17
  3. Réponses: 3
    Dernier message: 30/01/2006, 16h24
  4. Réponses: 1
    Dernier message: 19/01/2006, 16h23
  5. Comment récupérer le nom du fichier sans le chemin ?
    Par st0nky dans le forum Débuter
    Réponses: 3
    Dernier message: 08/12/2005, 11h01

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