ein zwei mehr oder weniger dummer Fragen (winproc, gui)
-
Hi
hab mal ein paar grundlegende Fragen:
1. Wenn man mehr als ein Fenster erzeugt, je eine Wndclass: Ist es besser eine einzige Wndproc zu verwenden und in dieser mit switch(hwnd) die Nachrichten auf die Fenster zu verteilen, oder nimmt man besser je Fenster eine Eigene Wndproc. Oder is das völlig egal?
2. Das Gui regt mich etwas auf:
Ich hab folgendes Problem:
Beispielprogramm z.B:
Man erzeugt ein Fenster, wie üblich, und will z.B im Fenster etwas zeichen, was sich aber ständig verändert, z.b ein einfaches Rechteck dessen Breite immer auf die aktuelle X position der Maus gesetzt wird:
...
case WM_MOUSE_MOVE:
{
Rechteckbreite = LOWORD(lParam);
InvalidateRect(hwnd,0,1);
return 0:
}...
den rest kann man sich ja vorstellen.
Das Problem bei solchen Sachen ist dann, dass immer wenn man mit der Maus über das Fenster fährt, sich zwar schön brav das Rechteck anpasst, aber die ganze Graphik Ausgabe flackert wie sau.
Meine Frage:
Kann so was irgendwie 'Sauber' anzeigen lassen? Also bringt man das Gui dazu, sowas wie doppelbuffering zu verwenden oder so was ähnliches?In Fenstern wo ich nur Grapihkausgabe benötige, ist das alles ja kein Problem, weil ich da ganz einfach auf OpenGL zurückgreif.
Aber in einem Fenster in den ich ein, zwei dauernd veränderliche Grapihkanzeigen habe (z.B Pegelanzeigen etc.) habe und ich aber auch noch buttons und sonstige Gui Grafik elemente haben will, weiß ich nicht wie ich das machen soll!
Vielen Dank
Flow
-
1. Wenn du meinst switch(hwnd) zu brauchen, solltest du besser zwei WndProcs verwenden. Das ist sauberer.
2. In der FAQ gibts einen Beitrag zu Double Buffering.
-
cd9000 schrieb:
2. In der FAQ gibts einen Beitrag zu Double Buffering.
Ähm, also normal stell ich mich nicht so dumm an, aber wo ist der bitte? im Winapi hab ich nix gefunden und zu der Grafik,Spieleprogrammierung gehts dann immer nur D3d oder ogl.
Aber ich suche ja keine beschleunigte Grafik ausgabe, sondern nur eine auf gui-basis die nicht 'flackert', wenn das irgendwie geht?Vielen Dank
Grüße
-
Seltsam. Ich dachte dazu hätten wir schon längst einen FAQ-Beitrag. Aber ich kann auch grad keinen finden.
Naja, im WinAPI-Forum gibts ein paar Beiträge zu dem Thema:
Brauche Hilfe beim Double Buffering
Flakern beim Zeichnen mit der GDI
Suchfunktion
-
http://www.klangwerker.de/php/show.php?path=developer/german&doc=g_double_buf1&update=1
http://c-plusplus.net/forum/viewtopic.php?t=14713
http://c-plusplus.net/forum/viewtopic.php?t=48890
-
Vielen Dank.
Die Links sind echt brauchbar.
Gruß
-
cd9000 schrieb:
1. Wenn du meinst switch(hwnd) zu brauchen, solltest du besser zwei WndProcs verwenden. Das ist sauberer.
2. In der FAQ gibts einen Beitrag zu Double Buffering.
switch (hWnd) funktioniert so oder so nicht, denn Handles sind ja keine Konstanten
-
Shlo schrieb:
cd9000 schrieb:
1. Wenn du meinst switch(hwnd) zu brauchen, solltest du besser zwei WndProcs verwenden. Das ist sauberer.
2. In der FAQ gibts einen Beitrag zu Double Buffering.
switch (hWnd) funktioniert so oder so nicht, denn Handles sind ja keine Konstanten
Hä?? Klar funzt des. Hwnd sind für jedes Fenster eindeutig. bei CreateWindow bekomm den Wert als Rückgabewert; Speichert man in ne Globale und dann kann ich in der Winproc, die einzelnen Fenster unterscheiden.
-
Flow_cplus schrieb:
Shlo schrieb:
switch (hWnd) funktioniert so oder so nicht, denn Handles sind ja keine Konstanten
Hä?? Klar funzt des. Hwnd sind für jedes Fenster eindeutig. bei CreateWindow bekomm den Wert als Rückgabewert; Speichert man in ne Globale und dann kann ich in der Winproc, die einzelnen Fenster unterscheiden.
Bei einem switch müssen aber die einzelnen Werte der case Marken schon zu Compile-Zeit bekannt sein - deswegen funktioniert das hier nicht. Du kannst aber z.B. die ID des Fensters ermitteln, und mit dieser in die switch gehen (da die ID zur Compile-Zeit schon bekannt ist).
Du kannst natürlich auch ein if nehmen, da geht das dann direkt mit dem Fenster-Handle
-
Flow_cplus schrieb:
Hä?? Klar funzt des. Hwnd sind für jedes Fenster eindeutig. bei CreateWindow bekomm den Wert als Rückgabewert; Speichert man in ne Globale und dann kann ich in der Winproc, die einzelnen Fenster unterscheiden.
sowie ich sehe dir ist nicht mal der Unterschied zwischen Variablen und Konstanten bekannt - ein Beweis warum man erst die Sprache und dann irgendwelche Frameworks lernen sollte
:p