Fenster Hintergrund ändern?
-
Hey Leute!
Ich bins wieder Mal, dem aufmerksamen Foren-Schreiber wird vielleicht auffallen dass ich in letzter Zeit viele Fragen stelle, aber ich möchte erstmal WinApi etwas besser beherrschen lernen.
Also meine Frage diesmal, wie kann ich auf Knopfdruck den Hintergrund meines Fensters (.bmp) ändern?
Der treffende Code:
windowclass.hbrBackground = CreatePatternBrush((HBITMAP)LoadImage(hInst, (x), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE));
X ist bei mir Momentan eine Variable (LPCWSTR), die von der WinMain Funktion übergeben wird, da ich mein Fenster in einer Eigenen Funktion zeichne.
Wie kann ich jetzt den Hintergrund auf Knopfdruck ändern?
Sorry wenn das eine blöde Frage ist, aber ich komm einfach nicht dahinter.Zweite etwas kleinere Frage:
Wie kann ich Labels färben bzw auch ihre Farbe auf Knopfdruck ändern?
MFG
FERNman
-
Weiß das keiner? Ich wüsste es wirklich gerne da man das oft braucht...
MFG
FERNman
-
Äh - indem du WM_PAINT bearbeitest und dort dann den Hintergrund mit dem gewünschten Brush zeichnen lässt...?
-
Ok danke, aber ich bin noch ein kompletter Noob, wie lade ich mir WM_PAINT ein Bild?
MFG
FERNman
-
Naja, die WM_PAINT bekommt dein Programm, wenn das Fenster ganz oder teilweise neugezeichnet werden muss. Normalerweise reagierst du mit dem Aufruf von BeginPaint() und EndPaint(), und dazwischen setzt du deinen Brush mit dem Bitmap in den DC ein (SelectObject()) und zeichnest es (PatBlt()).
Und auf deinen Knopfdruck reagierst du halt, indem du dein Bitmap als Brush bereitstellst und über InvalidateRect() das Neuzeichnen erzwingst.
-
Also, danke für deine Antwort. Aber ich komme nicht weiter mit Google / MSDN...
Ich habe jetzt ein bisschen eben gestöbert und das gefunden:
typedef struct tagPAINTSTRUCT { HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32]; } PAINTSTRUCT, *PPAINTSTRUCT;
Und in der WindowProc:
case WM_PAINT: { BeginPaint(hWnd, PPAINTSTRUCT); HGDIOBJ SelectObject( HDC hdc, LoadImage(hInst, x); BOOL PatBlt( HDC hdc, int nXLeft, int nYLeft, GetSystemMetrics(SM_CYSCREEN), GetSystemMetrics(SM_CYSCREEN, DWORD dwRop ); EndPaint(hWnd, *PPAINTSTRUCT); }
Aber das ist alles falsch, und wie mache ich das nun richtig?
MFG und vielen vielen Dank für deine Hilfe
FERNman
-
FERNman schrieb:
Und in der WindowProc:
Du kennst schon so ein bisschen die Syntax von C/C++? Wenn nicht, hol dir erstmal ein gutes Einsteigerbuch und vergiss die WinApi.
-
??
-
Ich glaube nicht, dass du wirklich intensiv gesucht hast oder überhaupt die Grundlagen der Sprache verstehst.
Wahrscheinlich kannst du auch besser suchen, wenn du weißt, wonach genau, also empfehle ich dir hier erstmal: lern die Sprache erstmal richtig, bevor du mit komplizierteren APIs arbeitest.
-
-
Das Programm hinter dem Link kommt mir i-wie bekannt vor. Vielleicht von Petzold?
-
So, ich habs hinbekommen
Zwar schon vor ein paar Tagen, aber erst heute habe ich mal wieder die Zeit gefunden ins Forum zu sehen und etwas zu schreiben...Also, vielleicht hilft es irgendwann irgendwem:
case WM_PAINT: { hdc = BeginPaint(hWnd1, &ps); bmpExercising = (HBITMAP)LoadImage(NULL, Background, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); // Create a memory device compatible with the above DC variable MemDCExercising = CreateCompatibleDC(hdc); // Select the new bitmap SelectObject(MemDCExercising, bmpExercising); // Copy the bits from the memory DC into the current dc BitBlt(hdc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), MemDCExercising, 0, 0, SRCCOPY); // Restore the old bitmap DeleteDC(MemDCExercising); DeleteObject(bmpExercising); RedrawWindow(hWnd1, NULL, NULL, RDW_ERASENOW | RDW_ALLCHILDREN | RDW_INVALIDATE); DeleteObject(hWnd1); EndPaint(hWnd1, &ps); }break;
Und jedes mal, wenn man den Hintergrund ändern möchte, einfach Background = "" und RedrawWindow()...
MFG und Danke an alle
FERNman