PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : automatische farbänderung


Nikolai
19.08.2004, 16:16
mojn.
ich lasse in meiner callbackprocedur ein viereck zeichnen, welches mit einer farbe ausgemahlt wird, die man wärend dem programmablauf auswählen kann.
leider klappt das net so richtig.
ich habe als farbwerte zr,zg und zb als globale int werte.
diese werden von einer funktion geändert, danach müsste alles nur noch aktualisiert werden, damit das viereck ne neue farbe bekommt.
wie bring ich das fenster zum aktualisieren ohne das fenster verschieben zu müssen?
hier der code:
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);

SelectObject(hdc, CreateSolidBrush(RGB(zr,zg,zb)));

Rectangle(hdc,10,300,110,400);

EndPaint(hwnd, &ps);
return 0 ;

hatte es schon mit SendMessage(hwndmain,WM_PAINT,0,0) versucht aber das will irgentwie net so richtig.


gencha
19.08.2004, 16:46
schreib dir eine funktion die den inhalt neu zeichnet. mit dem ganzen kram der grade in deinem WM_PAINT teil hast. dann rufst du diese funktion einfach auf. und natürlich ersetzt du dann den teil in deinem wm_paint part mit der funktion.

Nikolai
19.08.2004, 16:52
WM_PAINT
zeichne();
des funzt net,
ich rufe die funktion in ner anderem callback auf *g*
also ich hab mein mainwindow und ein childwindow.
in dem childwindow geb ich die farbwerte ein und klicke dann auf ok.
wenn ich auf ok klicke soll sich dann die farbe des viereckes im mainwindow ändern.
das heißt mein child muß seinem parent sagen das es neu zeichnen soll.
da hilft mir auch das in eine funktion fassen nicht.

gencha
19.08.2004, 17:27
du kannst die funktion doch einfach aufrufen. dann wird der inhalt neu gezeichnet. von wo du die funktion aufrufst ist doch egal

butterkeks
19.08.2004, 18:02
Du kannst den Code auch so lassen, wie er oben ist und einfach InvalidateRect() auf deine Zeichenfläche aufrufen.

gencha
19.08.2004, 18:09
dann wird es doch neu gezeichnet, aber nicht mit der neuen farbe. oder?

Nikolai
19.08.2004, 18:10
nein das hat net gefunzt.
keine ahnung warum habe es mit updatewindow und invalidaterect versucht.
nix. jetzt lasse ich die WM_PAINT und habe es so gebastelt.
hdc = GetDC(hwndm);

SelectObject(hdc, CreateSolidBrush(RGB(zr,zg,zb)));

Rectangle(hdc,10,300,110,400);

ReleaseDC(hwndm, hdc);
ich sende keine nachricht mehr um neu zu zeichnen, ich mache es einfach.
hwndm ist ne globale HWND meines parentwindows.

butterkeks
19.08.2004, 20:55
gencha:
InvalidateRect() ist im Prinzip dasselbe, als hätte man ein anderes Fenster kurz über die Zeichenfläche gezogen, was wiederum dafür sorgt, dass WM_PAINT anspringt

Nikolai
19.08.2004, 23:50
ja ich weiß und ich hab bei alten programmen von mir geschaut. da funzt es.
aber irgentwie scheint es net zu gehen wenn ne callback wndproc von ner webcam das auf ihr parent anwendet.
naja is halt microdoof

gencha
20.08.2004, 14:05
ja, das dann das rect neu gezeichnet wird, ist mir schon klar. aber dann auch nur in der farbe n der es drauf gezeichnet wurde. wenn man die farbe ändern will, dann muss man es auch erst neu zeichnen. die farbige fläche ist ja kein objekt wo man mal kurz die farbe ändern kann. sobald es auf den context gezeichnet ist, ist es nur eine farbige fläche an der stelle.

farbe ändern heisst das rect komplett neu zeichnen.

oder bin ich jetz total fehlgeleitet?

butterkeks
20.08.2004, 16:01
gencha:
Wei gesagt, wird im Prinzip nur WM_PAINT erneut abgefeuert, und wenn sich VOR dem invalidateRect() der Farbwert geändert hat, wird Rectangle() den neuen Wert benutzen, um das Rect neu drüber zu zeichnen (ein Computer kann viel, aber zaubern können sie bis dato noch nicht... oder wie soll Rectangle() an den alten Farbwert kommen?)

gencha
20.08.2004, 16:11
humm da war wohl ein mittelschwerer denkfehler meinerseits im spiel. sorry für jegliche verwirrungen ;)

Felix Kaiser
20.08.2004, 23:18
Ums mal noch mit zu erwähnen, das mit CreateSolidBrush erzeugte Handle sollte auch unbedingt mit DeleteObject wieder freigegeben werden, da die Anwendung mit jedem Aufruf von WM_PAINT eine neue GDI Resource auffrisst, garnicht gut. :)