Transparente Static
-
antri, mach mal folgendes:
SetWindowText(hStatic, TEXT("Huhu")); InvalidateRect(hWnd, NULL, TRUE); // hWnd ist das Handle vom Parentfenster
-
Wäre es nicht besser statt NULL das Rect des Statics zu nehmen (GetWindowRect)
-
Hmmh, vielen Dank für die vielen Tip's von Euch. Bin jetzt wieder dabei mich um das Problem zu kümmern. Ich habe nur das Problem, das das Fenster in einem eigenen Thread läuft, und die Function von SetWindowtext (mit InvalidateRect...) aufruft nicht in diesem Thread läuft. D.h. es wird teilweise schon wieder in die Static geschrieben, bevor es neu gezeichnet ist. Sieht irgendwie schei... aus. Hat jemand ne' Idee?
-
Ich bins nochmal, das Problem ist folgendes: GetWindowRect() liefert mir die Schirmkoordinaten der StaticBox, ich brauch aber die Koordinaten in Bezug auf mein Fenster, deshalb wird der falsche Bereich "invalidatet". Gibt es da eine Funktion (bei MFC ScreenToClient(&CRect))....?
-
Du könntest evtl. auch das Static hooken und in WM_PAINT für den entsprechenden Ausschnitt InvalidateRect an das Parent senden
-
Gibt es keine Funktion die die Koordinaten umwandelt?
-
Ja, die gibt es - und sie heißt (wie du schon sagtest
) ScreenToClient (für hWnd musst du natürlich das Parent nehmen, für das du InvalidateRect aufrufen willst)
Falls du WM_PAINT hookst kannst du statt GetWindowRect auch rcPaint aus der PAINTSTRUCT-Struktur von BeginPaint verwenden
-
O.K. ich hab mich da ein bisschen dusselig ausgefrückt, ich meinte eine Funktion die z,B. ein ganzes Rechteck umwandeln kann.
P.S.Was heist den eigentlich "WM_PAINT hookst"?
-
Du kannst ja z.B. einfach nur ermitteln, wie weit du das RECT verschieben musst, und das dann z.B. mit OffsetRect machen
WM_PAINT hooken war vielleicht etwas blöd ausgedrückt. Ich meinte, dass du das Static subclasst und dann WM_PAINT abfängst und mit GetWindowRect die Koordinaten ermittelst (Begin-/ EndPaint solltest du aber wohl besser doch noch nicht selber aufrufen, sondern der orginal-WndProc überlassen - CallWindowProc)
-
hier ist dein problem:
return (LRESULT)GetStockObject(NULL_BRUSH);//kein HBRUSH zurückgeben
du darfst hier keinen NULL_BRUSH zurückgeben, sondern einen brush in der farbe deines fensters. mit dem NULL_BRUSH kann man nichts "überpinseln" ...
-
Dann ist es aber ja nicht mehr transparent
-
es geht doch darum, das der hintergrund genauso aussieht, wie das hauptfenster selbst - oder habe ich da jetzt was falsch verstanden ???
-
Ich nehme mal an, dass er im Hauptfenster ein Bitmap als Hintergrund verwendet