Seite 1 von 1

Maus über Imagegadget, Image Helligkeit + invertieren

Verfasst: 20.02.2008 00:18
von hjbremer
In meinem Code wird das Image direkt verändert, wenn ich mit der Maus ein Imagegadget bzw. ButtonImagegadget berühre.

Im Callback wird WM_SETCURSOR verwendet um zu erkennen ob die Maus über ein Gadget ist. Gerade für das ImageGadget ist dies die einfachste Möglichkeit die ich gefunden habe.

ob mit oder ohne XP-Skin sollte egal sein. Die Bilder sollten auf einem Windows-XP System vorhanden sein.

Dies ist ein BeispielCode zum ausprobieren und nicht zum direkten übernehmen in eigenen Code gedacht. Darum auch kein Protected und ähnlichen Krams.

Code: Alles auswählen

;von HJBREMER
;WINDOWS XP - PB 4.1 mit oder ohne eingeschaltetem XP-SKIN !!!

Declare myButton_callback(hWnd, Msg, wParam, lParam) 
Declare ButtonImgChange_viaCallback(button)

Enumeration   
#image1
#image2
#image3
#butimg1
#butimg2
#butimg3
#butimg4
#butimg5
#butimg6

#button1
#button2
#button3
#button4
#buttxt1

#imgchange_nr
EndEnumeration

UseJPEGImageDecoder() 

;#PB_Window_Invisible = nicht sichtbar = schnellerer Bildaufbau
windowstyles = #PB_Window_SystemMenu|1|#PB_Window_Invisible ;die 1 = zentriert

hwnd=OpenWindow(0, 0, 0, 400,400, "",windowstyles) 

CreateGadgetList(hwnd) 

   ;Resize muß sein ! siehe Hilfe zu ImageGadget, 
   br=120
   hh=50
   sp=10
   ze=20
   CatchImage(#image1, ?Bild1)
   imageid1=ResizeImage(#image1,br,hh)        
   ImageGadget(#butimg1,sp,ze,br,hh,imageid1)
   
   sp+br
   CatchImage(#image2, ?Bild2)
   imageid2=ResizeImage(#image2,br,hh)        
   ImageGadget(#butimg2,sp,ze,br,hh,imageid2)
   
   sp+br
   CatchImage(#image3, ?Bild3)
   imageid3=ResizeImage(#image3,br,hh)        
   ImageGadget(#butimg3,sp,ze,br,hh,imageid3)
   
   sp=10
   ze+50
   br=90
   ButtonGadget(#button1,sp,ze,br,hh,"Invert")
   sp+br
   ButtonGadget(#button2,sp,ze,br,hh,"Rand Invert")
   sp+br
   ButtonGadget(#button3,sp,ze,br,hh,"Brightness")
   sp+br
   ButtonGadget(#button4,sp,ze,br,hh,"RedGreenTint")
   
   sp=10
   ze+50
   br=120
   ButtonImageGadget(#butimg4,sp,ze,br,hh,imageid2)
   sp+br
   ButtonImageGadget(#butimg5,sp,ze,br,hh,imageid3)
   sp+br
   ButtonImageGadget(#butimg6,sp,ze,br,hh,imageid1)
   
   sp=10
   ze+100
   br=120
   TextGadget(#buttxt1,sp,ze,br,hh,"Press Image")
   
   
  ;#PB_Window_Invisible rückgängig machen, Fenster anzeigen
  SetWindowState(0, #PB_Window_Normal) 
  
  SetWindowCallback(@myButton_Callback()) 
  
  caflag=3  
  heller=10
  
;----------------------------------------------------------------  

Repeat 
   event=WaitWindowEvent() 
   
    If Event = #PB_Event_Gadget Or EventID = #PB_Event_Menu 
          
            welcherButton=EventGadget()            
            
            Select welcherButton                      
            
                  Case #butimg1:heller+10
                  Case #butimg2:heller+10
                  Case #butimg3:heller+10
                  Case #butimg4:heller-10
                  Case #butimg5:heller-10
                  Case #butimg6:heller-10
                  
                  Case #button1:caflag=1
                  Case #button2:caflag=2
                  Case #button3:caflag=3
                  Case #button4:caflag=4
                  
            EndSelect
            
            If heller < -100: heller=-100: EndIf
            If heller >  100: heller= 100: EndIf
            SetGadgetText(#buttxt1,"Brightness="+Str(heller))
            
    EndIf
      
Until event = #PB_Event_CloseWindow 

End 

Procedure myButton_callback(hWnd, Msg, wParam, lParam) 

result = #PB_ProcessPureBasicEvents 

Static imgflag

Select msg 
   
    Case #WM_SETCURSOR
    
        buttonid = wParam
        
        button = GetDlgCtrlID_(buttonid)
               
              Select button
              
                  ;setzt voraus das Konstanten bei Enumeration hintereinander liegen
                  ;sonst halt einzeln aufführen
                  Case #butimg1 To #butimg6 
                     
                     ;Maus berührt Image 
                     If imgflag <> button
                        imgflag=button
                        ButtonImgChange_viaCallback(button)
                     EndIf
                        
                  Default
                     
                     ;Maus hat Image verlassen   
                     If imgflag
                        imgflag=0
                        ButtonImgChange_viaCallback(0)
                     EndIf
                  
              EndSelect ;von button 2.Abfrage
        
EndSelect ;von msg

ProcedureReturn result 
EndProcedure

Procedure ButtonImgChange_viaCallback(button)

;ButtonPbnummern sollten als Konstanten per Enumeration definiert werden, 
;denn mit PB_any werden die Nummern zu groß und demzufolge auch das Feld

Static buttonmax   ;größter Wert einer Buttonnummer
Static Dim but(0) ;behält die imageID des Buttons, 

Shared caflag     ;nur für die Demo 
Shared heller     ;nur für die Demo 

    ;Feld anpassen
    If button > buttonmax
       buttonmax=button
       ReDim but(button)
    EndIf
    
    ;letztes Image wiederherstellen
    For j=0 To buttonmax
        If but(j)             
           SetGadgetState(j,but(j)) 
           but(j)=0         
        EndIf
    Next

    If button=0: ProcedureReturn: EndIf    ;Maus hat Image verlassen
    
    ;Image merken
    imgnr = GetGadgetState(button)          
    but(button)=imgnr
    
    ;neues Image erstellen und anzeigen
    If imgnr
        
        hh=GadgetHeight(button)
        br=GadgetWidth(button)
    
        imageID = CreateImage(#imgchange_nr,br,hh)        
             dc = StartDrawing(ImageOutput(#imgchange_nr))
                    
                  Select caflag
                  
                      Case 1
                          ;Image invertieren
                          DrawingMode(#PB_2DDrawing_XOr)
                          DrawImage(imgnr,0,0)
                          
                          ;macht dasgleiche wie DrawingMode(#PB_2DDrawing_XOr)
                          ;DrawImage(imgnr,0,0)
                          ;BitBlt_(dc,0,0,br,hh,dc,0,0,#DSTINVERT)
                      
                      Case 2
                          ;oben, unten, links, rechts invertieren
                          DrawImage(imgnr,0,0)
                          BitBlt_(dc,0,0,   br,5 ,dc,0,0,   #DSTINVERT)     ;oben
                          BitBlt_(dc,0,hh-5,br,5 ,dc,0,hh-5,#DSTINVERT)     ;unten
                          BitBlt_(dc,0,5,5,hh-10 ,dc,0,5,#DSTINVERT)        ;links                
                          BitBlt_(dc,br-5,5,5,hh-10 ,dc,br-5,5,#DSTINVERT)  ;rechts

                      Case 3,4
                          
                          ;Helligkeit etc verändern
                          DrawImage(imgnr,0,0)                    
                          SetStretchBltMode_(dc,#HALFTONE)
                          
                          ca.COLORADJUSTMENT                    
                          GetColorAdjustment_(dc,ca.COLORADJUSTMENT)
                          
                          ca\caFlags=#CA_LOG_FILTER  ;wird nicht unbedingt gebraucht, ohne andere Werte	
                          
                          If caflag=3
                             ca\caBrightness=heller  ;weitere Möglichkeiten siehe MSDN etc
                          Else
                             ca\caRedGreenTint=99
                          EndIf
                          
                          SetColorAdjustment_(dc,ca.COLORADJUSTMENT)
                          
                          StretchBlt_(dc, 0,0,br,hh,dc, 0,0,br,hh, #SRCCOPY)
                  
                  EndSelect
                    
                  StopDrawing()

        SetGadgetState(button,imageID)
    
    EndIf

EndProcedure

DataSection 
   Bild1: IncludeBinary  "C:\WINDOWS\Web\Wallpaper\Stonehenge.jpg"
   Bild2: IncludeBinary  "C:\WINDOWS\Web\Wallpaper\Karibiktraum.jpg"
   Bild3: IncludeBinary  "C:\WINDOWS\Web\Wallpaper\Fischkarawane.jpg"
EndDataSection 


Verfasst: 20.02.2008 03:26
von pebo
Cool, gute Arbeit :allright:

Gruss
Peter

Verfasst: 20.02.2008 16:12
von legion
Super Sache ! :allright:
gefällt mir !

Lg. Legion

Verfasst: 20.02.2008 20:17
von marco2007
Top! :allright:

Verfasst: 20.02.2008 23:32
von Helmut
Suoer gemacht,
Holsteiner an die Macht.
Muß ja nicht immer Peter Harry sein. :allright: