Ein CAxDialogImpl und ein CWindowImpl zusammen in einem CAtlExeModuleT anzeigen.



  • Liebe ATL Coder,

    Ich habe eine Frage, die für erfahrene ATL Programmierer wahrschein-
    lich leicht zu beantworten ist, aber für Anfänger schwierig ist.
    Ich habe ein CAtlExeModuleT (s. Code unten) und möchte ein Beispiel
    anpassen, welches ich übernommen habe und welches auch läuft. Der
    Ausgangspunkt war ein CAxDialogImpl Objekt in der PreMessageLoop des
    CAtlExeModuleT. Ich wollte den Dialog non-modal machen um ein zusätz-
    liches CWindowImpl Fenster anzeigen zu können (soll später Fullscreen
    sein können, um jpegs anzuzeigen - der Dialog soll also dann nicht
    vor dem Fenster sein!).
    Meine Frage ist also, ob es möglich ist, ein CAxDialogImpl UND ein
    CWindowImpl Objekt zu erzeugen, welche beide den Desktop als Elter
    (parent) haben (indem man NULL als ersten Parameter in dem Create()-
    Aufruf angibt)? Oder müssen sie irgendwie über eine Elter-Kind-Bezieh-
    ung verknüpft sein (wie ist das unter Windows eigentlich)? Als ich
    das Programm (s. unten) ausführte, lief es zunächst nur kurz, ohne
    etwas anzuzeigen. Ich habe dann ein Sleep(5000) nach dem Erzeugen des
    Fensters eingefügt und dann war es für diese Zeit sichtbar. D.h. es
    muß mit dem Geltungsbereich zusammenhängen. Der Dialog jedoch wurde
    nicht angezeigt. Wie kann ich also beide zugleich anzeigen, das Fens-
    ter und den Dialog? Muß ich sie beide in PreMessageLoop erzeugen
    (habe ich ausprobiert, der Effekt war jedoch der gleiche; brauche ich
    PreMessageLoop)? Ich würde eine Lösung mit _tWindMain aber ohne Pre-
    MessageLoop bevorzugen, falls das geht, je einfacher, desto besser!

    Bitte helft, ich habe schon alles ausprobiert, zwei dicke ATL Bücher
    gewälzt, ins Netz geschaut, selber 'rumprobiert...
    Ich habe immer nur Beispiele mit dem älteren CCom Zeug gefunden, wo
    eine (while-) Hauptschleife in _tWinMain erzeugt wurde, worin Trans-
    lateMessage(&msg) und DispatchMessage(&msg) aufgerufen werden, aber
    kein Beispiel, wie das in meinem Fall zusammen mit der Funktion
    _AtlModule.WinMain(nShowCmd) zusammen funktioniert. Ich verwende
    Visual Studio 2005 und die Version der ATL, die dabei ist (wohl
    Version 8, vermute ich).

    wäre super, wenn mir jemand helfen kann, denn ich bin schon echt
    verzweifelt, so schwer kann das doch nicht sein...

    Vielen Dank schon einmal im Voraus und Viele Grüße,

    Peter.

    Hier kommt der Code:

    // Test.cpp : _tWinMain verwenden um ein CAxDialogImpl<> und ein CWindowImpl<> anzuzeigen.
    
    #include "stdafx.h"
    #include "resource.h"
    #include "mainDialog.h"
    
    class CMyWindow : public CWindowImpl<CMyWindow>
    {
    public:
       // Optionally specify name of the new Windows class
       DECLARE_WND_CLASS("MyName") 
                  // If this macro is not specified in your
                  // class, ATL will generate a class name
    
       BEGIN_MSG_MAP(CMyWindow)
          MESSAGE_HANDLER(WM_PAINT, OnPaint)
       END_MSG_MAP()
    
       LRESULT OnPaint(UINT nMsg, WPARAM wParam, 
                       LPARAM lParam, BOOL& bHandled)
       {
          // Do some painting code
          return 0;
       }
    };
    
    class CSampleModule : public CAtlExeModuleT< CSampleModule >
    {
    public :
    	HRESULT PreMessageLoop(int nShowCmd)
    	{
    		HRESULT hr = CAtlExeModuleT<SampleModule>::PreMessageLoop(nShowCmd);
    		if (FAILED(hr))
    			return hr;
    
    		return S_FALSE;
    	}
    };
    
    CSampleModule _AtlModule;
    
    //
    extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, 
                                    LPTSTR /*lpCmdLine*/, int nShowCmd)
    {
    	//LPSTR szTitle = "";
    
    	//LoadString( hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    
    	CMainDialog* mainDlg = new CMainDialog();//CMainDialog is a subclass of CAxDialogImpl<>
    	//mainDlg->DoModal();
    	mainDlg->Create(NULL);//Ist das so moeglich: NULL als parent,
                                  //so dass der Desktop das parent Fenster ist, und den zweiten
                                  //Parameter weglassen (das client rect)?
    
    	//Sleep(10000);//Um zu sehen, ob der Dialog angezeigt wird, bevor der Programmfluss den
                           //Geltungsbereich verlässt.
    
    	CMyWindow* myWnd = new CMyWindow();
    
    	myWnd->Create( 0, CWindow::rcDefault, "Image Test",
    	WS_OVERLAPPEDWINDOW, WS_EX_CLIENTEDGE ); //Parent 0, d.h. desktop.
    
    	if( !myWnd ) {
    		return FALSE;
    	}
    
    	myWnd->CenterWindow();
    	myWnd->ShowWindow( nShowCmd );
    	myWnd->UpdateWindow();
    
    	//Sleep(5000);
    
    	return _AtlModule.WinMain(nShowCmd);
    
    }
    

Anmelden zum Antworten