Ich habe mir das eben mal angeschaut, und muss sagen:
@OLLI_T: Du hast einen furchtbaren Programmierstil. Mal schreibst du Schlüsselworte klein, dann wieder am Anfang groß. Mal lässt du ein Leerzeichen bei Vergleichen, dann wieder nicht. Ja ja, ich weiß, es war nur zu Demozwecken. Trotzdem ... Na ja, und die vielen
exit-Anweisungen, was ja auch Luckie schon erwähnt hat ... hm ...
Wenn die Datei zwar geöffnet werden konnte, aber bspw. das Lesen nicht funktioniert, dann verlässt du deine Prozedur, ohne vorher das
Handle "hFile" wieder freizugeben. Das würde nicht passieren, wenn du das ganze in
try/
finally einklammerst, wobei
CloseHandle(hFile);
dann im
finally-Teil stehen sollte.
Und für den Fall, dass mal mit der Dateigröße etwas nicht stimmt, wirst du vermutlich ein paar Fehler kassieren, denn bei mir meckert der Compiler (D5) hier
Zitat:
If (dwFileSize = -1) Then Exit;
dass der Vergleich immer Falsch ergibt. Ein DWord hat kein Vorzeichen und kann daher auch nicht kleiner als Null werden. Richtig wäre
IMHO
if(dwFileSize = INVALID_FILE_SIZE) then exit;
Und dann funktioniert deine Button-Klickprozedur nicht. "hRes" wird nie benötigt, und im Code findet man ein "DC1", von dem man nicht erfährt, woher es stammt. Ich habe stattdessen die "Show"-Funktion aus dem C-Sample als Grundlage benutzt, und es hat sofort problemlos geklappt:
Delphi-Quellcode:
if(LoadPicture('
Dateiname.jpg',pPic))
then begin
DC := GetDC(wnd);
if(pPic.get_Width(hmWidth) = S_OK)
and
(pPic.get_Height(hmHeight) = S_OK)
and
(GetClientRect(wnd,rc))
then
begin
nWidth := MulDiv(hmWidth,GetDeviceCaps(
DC,LOGPIXELSX),2540);
nHeight := MulDiv(hmHeight,GetDeviceCaps(
DC,LOGPIXELSY),2540);
pPic.Render(
DC,0,0,nWidth,nHeight,0,hmHeight,hmWidth,
-hmHeight,rc);
end;
ReleaseDC(wnd,
DC);
end;
Meine IPicture-Variable ist übrigens lokal, heißt "pPic" und wird als VAR-Parameter an deine (von mir leicht umgeschriebene) Funktion "LoadPicture" übergeben.
So, meine eigene Frage betrifft jetzt lediglich den Sinn der Werte 2540 in den Zeilen
Delphi-Quellcode:
nWidth := MulDiv(hmWidth,GetDeviceCaps(
DC,LOGPIXELSX),2540);
nHeight := MulDiv(hmHeight,GetDeviceCaps(
DC,LOGPIXELSY),2540);
Damit kann ich, offen gestanden, im Moment nichts anfangen. Ich weiß, dass die integer-Werte "hmWidth" und "hmHeight" nicht den Pixelmaßen entsprechen, und dass sie deshalb mit "MulDiv" umgerechnet werden. Aber woher bzw. woraus/wovon ergibt sich die 2540?
Gruß.