<?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[Skinning mit WinAPI]]></title><description><![CDATA[<p>Hi,</p>
<p>es geht darum, eine Anwendung mit der WinAPI möglichst stark zu skinnen, d.h. das Erscheinungsbild zu verändern. Nun sind Window Regions ja kein großes Problem (und gut kapselbar), ebenso einfache Hintergrundbilder für ein Fenster.</p>
<p>Das größere Problem sind hingegen die Steuerelemente, die ja auch geskinnt werden müssen (wie beispielsweise in Steam, nicht, dass ich den ****** benutzen würde, habs aber gesehen). Einerseits kann ich natürlich einfach die komplette Funktion der Steuerelemente selbst programmieren, dann läuft das Unterfangen aber auf das Umfangen einer Ingame-GUI heraus und dauert länger wie das restliche Programm, von den Bugs mal ganz zu schweigen. Andererseits bietet die WinAPI ja die Möglichkeit des Owner Draws, d.h. ich benutze weiterhin die Windows-Steuerelemente, zeichne aber selbst.</p>
<p>Hat jemand schon Erfahrung damit gemacht und wie kompliziert ist es denn, komplexe Steuerelemente (Listbox z.B.) selbst zu zeichnen. Ich muss ja erstmal den ganzen Zustand der LB abfragen (geöffnet, Markierung usw.) und dann das Erscheinungbild selbst aus Bitmaps zusammenblitten, oder?</p>
<p>ChrisM</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/96772/skinning-mit-winapi</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 08:59:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/96772.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Jan 2005 23:19:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Skinning mit WinAPI on Tue, 04 Jan 2005 23:19:43 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>es geht darum, eine Anwendung mit der WinAPI möglichst stark zu skinnen, d.h. das Erscheinungsbild zu verändern. Nun sind Window Regions ja kein großes Problem (und gut kapselbar), ebenso einfache Hintergrundbilder für ein Fenster.</p>
<p>Das größere Problem sind hingegen die Steuerelemente, die ja auch geskinnt werden müssen (wie beispielsweise in Steam, nicht, dass ich den ****** benutzen würde, habs aber gesehen). Einerseits kann ich natürlich einfach die komplette Funktion der Steuerelemente selbst programmieren, dann läuft das Unterfangen aber auf das Umfangen einer Ingame-GUI heraus und dauert länger wie das restliche Programm, von den Bugs mal ganz zu schweigen. Andererseits bietet die WinAPI ja die Möglichkeit des Owner Draws, d.h. ich benutze weiterhin die Windows-Steuerelemente, zeichne aber selbst.</p>
<p>Hat jemand schon Erfahrung damit gemacht und wie kompliziert ist es denn, komplexe Steuerelemente (Listbox z.B.) selbst zu zeichnen. Ich muss ja erstmal den ganzen Zustand der LB abfragen (geöffnet, Markierung usw.) und dann das Erscheinungbild selbst aus Bitmaps zusammenblitten, oder?</p>
<p>ChrisM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/687064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/687064</guid><dc:creator><![CDATA[ChrisM]]></dc:creator><pubDate>Tue, 04 Jan 2005 23:19:43 GMT</pubDate></item><item><title><![CDATA[Reply to Skinning mit WinAPI on Tue, 04 Jan 2005 23:40:49 GMT]]></title><description><![CDATA[<p>Überdenke 3 mal ernsthaft ob du wirklich Zeit mit einer aufgemotzten GUI verlieren willst, wo du doch ganz gute Software mit konventionellem Design gestalten kannst.<br />
Fast kein großer Softwarehersteller vermurkst sich seine Designs mit experimentellen GUIS und die werden wohl ihre Gründe haben, wenn Sie auf ausgefallene, außergewöhnliche Designs verzichten.<br />
Oder glaubst du die können das nicht?</p>
<p>Den Fehler habe ich auch schon mal gemacht als ich nen Server programmieren wollte.<br />
Habe Monate lang an ner 'Hammergeilen_SuperGUI' für das Konfigurationsfenster gesessen, die hinterher ehh keinem gefiel ausser mir selbst und den Server habe ich nie zustande gebracht, weil ich die Lust daran verloren hatte.</p>
<p>Die Fülle an Schriften und Bildern verführt zu stilistischer Perversion, zur Inflation der typographischen Elemente, zum überladenen Kitsch, zum Blenden mit Flitter und zur Verzierung simpelster Fakten mit billigem, fadenscheinigen Stanniol. So. Nun überleg dir was du tust,</p>
<p>MfG Tolga.</p>
<p>PS: ownerdrawn Steuerelemente können auch sehr shcön werden und der Aufwand ist in den meisten Fällen sogar vertretbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/687081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/687081</guid><dc:creator><![CDATA[Tolga]]></dc:creator><pubDate>Tue, 04 Jan 2005 23:40:49 GMT</pubDate></item><item><title><![CDATA[Reply to Skinning mit WinAPI on Wed, 05 Jan 2005 03:05:54 GMT]]></title><description><![CDATA[<blockquote>
<p>Den Fehler habe ich auch schon mal gemacht als ich nen <strong>Trojaner</strong>Server programmieren wollte.</p>
</blockquote>
<p><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/687142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/687142</guid><dc:creator><![CDATA[:-))))]]></dc:creator><pubDate>Wed, 05 Jan 2005 03:05:54 GMT</pubDate></item><item><title><![CDATA[Reply to Skinning mit WinAPI on Wed, 05 Jan 2005 10:49:18 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>falls du auf SubSeven anspielst, ja, dessen GUI ist wirklich nicht schlecht. Leider völlig überladen, ein kleines Rootkit reicht für meine &quot;Fernzugriffe&quot; vollkommen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Die Sache ist die, dass das Programm geskinnt werden muss, das ist nicht meine Entscheidung. Es muss also schon nach was aussehen und nicht das Windows-Einheitsgrau haben.</p>
<p>Obwohl ich euch natürlich darin zustimme, dass Funktionalität immer Vorrang vor Design haben muss.</p>
<p>EDIT: Wie funktioniert denn das mit Owner Draw jetzt genau? Kennt jemand ein gutes Tut? In der MSDN habe ich nichts Ausführliches dazu gefunden.</p>
<p>ChrisM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/687274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/687274</guid><dc:creator><![CDATA[ChrisM]]></dc:creator><pubDate>Wed, 05 Jan 2005 10:49:18 GMT</pubDate></item><item><title><![CDATA[Reply to Skinning mit WinAPI on Wed, 05 Jan 2005 12:53:37 GMT]]></title><description><![CDATA[<p>Wegen OwnerDraw:</p>
<p>Ich wollte mal einen Button mit OwnerDraw erstellen und darüber eine Bitmap legen....Man sieht zwar die Bitmap, aber zusätzlich noch einen typischen windows Button Schatten. ALso bringts OwnerDraw nicht.</p>
<p>PS: Korrigiert mich falls doch mit OwnerDraw ohne diesen Button Schatten/ Rahmen geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/687487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/687487</guid><dc:creator><![CDATA[der toni]]></dc:creator><pubDate>Wed, 05 Jan 2005 12:53:37 GMT</pubDate></item><item><title><![CDATA[Reply to Skinning mit WinAPI on Wed, 05 Jan 2005 16:06:39 GMT]]></title><description><![CDATA[<p>Die Sache mit dem Ownnerdrawn ist fur Anfänger schwer zu überblicken. Ich habe damals auch paar Std. rumgetippt bis es anfing mir zu gehorchen... Es gibt im Web sehr viele verschiedene Vorgehensweisen aber ich finde meine am besten und sehr flexibel auch noch ;-)...</p>
<p>SO GEHTS:</p>
<p>Zuerst erstellst du nen Button mit der Eigenschaft BS_OWNERDRAWN...</p>
<pre><code class="language-cpp">hButton= CreateWindow(TEXT(&quot;BUTTON&quot;),// Der Fensterklassen-Name 
                     TEXT(&quot;Caption...&quot;),// Der Text
                     WS_VISIBLE|WS_CHILD|BS_NOTIFY|BS_OWNERDRAW,// Der Fenster-Stil 
                     3, 43, 70, 24,// Die Fenster-Abmessungen 
                     hMain, //Mutterfenster
                     reinterpret_cast&lt;HMENU&gt;(id_send),// ID 
                     hInstance,// Die Programminstanz 
                     NULL);// Keine Extra-Daten
</code></pre>
<p>Wenn das Control als Ownerdrawn erstellt worden ist hat es die nutzliche Eigenschaft, bei vielen Events eine WM_DRAWITEM - message an das Mutterfenster zu senden. Diese mesage fängst du in der WNDPROC des Mutterfenster ab und übergibst den lparam-wert folgnderweise an DEINE Funktion, die den Button malt.</p>
<p>DEINE FUNKTION bestimmt nun das aussehen des Buttons, d.h. sie malt den Button komplett selbst.</p>
<pre><code class="language-cpp">case WM_DRAWITEM: 
                  DrawButton(reinterpret_cast&lt;DRAWITEMSTRUCT*&gt;(lParam));
                  return 0;
</code></pre>
<p>SO ungefähr sollte diese DrawButton - Funktion aussehen...</p>
<pre><code class="language-cpp">bool DrawButton(DRAWITEMSTRUCT* pdis)
{
bool db = (pdis-&gt;itemState &amp; ODS_DEFAULT); //Wenn Normalzustand des Buttons..
bool sb = (pdis-&gt;itemState &amp; ODS_SELECTED); //Wenn Button gedrückt wird
bool fb = (pdis-&gt;itemState &amp; ODS_FOCUS);//Wenn Button den Fokus hat
bool disabled = (pdis-&gt;itemState &amp; ODS_DISABLED); //Wenn Button disabled ist
//Das System meldet dir automatisch wann du welchen Zustand malen musst.. Geil //was??

RECT r = pdis-&gt;rcItem; // in der Struktur r werden Koordinaten und Maßen des //controls gespeichert..
HBRUSH oldbc;
HDC hdc = pdis-&gt;hDC;
HPEN pen, oldpen;
HFONT oldfh, fh;

if(!disabled)
	oldbc = reinterpret_cast&lt;HBRUSH&gt;(SelectObject(hdc, hb.handle()));//
else
	oldbc = reinterpret_cast&lt;HBRUSH&gt;(SelectObject(hdc, zb.handle()));//

pen = CreatePen(PS_SOLID,2+db,RGB(GetRValue(AppColors),GetGValue(AppColors),GetBValue(AppColors)));	
oldpen = reinterpret_cast&lt;HPEN&gt;(SelectObject(hdc, pen));
TCHAR* fontname = new TCHAR[35];
lstrcpy(fontname, TEXT(&quot;Verdana&quot;));
if (sb)
lstrcpy(fontname, TEXT(&quot;Arial&quot;));
Font ff(fontname,8); // &lt;&lt;-- FONT
fh = ff.handle();
delete[] fontname;
oldfh = reinterpret_cast&lt;HFONT&gt;(SelectObject(hdc, fh));

PAINTSTRUCT ps;
ps.fErase = false;
ps.rcPaint = r;
ps.hdc = hdc;

BeginPaint(hMain, &amp;ps);

//---------------------------------------------------------
Rectangle(hdc,r.left+sb,r.top+sb,(r.right)+sb,(r.bottom)+sb);
//---------------------------------------------------------

SetTextColor(hdc,RGB(200+(15*sb)-10*disabled,200+(15*sb)-10*disabled,220+(15*sb)-10*disabled)); // &lt;&lt;-- TEXTCOLOR
SetBkMode(hdc,TRANSPARENT);
TCHAR text[255];
GetWindowText( pdis-&gt;hwndItem, text, sizeof(text) );
r.top+=sb;
r.left+=sb;
r.bottom+=sb;
r.right+=sb;
DrawText(hdc, text, lstrlen(text), &amp;r, DT_CENTER|DT_VCENTER|DT_SINGLELINE);

EndPaint(hMain, &amp;ps);

//Clean'in up..
SelectObject(hdc, oldfh);
SelectObject(hdc, oldbc);
SelectObject(hdc, oldpen);

DeleteObject(oldbc);
DeleteObject(oldfh);
DeleteObject(fh);
DeleteObject(oldpen);
DeleteObject(pen);

ReleaseDC(pdis-&gt;hwndItem, hdc);
return true;
}
</code></pre>
<p>So einfach ist das. natürlich musst du an manchen Stellen variablennamen und ähnliches ändern ist ja klar. Aber das Prinzipt ist das.</p>
<p>Viel Spaß und viel Erfolg.</p>
<p>Mfg: Tolga</p>
]]></description><link>https://www.c-plusplus.net/forum/post/687727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/687727</guid><dc:creator><![CDATA[Tolga]]></dc:creator><pubDate>Wed, 05 Jan 2005 16:06:39 GMT</pubDate></item><item><title><![CDATA[Reply to Skinning mit WinAPI on Wed, 05 Jan 2005 16:41:52 GMT]]></title><description><![CDATA[<p>In der FAQ ist ein Beispiel.</p>
<p>Außerdem in der MSDN/Google mal nach Custom Draw suchen. Das ist für die Common Controls.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/687772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/687772</guid><dc:creator><![CDATA[anti-skin]]></dc:creator><pubDate>Wed, 05 Jan 2005 16:41:52 GMT</pubDate></item><item><title><![CDATA[Reply to Skinning mit WinAPI on Wed, 05 Jan 2005 22:18:43 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>dankeschön! Dein Codesnippet hat mir wirklich weitergeholfen!</p>
<p>ChrisM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/688193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/688193</guid><dc:creator><![CDATA[ChrisM]]></dc:creator><pubDate>Wed, 05 Jan 2005 22:18:43 GMT</pubDate></item></channel></rss>