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); }