Callback ist installiert... allerdings stellt sich jetzt das nächste Problem.
Callback sieht so aus:
Code: Alles auswählen
Procedure Preview_WinCallback(hWnd, uMsg, wParam, lParam)
; +-----------------------------------------------------------------
; |Description : CallbackProzedure des Preview-Fensters
; |Arguments : hWnd - Fensterhandle
; | : uMsg - Messagekonstante
; | : wParam - w-Parameter
; | : lParam - l-Parameter
; |Results : -
; +-----------------------------------------------------------------
Select uMsg
Case #WM_PAINT
Preview_RedrawImages()
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Das Programm zeichnet auch prima die Images neu, während ich das Fenster über die Desktopgrenzen hinaus bewege.
Allerdings habe ich auch eine Funktion, die das Fenster und die Images darin in der Größe anpasst.
Wenn ich also doppelt so große Images in einem entsprechend großen Fenster anzeige und danach das Fenster und die Images verkleinere, dann habe ich folgenden Effekt:
Der Hintergrund des Fensters wird nicht restauriert. Evtl. liegt das daran, daß ich eine eigene #WM_PAINT Routine im CallBack habe. Aber eigentlich kann es das auch nicht sein, weil die Rahmen des Fensters auch dann von Windows restauriert werden, wenn ich mit einem anderen Fenster drübergehe. Und zu diesem Zeitpunkt existiert der Callback noch.
Ich habe schon rumprobiert mit InvalidateRect_() oder RedrawWindow_(), aber das half alles nix, weil entweder das Fenster komplett grau bleib (die Images übermalt wurden) oder aber beim Moven alles wie blöd flackerte, weil "Images malen, Alles löschen, Images malen" ausgeführt wurde. Irgendwie bekomme ich Windows nicht dazu erst zu löschen und dann in meinen CallBack zu springen... Aber das scheint mir auch unlogisch, weils der Logik des CallBacks wiedersprechen würde.
Vermutlich muß ich den Fensterhintergrund doch selbst löschen, bevor ich die Images neu draufzeichne.
Und da kommen wir zum nächsten Problem. Ich kann per PB nicht die Hintergrundfarbe eines Fensters auslesen, wenn ich sie nicht vorher explizit gesetzt habe.
Farbe = GetWindowColor(#Window)
Beschreibung
Gibt die Hintergrundfarbe des angegebenen Fensters '#Window' zurück, welche zuvor mittels SetWindowColor() festgelegt wurde.
Wenn noch keine Hintergrundfarbe festgelegt wurde, dann wird -1 zurückgegeben
Wo in etwa muß ich in der API graben, um an die Hintergrundfarbe meines Fensters zu kommen, damit ich es mit Box() löschen kann bevor ich die Images draufzeichne?
Edit:
Sodele, ich bin jetzt auf GetSysColor_() gestossen mit dem Parameter #COLOR_WINDOW, der angeblich die Hintergrundfarbe des im Device Context befindlichen Fensters zurückgibt. Stimmt zwar nicht, denn es kommt weiß zurück statt grau, was im Fenster dargestellt ist, aber egal. Nehme ich halt #COLOR_MENU, was angeblich die Hintergrundfarbe des Menüs des Fensters darstellen soll. Jedenfalls stimmt das mit der tatsächlichen Farbe überein, die das Fenster zuvor hatte. (Daß mich diese Methode nicht wirklich zufriedenstellt, ist nachvollziehbar, oder?

).
Jedenfalls bügle ich die restlichen Flächen zwischen den Images nun mit entsprechenden Box() Befehlen bei der Bearbeitung der #WM_PAINT Message mit über.
Ich habe das hier mal mit verschiedenen Farben deutlich gemacht:
Code: Alles auswählen
StartDrawing(WindowOutput(#Window_Preview))
Box(0, 0, 30 + (ImageSettings_Original\dsBitmap\bmWidth / ProgramSettings\lScaleFactor) * 2, 10, $aa00cc)
Box(0, 10 + ImageSettings_Original\dsBitmap\bmHeight / ProgramSettings\lScaleFactor, 30 + (ImageSettings_Original\dsBitmap\bmWidth / ProgramSettings\lScaleFactor) * 2, 10, $ff44ff)
Box(0, 10, 10, ImageSettings_Original\dsBitmap\bmHeight / ProgramSettings\lScaleFactor, $ff0000)
Box(10 + ImageSettings_Original\dsBitmap\bmWidth / ProgramSettings\lScaleFactor, 10, 10, ImageSettings_Original\dsBitmap\bmHeight / ProgramSettings\lScaleFactor, $00ff00)
Box(20 + (ImageSettings_Original\dsBitmap\bmWidth / ProgramSettings\lScaleFactor) * 2, 10, 10, ImageSettings_Original\dsBitmap\bmHeight / ProgramSettings\lScaleFactor, $000ff)
DrawImage(ImageID(#ImageID_Original), 10, 10, ImageSettings_Original\dsBitmap\bmWidth / ProgramSettings\lScaleFactor, ImageSettings_Original\dsBitmap\bmHeight / ProgramSettings\lScaleFactor)
DrawImage(ImageID(#ImageID_Encrypted), 20 + (ImageSettings_Original\dsBitmap\bmWidth / ProgramSettings\lScaleFactor), 10, ImageSettings_Encrypted\dsBitmap\bmWidth / ProgramSettings\lScaleFactor, ImageSettings_Encrypted\dsBitmap\bmHeight / ProgramSettings\lScaleFactor)
StopDrawing()
Trotzdem glaube ich nicht, daß das der richtige Weg ist. Weiß jemand aus der C-Welt, wie es das Betriebssystem macht? Da wird doch mit Brushes hantiert, wenn der Fensterhintergrund neugezeichnet wird oder?
Noch besser wäre ja, wenn ich innerhalb der #WM_PAINT Bearbeitung (im Callback) die Windowseigene WM_PAINT Routine dieses Fensters aufrufen könnte, denn die kann den Fensterhintergrund "richtig" neuzeichnen.