Hallo Leute,
vermutlich stehe ich vollkommen auf dem Schlauch, deswegen wäre es schön, wenn mir jemand einen Weg von dort weg zeigen könnte
.
Ich schreibe gerade an einer Idee rum, die mir gestern kam, als ich einen Weg suchte, Schrift/Text in ein Bild zu speichern und die Ergebnisse mit ImageMagick eher schlecht waren (mit Antialiasing verschwommen und ohne ziemlich pixelig). Das ist aber nebensächlich für das Problem.
Im Rahmen dessen benutzte ich heute erstmals die Funktionen GetDC und ReleaseDC und hatte aufgrund diverser Funde Schwierigkeiten, die Parameter richtig zu ordnen (mindestens ein Post in der
DP zeigt die Parameter von ReleaseDC vertauscht). Deshalb erinnerte ich mich an GetLastError und SysErrorMessage, die ich einbaute, aber das fördert nun Überraschendes zu Tage:
Delphi-Quellcode:
uses ..., pngimage;
TMainForm =
class
btnPreview: TButton;
Memo: TMemo;
imagePreview: TImage;
private
pic_image : TImage;
pic_png : TPngObject;
end;
procedure TMainForm.btnPreviewClick(Sender: TObject);
var DC: HDC;
gle: DWORD;
rdc: integer;
begin
rdc:= 0;
gle:= 0;
DC := GetDC(Memo.Handle);
MessageBox(Self.Handle, PChar(IntToStr(
DC)),
nil, MB_OK);
try
pic_image.Picture.Bitmap.Width:= Memo.Width;
pic_image.Picture.Bitmap.Height:= Memo.Height;
BitBlt(pic_image.Picture.Bitmap.Canvas.Handle,
0, 0,
pic_image.Picture.Bitmap.Width, pic_image.Picture.Bitmap.Height,
DC,
-1, -1,
SRCCOPY);
imagePreview.Picture.Bitmap.Assign(pic_image.Picture.Bitmap);
imagePreview.Update;
gle:= GetLastError;
MessageBox(Self.Handle, PChar(Format('
%d, %s (%d)', [rdc, SysErrorMessage(gle), gle])),
nil, MB_OK);
// --> gle ist hier noch 0
pic_png.Assign(pic_image.Picture.Bitmap);
gle:= GetLastError;
MessageBox(Self.Handle, PChar(Format('
%d, %s (%d)', [rdc, SysErrorMessage(gle), gle])),
nil, MB_OK);
// --> gle ist hier 8 (Für diesen Befehl ist nicht genügend Speicher verfügbar)
finally
rdc:= ReleaseDC(0,
DC);
gle:= GetLastError;
MessageBox(Self.Handle, PChar(Format('
%d, %s (%d)', [rdc, SysErrorMessage(gle), gle])),
nil, MB_OK);
// --> gle ist hier 5 (Zugriff verweigert)
end;
end;
In den Kommentaren sieht man, was ich nicht verstehe. OK, die 8 nach dem Assign soll mir erstmal egal sein. Aber die 5 verstehe ich überhaupt nicht, denn die gibt GetLastError auch zurück, wenn ich ReleaseDC auskommentiere oder mit einem anderen HWND (Memo.Handle) ausführe. ReleaseDC gibt übrigens 1 zurück, gibt den
DC also offensichtlich erfolgreich frei.
Kann mir das jemand erklären?
MfG Dalai