hi,
wann soll denn das Bild "spiegeln" passieren ?
ich "denke" nach dem laden des Original, was dann gespiegelt werden soll ( warum nicht gleich im Original ? )
die 2 x Fenster Handle benötige ich ja für die API Function
PlgBlt() wobei es "sichtbar" sein soll.
ob die Fenster "sichtbar" sein müssen ...
---
ich "lese" den "Inhalt" eines Fenster und übertrage es in den "Inhalt" eines anderen Fenster.
ich bin mir relative sicher das ich den "Inhalt" des 2nd Fenster "abspeichern" kann zur weiteren Verarbeitung.
---
in dem Rotate Demo habe das Handle (o:
GetHwnd() ) der Static für die API Function
GetWindowDC() genommen um einen "DC" zu bekommen.
bei ein "DC" (Device Context) "hängt" aber was dran. man kann aber auch eine "MemoryDC" kreieren.
Code: Alles auswählen
FUNCTION CreateMemoryDC( hDC, nXSize, nYSize )
LOCAL hMemoryDC, hBMP
hMemoryDC := CreateCompatibleDC(hDC) // create compatible memory DC
hBMP := CreateCompatibleBitmap(hDC,nXSize,nYSize) // create DDB
SelectObject(hMemoryDC,hBMP) // put hBMP into memory DC
BitBlt( hMemoryDC,0,0,nXSize,nYSize,hDC,0,0,SRCCOPY ) // copy desktop DC into memory DC
RETURN hMemoryDC
das geht natürlich jetzt tiefer in die Bitmap Manipulation.
wer sich mehr mit der Materie beschäfigen will sollte sich FreeImage.DLL ansehen
für die Pablo einen Xbase++ Wrapper (imagefree.rar) mit ot4xb geschrieben hat.
dein
Code: Alles auswählen
oDialog:DrawingArea:Paint := { | aRect , uNIL , oDrawingArea | GsPViewerPaint( aRect , oDrawingArea ) }
sorgt ja dafür das änderungen durch die Function GsPViewerPaint() "behandelt" werden.
Code: Alles auswählen
oPS1 := oDrawingArea:LockPS()
oBitmap:Draw( oPS1 , aDestSize , , , GRA_BLT_BBO_IGNORE )
das sollte in deiner Function
stehen um dort das aktuelle oBitmap zu "malen"
du kannst jederzeit ein neues Bitmap "setzen" mit
und um die Änderrung "sichtbar" zu machen folgt ein
damit wird dann der o:
Paint Codeblock Slot ausgelöst welcher dann das "malen" übernimmt.