Seite 1 von 1

ImageGadget - kein neu zeichnen

Verfasst: 02.04.2007 22:24
von uweb
Wenn ich doch auf der Leitung sitzen sollte wäre mir das zwar peinlich
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

Verfasst: 02.04.2007 22:43
von ts-soft

Code: Alles auswählen

;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
  ResizeGadget(G_Anzeige_Bild, (WindowWidth(0)-16-ImageWidth(Anzeige_Bild))/2+8, (WindowHeight(0)-144-ImageHeight(Anzeige_Bild))/2+136, 1, 1)
  SetGadgetState(G_Anzeige_Bild, ImageID(Anzeige_Bild))
EndIf
Nur die letzten 3 Zeilen beachten!

Verfasst: 02.04.2007 23:02
von uweb
DANKE !
So läuft es.
Ich dachte zuerst ich hätte einen Logikfehler in der Berechnung bis ich den Unterschied entdeckt habe.
Ein bitterer Beigeschmack bleibt schon wenn man, wie vor langer Zeit, unabhängige Befehle nur in einer bestimmten Reihenfolge verwenden kann. Das erinnert ein wenig an die Delays wenn man in die API eintaucht. Aber so lange ich hier im Forum so schnell Hilfe finde kann ich mit solchen Unwegsamkeiten sehr gut leben.

Verfasst: 02.04.2007 23:08
von ts-soft
>> Ich dachte zuerst ich hätte einen Logikfehler in der Berechnung bis ich den Unterschied entdeckt habe.
Ich denke mal, das PB das #WM_PAINT nach einem Resize übergeht, um
Flackern zu vermeiden. Und bevor man das Neuzeichnen selbst übernimmt,
sollte der Workaround doch reichen :D