aber immer noch lieber als wirklich einen Fehler entdeckt zu haben.
Es fällt mir auch schwer zu glauben, daß bisher noch niemand darüber gestolpert ist.
Ich schreibe gerade an einem Programm um ein oder mehrere Bilder zu konvertieren bzw zurecht zu schneiden.
Das Entwurf läuft zwar so weit, wenn ich aber mit einem Fenster so über mein Programm komme,
daß nur das ImageGadget betroffen ist wird das Bild nicht neu gezeichnet.
Code: Alles auswählen
; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=2587&postdays=0&postorder=asc&start=10
; Author: Danilo (updated for PB4.00 by blbltheworm)
; Date: 18. October 2003
; OS: Windows
; Demo: No
; Need PB 3.80+ (fixed PB3.80 compiler)!!
Procedure LoadPictureFile(image,szFile.s)
;
; Loads
; BMP, GIF, JPG, WMF, EMF, ICO
;
hFile = CreateFile_(szFile, #GENERIC_READ, 0, #Null, #OPEN_EXISTING, 0, #Null)
If hFile
dwFileSize = GetFileSize_(hFile, #Null)
HGLOBAL = GlobalAlloc_(#GMEM_MOVEABLE, dwFileSize)
If HGLOBAL
pvData = GlobalLock_(HGLOBAL)
bRead = ReadFile_(hFile, pvData, dwFileSize, @dwBytesRead, #Null)
GlobalUnlock_(HGLOBAL)
If bRead
If CreateStreamOnHGlobal_(HGLOBAL, #True, @pstm.IStream) = #S_OK
If OleLoadPicture_(pstm, dwFileSize, #False,?IID_IPicture, @Bild.IPicture) = #S_OK
; Here we got the IPicture Object
Bild\get_Height(@Height)
Bild\get_Width(@Width)
hDC = GetDC_(GetDesktopWindow_())
ScreenPixels_X = GetDeviceCaps_(hDC,#LOGPIXELSX)
ScreenPixels_Y = GetDeviceCaps_(hDC,#LOGPIXELSY)
ReleaseDC_(GetDesktopWindow_(),hDC)
PicHeight = (Height * ScreenPixels_X) / 2540
PicWidth = (Width * ScreenPixels_Y) / 2540
result = CreateImage(image,PicWidth,PicHeight)
If result
hDC = StartDrawing(ImageOutput(image))
Bild\Render(hDC,0,PicHeight,PicWidth,-PicHeight,0,0,Width,Height,0)
StopDrawing()
EndIf
Bild\Release()
EndIf
pstm\Release()
EndIf
EndIf
EndIf
CloseHandle_(hFile)
EndIf
ProcedureReturn result
DataSection
IID_IPicture:
Data.l $7BF80980
Data.w $BF32,$101A
Data.b $8B,$BB,$00,$AA,$00,$30,$0C,$AB
EndDataSection
EndProcedure
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
ExamineDesktops()
MusterDatei.s = ProgramParameter()
If MusterDatei.s = ""
Pattern.s = "*.bmp|*.bmp;*.BMP|*.emf|*.emf;*.EMF|*.gif|*.gif;*.GIF|*.ico|*.ico;*.ICO|*.jpg|*.jpg;*.JPG|"
Pattern.s = Pattern.s + "*.png|*.png;*.PNG|*.tga|*.tga;*.TGA|*.tif|*.tif;*.TIF|*.wmf|*.wmf;*.WMF"
MusterDatei.s = OpenFileRequester("Bitte (Muster-)Datei auswählen","c:\",Pattern.s,0,0)
EndIf
Endung.s = LCase(GetExtensionPart(MusterDatei.s))
Debug MusterDatei.s
Debug Endung.s
If Endung.s = "bmp" Or Endung.s = "ico" Or Endung.s = "jpg" Or Endung.s = "png" Or Endung.s = "tga" Or Endung.s = "tif"
LoadImage(0, MusterDatei.s,#PB_Image_DisplayFormat)
Else
LoadPictureFile(0, MusterDatei.s)
EndIf
Original_Bild = 0
S_Eingabe.s = "Eingabe"
S_suchen.s = "suchen"
S_rekursiv.s = "rekursiv"
S_gefunden.s = "0 Dateien gefunden"
S_abbrechen.s = "abbrechen"
S_Verarbeitung.s = "Verarbeitung"
S_paralell.s = "paralell"
S_Kantenglaettung.s = "Kantenglättung"
S_horizontal.s = "horizontal"
S_vertikal.s = "vertikal"
S_Ausgabe.s = "Ausgabe"
S_Farbtiefe.s = "Farbtiefe"
S_Typ.s = "Typ"
S_ueberschreiben.s = "überschreiben"
S_do.s = "do"
S_skip.s = "skip"
S_all.s = "all"
S_aktuelle_Datei.s = "aktuelle Datei"
If OpenWindow(0, 0, 0, 1, 1, "",#PB_Window_MaximizeGadget|#PB_Window_Maximize)
If CreateGadgetList(WindowID(0))
Panel = PanelGadget(#PB_Any, 8, 8, 260, 120)
AddGadgetItem(Panel, -1, S_Eingabe.s)
ButtonGadget(#PB_Any, 8, 8, 90, 20, S_suchen.s)
CheckBoxGadget(#PB_Any, 162, 8, 90, 20, S_rekursiv.s)
ComboBoxGadget(#PB_Any, 8, 38, 240, 20)
TextGadget(#PB_Any, 8, 68, 120, 20, S_gefunden.s)
abbrechen = ButtonGadget(#PB_Any, 158, 68, 90, 20, S_abbrechen.s)
AddGadgetItem(Panel, -1, S_Verarbeitung.s)
TextGadget(#PB_Any, 8, 8, 60, 20, S_horizontal.s)
SpinGadget(#PB_Any, 8, 28, 40, 30, 0, 10)
CheckBoxGadget(#PB_Any, 8, 68, 90, 20, S_paralell.s)
TextGadget(#PB_Any, 80, 8, 60, 20, S_vertikal.s)
SpinGadget(#PB_Any, 80, 28, 40, 30, 0, 10)
CheckBoxGadget(#PB_Any, 80, 68, 90, 20, S_paralell.s)
CheckBoxGadget(#PB_Any, 152, 24, 90, 20, S_Kantenglaettung.s)
AddGadgetItem(Panel, -1, S_Ausgabe.s)
ComboBoxGadget(#PB_Any, 8, 8, 50, 20)
ComboBoxGadget(#PB_Any, 8, 38, 50, 20)
TextGadget(#PB_Any, 68, 13, 60, 20, S_Farbtiefe.s)
TextGadget(#PB_Any, 68, 43, 60, 20, S_Typ.s)
CheckBoxGadget(#PB_Any, 159, 8, 90, 20, S_ueberschreiben.s)
ButtonGadget(#PB_Any, 108, 38, 40, 20, S_skip.s)
ButtonGadget(#PB_Any, 158, 38, 40, 20, S_do.s)
all = ButtonGadget(#PB_Any, 208, 38, 40, 20, S_all.s)
TextGadget(#PB_Any, 8, 68, 240, 20, S_aktuelle_Datei.s)
CloseGadgetList()
Ergebnis = ListIconGadget(#PB_Any, 276, 8, DesktopWidth(0)-284, 120, "", 0 , #PB_ListIcon_CheckBoxes|#PB_ListIcon_MultiSelect|#PB_ListIcon_GridLines|#PB_ListIcon_HeaderDragDrop)
G_Anzeige_Bild = ImageGadget(#PB_Any, (WindowWidth(0)-16-ImageWidth(Anzeige_Bild))/2+8, (WindowHeight(0)-144-ImageHeight(Anzeige_Bild))/2+136, 1, 1, ImageID(Anzeige_Bild))
EndIf
EndIf
;Anzeige_Bild = Original_Bild
If ImageWidth(0) > WindowWidth(0) Or ImageHeight(0) > (WindowHeight(0)-144) Or ImageWidth(0) < (WindowWidth(0)-16)/2 And ImageHeight(0) < (WindowHeight(0)-144)/2
Anzeige_Bild = CopyImage(0, #PB_Any)
H_Faktor.f = ImageWidth(0) / (WindowWidth(0)-16)
V_Faktor.f = ImageHeight(0) / (WindowHeight(0)-144)
If H_Faktor.f > V_Faktor.f
If Kantenglaettung
ResizeImage(Anzeige_Bild, ImageWidth(0) / H_Faktor.f, ImageHeight(0) / H_Faktor.f)
Else
ResizeImage(Anzeige_Bild, ImageWidth(0) / H_Faktor.f, ImageHeight(0) / H_Faktor.f,#PB_Image_Raw)
EndIf
Else
If Kantenglaettung
ResizeImage(Anzeige_Bild, ImageWidth(0) / V_Faktor.f, ImageHeight(0) / V_Faktor.f)
Else
ResizeImage(Anzeige_Bild, ImageWidth(0) / V_Faktor.f, ImageHeight(0) / V_Faktor.f,#PB_Image_Raw)
EndIf
EndIf
SetGadgetState(G_Anzeige_Bild, ImageID(Anzeige_Bild))
ResizeGadget(G_Anzeige_Bild, (WindowWidth(0)-16-ImageWidth(Anzeige_Bild))/2+8, (WindowHeight(0)-144-ImageHeight(Anzeige_Bild))/2+136, 1, 1)
EndIf
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow : Ende = #True
Case #PB_Event_Gadget
Select EventGadget()
Case abbrechen : Ende = #True
EndSelect
EndSelect
Until Ende