Maus über Imagegadget, Image Helligkeit + invertieren

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Maus über Imagegadget, Image Helligkeit + invertieren

Beitrag 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 

Zuletzt geändert von hjbremer am 20.02.2008 08:55, insgesamt 1-mal geändert.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
pebo
Beiträge: 66
Registriert: 01.12.2006 21:08
Wohnort: 66450 Bexbach

Beitrag von pebo »

Cool, gute Arbeit :allright:

Gruss
Peter
Alle sagten "das geht nicht!" .... und dann kam einer der nichts davon wusste und machte es einfach.
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag von legion »

Super Sache ! :allright:
gefällt mir !

Lg. Legion
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Top! :allright:
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
Helmut
Beiträge: 162
Registriert: 20.09.2004 22:53

Beitrag von Helmut »

Suoer gemacht,
Holsteiner an die Macht.
Muß ja nicht immer Peter Harry sein. :allright:
Antworten