<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Ein CAxDialogImpl und ein CWindowImpl zusammen in einem CAtlExeModuleT anzeigen.]]></title><description><![CDATA[<p>Liebe ATL Coder,</p>
<p>Ich habe eine Frage, die für erfahrene ATL Programmierer wahrschein-<br />
lich leicht zu beantworten ist, aber für Anfänger schwierig ist.<br />
Ich habe ein CAtlExeModuleT (s. Code unten) und möchte ein Beispiel<br />
anpassen, welches ich übernommen habe und welches auch läuft. Der<br />
Ausgangspunkt war ein CAxDialogImpl Objekt in der PreMessageLoop des<br />
CAtlExeModuleT. Ich wollte den Dialog non-modal machen um ein zusätz-<br />
liches CWindowImpl Fenster anzeigen zu können (soll später Fullscreen<br />
sein können, um jpegs anzuzeigen - der Dialog soll also dann nicht<br />
vor dem Fenster sein!).<br />
Meine Frage ist also, ob es möglich ist, ein CAxDialogImpl UND ein<br />
CWindowImpl Objekt zu erzeugen, welche beide den Desktop als Elter<br />
(parent) haben (indem man NULL als ersten Parameter in dem Create()-<br />
Aufruf angibt)? Oder müssen sie irgendwie über eine Elter-Kind-Bezieh-<br />
ung verknüpft sein (wie ist das unter Windows eigentlich)? Als ich<br />
das Programm (s. unten) ausführte, lief es zunächst nur kurz, ohne<br />
etwas anzuzeigen. Ich habe dann ein Sleep(5000) nach dem Erzeugen des<br />
Fensters eingefügt und dann war es für diese Zeit sichtbar. D.h. es<br />
muß mit dem Geltungsbereich zusammenhängen. Der Dialog jedoch wurde<br />
nicht angezeigt. Wie kann ich also beide zugleich anzeigen, das Fens-<br />
ter und den Dialog? Muß ich sie beide in PreMessageLoop erzeugen<br />
(habe ich ausprobiert, der Effekt war jedoch der gleiche; brauche ich<br />
PreMessageLoop)? Ich würde eine Lösung mit _tWindMain aber ohne Pre-<br />
MessageLoop bevorzugen, falls das geht, je einfacher, desto besser!</p>
<p>Bitte helft, ich habe schon alles ausprobiert, zwei dicke ATL Bücher<br />
gewälzt, ins Netz geschaut, selber 'rumprobiert...<br />
Ich habe immer nur Beispiele mit dem älteren CCom Zeug gefunden, wo<br />
eine (while-) Hauptschleife in _tWinMain erzeugt wurde, worin Trans-<br />
lateMessage(&amp;msg) und DispatchMessage(&amp;msg) aufgerufen werden, aber<br />
kein Beispiel, wie das in meinem Fall zusammen mit der Funktion<br />
_AtlModule.WinMain(nShowCmd) zusammen funktioniert. Ich verwende<br />
Visual Studio 2005 und die Version der ATL, die dabei ist (wohl<br />
Version 8, vermute ich).</p>
<p>wäre super, wenn mir jemand helfen kann, denn ich bin schon echt<br />
verzweifelt, so schwer kann das doch nicht sein...</p>
<p>Vielen Dank schon einmal im Voraus und Viele Grüße,</p>
<p>Peter.</p>
<p>Hier kommt der Code:</p>
<pre><code>// Test.cpp : _tWinMain verwenden um ein CAxDialogImpl&lt;&gt; und ein CWindowImpl&lt;&gt; anzuzeigen.

#include &quot;stdafx.h&quot;
#include &quot;resource.h&quot;
#include &quot;mainDialog.h&quot;

class CMyWindow : public CWindowImpl&lt;CMyWindow&gt;
{
public:
   // Optionally specify name of the new Windows class
   DECLARE_WND_CLASS(&quot;MyName&quot;) 
              // 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&amp; bHandled)
   {
      // Do some painting code
      return 0;
   }
};

class CSampleModule : public CAtlExeModuleT&lt; CSampleModule &gt;
{
public :
	HRESULT PreMessageLoop(int nShowCmd)
	{
		HRESULT hr = CAtlExeModuleT&lt;SampleModule&gt;::PreMessageLoop(nShowCmd);
		if (FAILED(hr))
			return hr;

		return S_FALSE;
	}
};

CSampleModule _AtlModule;

//
extern &quot;C&quot; int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, 
                                LPTSTR /*lpCmdLine*/, int nShowCmd)
{
	//LPSTR szTitle = &quot;&quot;;

	//LoadString( hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

	CMainDialog* mainDlg = new CMainDialog();//CMainDialog is a subclass of CAxDialogImpl&lt;&gt;
	//mainDlg-&gt;DoModal();
	mainDlg-&gt;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-&gt;Create( 0, CWindow::rcDefault, &quot;Image Test&quot;,
	WS_OVERLAPPEDWINDOW, WS_EX_CLIENTEDGE ); //Parent 0, d.h. desktop.

	if( !myWnd ) {
		return FALSE;
	}

	myWnd-&gt;CenterWindow();
	myWnd-&gt;ShowWindow( nShowCmd );
	myWnd-&gt;UpdateWindow();

	//Sleep(5000);

	return _AtlModule.WinMain(nShowCmd);

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/191322/ein-caxdialogimpl-und-ein-cwindowimpl-zusammen-in-einem-catlexemodulet-anzeigen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 07:55:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/191322.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 01 Sep 2007 17:17:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ein CAxDialogImpl und ein CWindowImpl zusammen in einem CAtlExeModuleT anzeigen. on Sat, 01 Sep 2007 17:17:11 GMT]]></title><description><![CDATA[<p>Liebe ATL Coder,</p>
<p>Ich habe eine Frage, die für erfahrene ATL Programmierer wahrschein-<br />
lich leicht zu beantworten ist, aber für Anfänger schwierig ist.<br />
Ich habe ein CAtlExeModuleT (s. Code unten) und möchte ein Beispiel<br />
anpassen, welches ich übernommen habe und welches auch läuft. Der<br />
Ausgangspunkt war ein CAxDialogImpl Objekt in der PreMessageLoop des<br />
CAtlExeModuleT. Ich wollte den Dialog non-modal machen um ein zusätz-<br />
liches CWindowImpl Fenster anzeigen zu können (soll später Fullscreen<br />
sein können, um jpegs anzuzeigen - der Dialog soll also dann nicht<br />
vor dem Fenster sein!).<br />
Meine Frage ist also, ob es möglich ist, ein CAxDialogImpl UND ein<br />
CWindowImpl Objekt zu erzeugen, welche beide den Desktop als Elter<br />
(parent) haben (indem man NULL als ersten Parameter in dem Create()-<br />
Aufruf angibt)? Oder müssen sie irgendwie über eine Elter-Kind-Bezieh-<br />
ung verknüpft sein (wie ist das unter Windows eigentlich)? Als ich<br />
das Programm (s. unten) ausführte, lief es zunächst nur kurz, ohne<br />
etwas anzuzeigen. Ich habe dann ein Sleep(5000) nach dem Erzeugen des<br />
Fensters eingefügt und dann war es für diese Zeit sichtbar. D.h. es<br />
muß mit dem Geltungsbereich zusammenhängen. Der Dialog jedoch wurde<br />
nicht angezeigt. Wie kann ich also beide zugleich anzeigen, das Fens-<br />
ter und den Dialog? Muß ich sie beide in PreMessageLoop erzeugen<br />
(habe ich ausprobiert, der Effekt war jedoch der gleiche; brauche ich<br />
PreMessageLoop)? Ich würde eine Lösung mit _tWindMain aber ohne Pre-<br />
MessageLoop bevorzugen, falls das geht, je einfacher, desto besser!</p>
<p>Bitte helft, ich habe schon alles ausprobiert, zwei dicke ATL Bücher<br />
gewälzt, ins Netz geschaut, selber 'rumprobiert...<br />
Ich habe immer nur Beispiele mit dem älteren CCom Zeug gefunden, wo<br />
eine (while-) Hauptschleife in _tWinMain erzeugt wurde, worin Trans-<br />
lateMessage(&amp;msg) und DispatchMessage(&amp;msg) aufgerufen werden, aber<br />
kein Beispiel, wie das in meinem Fall zusammen mit der Funktion<br />
_AtlModule.WinMain(nShowCmd) zusammen funktioniert. Ich verwende<br />
Visual Studio 2005 und die Version der ATL, die dabei ist (wohl<br />
Version 8, vermute ich).</p>
<p>wäre super, wenn mir jemand helfen kann, denn ich bin schon echt<br />
verzweifelt, so schwer kann das doch nicht sein...</p>
<p>Vielen Dank schon einmal im Voraus und Viele Grüße,</p>
<p>Peter.</p>
<p>Hier kommt der Code:</p>
<pre><code>// Test.cpp : _tWinMain verwenden um ein CAxDialogImpl&lt;&gt; und ein CWindowImpl&lt;&gt; anzuzeigen.

#include &quot;stdafx.h&quot;
#include &quot;resource.h&quot;
#include &quot;mainDialog.h&quot;

class CMyWindow : public CWindowImpl&lt;CMyWindow&gt;
{
public:
   // Optionally specify name of the new Windows class
   DECLARE_WND_CLASS(&quot;MyName&quot;) 
              // 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&amp; bHandled)
   {
      // Do some painting code
      return 0;
   }
};

class CSampleModule : public CAtlExeModuleT&lt; CSampleModule &gt;
{
public :
	HRESULT PreMessageLoop(int nShowCmd)
	{
		HRESULT hr = CAtlExeModuleT&lt;SampleModule&gt;::PreMessageLoop(nShowCmd);
		if (FAILED(hr))
			return hr;

		return S_FALSE;
	}
};

CSampleModule _AtlModule;

//
extern &quot;C&quot; int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, 
                                LPTSTR /*lpCmdLine*/, int nShowCmd)
{
	//LPSTR szTitle = &quot;&quot;;

	//LoadString( hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

	CMainDialog* mainDlg = new CMainDialog();//CMainDialog is a subclass of CAxDialogImpl&lt;&gt;
	//mainDlg-&gt;DoModal();
	mainDlg-&gt;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-&gt;Create( 0, CWindow::rcDefault, &quot;Image Test&quot;,
	WS_OVERLAPPEDWINDOW, WS_EX_CLIENTEDGE ); //Parent 0, d.h. desktop.

	if( !myWnd ) {
		return FALSE;
	}

	myWnd-&gt;CenterWindow();
	myWnd-&gt;ShowWindow( nShowCmd );
	myWnd-&gt;UpdateWindow();

	//Sleep(5000);

	return _AtlModule.WinMain(nShowCmd);

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1356925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356925</guid><dc:creator><![CDATA[d_496]]></dc:creator><pubDate>Sat, 01 Sep 2007 17:17:11 GMT</pubDate></item></channel></rss>