<?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[WinAPI mit C++]]></title><description><![CDATA[<p>Hi<br />
ich bin gerade dabei den Petzold zu lesen. Da das Buch aber schon etwas in die Jahre gekommen ist und die Quellcodes alle in C geschrieben sind, frag ich mich, wie man das ganze mit C++ sprich Templates, Polymorphie etc. benutzen kann.<br />
Kennt ihr ein paar gute Tutorials oder Bücher, in denen dies beschrieben wird sprich Kapselung der WinAPI etc.?<br />
Danke im voraus...<br />
[Edit] Was haltet ihr davon: <a href="http://www.relisoft.com/book/win/2control.html" rel="nofollow">http://www.relisoft.com/book/win/2control.html</a>? [/Edit]</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/153163/winapi-mit-c</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 23:46:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/153163.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Jul 2006 13:47:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to WinAPI mit C++ on Thu, 13 Jul 2006 13:56:47 GMT]]></title><description><![CDATA[<p>Hi<br />
ich bin gerade dabei den Petzold zu lesen. Da das Buch aber schon etwas in die Jahre gekommen ist und die Quellcodes alle in C geschrieben sind, frag ich mich, wie man das ganze mit C++ sprich Templates, Polymorphie etc. benutzen kann.<br />
Kennt ihr ein paar gute Tutorials oder Bücher, in denen dies beschrieben wird sprich Kapselung der WinAPI etc.?<br />
Danke im voraus...<br />
[Edit] Was haltet ihr davon: <a href="http://www.relisoft.com/book/win/2control.html" rel="nofollow">http://www.relisoft.com/book/win/2control.html</a>? [/Edit]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1097149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1097149</guid><dc:creator><![CDATA[Amateur]]></dc:creator><pubDate>Thu, 13 Jul 2006 13:56:47 GMT</pubDate></item><item><title><![CDATA[Reply to WinAPI mit C++ on Thu, 13 Jul 2006 14:19:18 GMT]]></title><description><![CDATA[<p>Es gibt dafür Bibliotheken die die C-API von Windows in C++ kapseln. Z.B. SmartWin++ ist schon das was du suchst.<br />
<a href="http://smartwin.sf.net" rel="nofollow">http://smartwin.sf.net</a></p>
<p>Die MFC hat es schon Jahre gemacht, ist aber auch in die Jahre gekommen und nicht mehr wirklich schön. Wenn du Win32-Programmierung in modernem C++ machen willst, finde ich pers. SmartWin++ ein gutes Beispiel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1097157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1097157</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 13 Jul 2006 14:19:18 GMT</pubDate></item><item><title><![CDATA[Reply to WinAPI mit C++ on Thu, 13 Jul 2006 14:55:45 GMT]]></title><description><![CDATA[<p>Wollte mir schon länger mal winstl von stlsoft nächer ansehen, bin bisher aber nicht dazu gekommen:</p>
<p><a href="http://synesis.com.au/software/winstl/" rel="nofollow">http://synesis.com.au/software/winstl/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1097201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1097201</guid><dc:creator><![CDATA[pZy]]></dc:creator><pubDate>Thu, 13 Jul 2006 14:55:45 GMT</pubDate></item><item><title><![CDATA[Reply to WinAPI mit C++ on Thu, 13 Jul 2006 17:56:54 GMT]]></title><description><![CDATA[<p>mhhh ok das sieht schon ma gut aus.<br />
Allerdings ist es schwer nur anhand von Sources das Prinzip hinter diesen Bibliotheken zu verstehen.<br />
Kennt ihr vielleicht Tutorials oder Bücher, die beschreiben, wie man die WinAPI (so wie bei diesen Bibliotheken) kapselt? Mich interessieren Dinge wie die WinMain als Hauptfunktion oder in einer Klasse, die WndProc in eine Klasse gekapselt etc. Eben das was diese Bibliotheken machen nur beschrieben wie man daran geht.<br />
Ok, man könnte die WinMain und die WndProc auch einfach so als Funktionen im Programm lassen und nur Informationen in Klassen speichern und so aber dann ist das ganze wieder kein wirkliches C++ und auch kein wirkliches C sondern eher so &quot;C+&quot;. Deshalb suche ich Buchempfehlungen und Tutorials, die eben WinAPI mit korrektem C++ verbinden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1097325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1097325</guid><dc:creator><![CDATA[Amateur]]></dc:creator><pubDate>Thu, 13 Jul 2006 17:56:54 GMT</pubDate></item><item><title><![CDATA[Reply to WinAPI mit C++ on Sun, 16 Jul 2006 18:29:29 GMT]]></title><description><![CDATA[<p>Ich würde es so machen zunächst muss man zwischen Echtzeit- und Ereignissgesteuerten Anwendungen unterscheiden. Echtzeit ist alles was z. B. 70 Mal in der Sekunde auf den Bildschirm ein komplexes 3D Model renden will - EventDriven sind diese Schlaftabletten Anwendungen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> - es passiert erst was wenn eine Eingabe vom Benutzer kommt -&gt; Benutzer drückt Schaltfläche -&gt; es wird das neue Gehalt berechnet -&gt; Benutzer Tippt Textein und drück Return -&gt; Datensatz wird in Datenbank übernommen<br />
Realzeitanwendungen erzeugen 100% CPU Auslastung, Ereignisgesteuerte Anwendungen verbrauchen nur Energie wenn man sie tritt...</p>
<blockquote>
<p>Event-driven programming:</p>
<p>The programmer writes small &quot;event handlers&quot; that respond to &quot;events.&quot; When an event occurs, the operating system calls the program's relevant event handler, it responds to the event, and control is returned to the operating system (which deals with the next event).</p>
</blockquote>
<pre><code class="language-cpp">class Application
		{
			public:
				virtual bool initialize();
				bool isActive();
				void setActive(bool isActive);
				virtual int run() = 0;
			private:
				bool m_isActive;
		};
</code></pre>
<pre><code class="language-cpp">class RunAlways : public Application
{
	public:
		RunAlways();

		int run();
		virtual bool loop();
	private:

};

RunAlways::RunAlways()
{
	setActive(true);
}

bool RunAlways::loop()
{
	Sleep(10);
	return true;
}

int RunAlways::run()
{
	MSG        msg; 

	if(!initialize())
		return -1;

	while(isActive())
	{
	if (PeekMessage(&amp;msg,NULL,0,0,PM_REMOVE))
	{
	  if (msg.message == WM_QUIT)
		setActive(false);
	  else
	  {
		TranslateMessage(&amp;msg);
		DispatchMessage(&amp;msg);
	  }
	}
	else
	 if(!loop())
	   break;
	}
	return int(msg.wParam);
}
</code></pre>
<p>Beispielprogramm:</p>
<pre><code class="language-cpp">int  WINAPI WinMain(HINSTANCE   hInstance,
                    HINSTANCE   hPrevInstance,
                    LPSTR       lpCmdLine,
                    int         nCmdShow)
{
	RunAlways App;
	return App.run();
}
</code></pre>
<p>Die Methode run Ruft zuerst die Methode initialze() auf. Liefert diese den Wert false so wird die Anwendung beendet, ansonsten wird in einer Endlosschleife geprüft, ob die Anwendung noch aktiv ist (also ob sie beendet werden soll oder nicht). In der Endlosschleife werden zunächst eventuell anfallende Windows-Nachrichten behandelt. Falls keine Windows-Nachrichten vorliegen wird die Methode loop Aufgerufen die in der Defaultimplementierung Sleep(50); aufruft, also den Thread für 50 Millisekunden schlafen legt, wenn keine Windowsnachrichten anliegen</p>
<p>Die Idee ist folgende: Schreib dir selber ne Klasse MyApplication die von RunAlways abgeleitet ist - überschreibe die Initialisierungsmethode mit eigenen Initialisierungen und überschreib wahlweiße die loop Methode mit irgendetwas das ständig z. B. ein neues Bild auf den Bildschirm malt</p>
<p>so ohne Fenster ist das alles noch recht langweilig.</p>
<pre><code class="language-cpp">/// Der Fenstermanager verwaltet alle Fenster und schickt nachrichten
/// an die ActionListener weiter
class WindowsManager
{
public:
	// Fuegt ein Fenster zum Window Manager hinzu.
	static bool  addWindow    (Window *windowPTR);

	// Entfernt ein Fenster aus dem WindowManager.
	static bool  removeWindow (Window *windowPTR);

	// Event Hanlder fuer alle Fenster.
	static LRESULT CALLBACK windowEventsProcessor(HWND   hWnd  , UINT   wMsg,
												  WPARAM wParam, LPARAM lParam);
private:
	WindowsManager(const WindowsManager&amp; src) {};
	WindowsManager&amp; operator=(const WindowsManager&amp; src) {return *this;}

	static vector&lt;Window*&gt;  windowsList;  // Liste aller Fenster
	static ActionEvent Event;			  // Event
	static MouseEvent  _MouseEvent;		  // MausEvent
};
</code></pre>
<p>Wie du siehst hat die Klasse nur statische Elemente und es sollte nur einen WindowManager geben (kann man einen Singleton drauß machen)<br />
Die Idee ist folgende: Der WindowManager merkt sich jedes Fenster. Wenn ein Fenster mit CreateWindow... erzeugt wird, dann muss das Fenster ja einen MessageHandler angeben. Als MessageHandler wird aber immer der gleiche verwendet - nämlich der aus der Klasse WindowManager::windowEventsProcessor:</p>
<pre><code class="language-cpp">Window::Window()
{
...
windowsClass.style            = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
windowsClass.lpfnWndProc      = (WNDPROC)WindowsManager::windowEventsProcessor;
...
WindowsManager::addWindow(this);
..
}
</code></pre>
<p>Außerdem meldest du das Fenster mit addWindow gleich beim Fenstermanager an (addWindow). Wenn jetzt ein Nachricht an eines der Fenster geschickt wird landet die in der Methode windowEventsProcessor. Diese erhält ja einen Handle des Fenster an die die Nachricht geht. Jetzt kannst du anhand der windowList per Window.getHandle raussuchen an welches Fenster die Nachricht eigentlich geht (hier wäre eigentlich eine Hashmap noch besser, da ja die Liste nur linear durchsucht werden kann, oder man macht ne SortedList die binär durchsucht werden kann oder Hashing... naja das ist dann dir überlassen - zum Anfang tut es eine Liste die du einfach durchiterierst und nach dem richten WindowHandle suchst)</p>
<p>zum Besseren Verständnis ein Überblick über die Window Klasse:</p>
<pre><code class="language-cpp">class Window 
{
public:
	/// Creates a new, initially invisible Window with the specified title.
	Window(const char* title);

	/// Adds a component (for example a button) to the window.
	void add(Component *component);

	/// Legt einen Nachrichtenempfaenger fuer das Fenster fest.
	void setActionListener(ActionListener *listener);

	/// Liefert den Handle des Fensters.
	HWND getHandle() const;

private:

	/// Der actionListner verweißt auf ein ActionListner Objekt, das die actionPerfomed implementiert
	ActionListener		*actionListener;

	// A window is a countainer for components like labels, textboxes or buttons.
	vector&lt;Component*&gt; ComponentContainer;

	friend class WindowsManager;
};
</code></pre>
<p>Nachdem du weißt an welches Fenster die Nachricht geht:</p>
<pre><code class="language-cpp">Window             *winPTR       = NULL;

// es muss gelten:
// hWnd == winPTR-&gt;getHandle()
// einfach uber vector windowList iterieren und gucken welches Fenster
// den handle hWnd hat an dieses dan einfach per InputEventListener Events schicken
for(unsigned int i = 0; i &lt; windowsList.size(); i++)
{
	if(hWnd == windowsList[i]-&gt;getHandle())
	{
		winPTR = windowsList[i];
		break;
	}
}
</code></pre>
<p>Kannst du die Nachricht an das Fenster schicken. Mit z. B.:</p>
<pre><code class="language-cpp">winPTR-&gt;EtwasIstPassiert();
</code></pre>
<p>Im Prinzip das Observer Pattern</p>
<p>da man im Regelfall mit etwsIstPassiert nicht zufrieden ist kann man sich neue Objekt überlegen, die Informationen über das konkrette Event speichern z. B.</p>
<pre><code class="language-cpp">class ActionEvent
		{
		public:
			// Aufzaehulung der verschiedenen Events
			enum Type {BUTTON_CLICKED, LEFT_MOUSE_BUTTON_DOWN};

		private:
			Type		m_Type;		// von welchem Typ ist das Event
			Component	*m_Source;	// Quelle des Events - Komponente, die Event ausgeloest hat

		public:
			/// liefert den Typ des Events
			Type getType();

			/// liefert die Quelle (Komponente), welche das Event verursacht hat
			Component* getEventSource();

			friend class WindowsManager;
		};
</code></pre>
<p>usw... keine zeit mehr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1098725</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1098725</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Sun, 16 Jul 2006 18:29:29 GMT</pubDate></item><item><title><![CDATA[Reply to WinAPI mit C++ on Sun, 16 Jul 2006 18:35:26 GMT]]></title><description><![CDATA[<p><a href="http://turing.fh-landshut.de/~jamann/IMB/IMB.html" rel="nofollow">http://turing.fh-landshut.de/~jamann/IMB/IMB.html</a><br />
<a href="http://turing.fh-landshut.de/~jamann/DrawPixel.pdf" rel="nofollow">http://turing.fh-landshut.de/~jamann/DrawPixel.pdf</a><br />
<a href="http://turing.fh-landshut.de/~jamann/IMB/winapivsoop.pdf" rel="nofollow">http://turing.fh-landshut.de/~jamann/IMB/winapivsoop.pdf</a></p>
<p>wollte eigentlich zu genau deiner Fragen schon mal ein Tutorial schreiben, aber mir fehlen da einfach dir Resourcen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1098733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1098733</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Sun, 16 Jul 2006 18:35:26 GMT</pubDate></item><item><title><![CDATA[Reply to WinAPI mit C++ on Sun, 16 Jul 2006 18:39:27 GMT]]></title><description><![CDATA[<p>Falls du XP Style willst:<br />
<a href="http://turing.fh-landshut.de/~jamann/XP%20Style.pdf" rel="nofollow">http://turing.fh-landshut.de/~jamann/XP Style.pdf</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1098737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1098737</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Sun, 16 Jul 2006 18:39:27 GMT</pubDate></item><item><title><![CDATA[Reply to WinAPI mit C++ on Mon, 17 Jul 2006 16:48:07 GMT]]></title><description><![CDATA[<p>hmmm das sieht doch gut aus...<br />
ich werds mir mal genau anschauen und durchlesen.<br />
wäre auf jedenfall was für die faq.<br />
und es wäre super wenn du nen richtiges tutorial dafür schreiben könntest. so wie dus schon gepostet hast nur noch weiter fortgeführt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1099312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1099312</guid><dc:creator><![CDATA[Amateur]]></dc:creator><pubDate>Mon, 17 Jul 2006 16:48:07 GMT</pubDate></item></channel></rss>