ImageGadget - kein neu zeichnen

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

ImageGadget - kein neu zeichnen

Beitrag 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
Zuletzt geändert von uweb am 02.04.2007 22:47, insgesamt 2-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag 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.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Gesperrt