ButtonHoverGadget (Testlib)

Anwendungen, Tools, Userlibs und anderes nützliches.
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 »

Also, an meinem Code liegt es nicht, bzw. es liegt am ButtonImageGadget, sobald ich ein ImageGadget verwende, gibts auch keine Streifen mehr. Leider kann man beim ImageGadget weder ein KeyPress-Ereignis, Tab-Ereignis usw. verwenden (ausser vielleicht mit vielen Klimzügen, die ich ja vermeiden wollte). Wenn jemand noch Ideen hat ?

:(
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
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Also ich kann dir zwar nicht bei der lib helfen aber ich habe in meinem neuen gallerymaker auch sowas drin ich poste hier mal code-stücke vileicht bringen die was!

Code: Alles auswählen

Procedure mouseovergadget(Gadget)
  GetWindowRect_(GadgetID(Gadget), re.RECT)
  GetCursorPos_(pt.POINT)
  ProcedureReturn PtInRect_(re, pt\x, pt\y)
EndProcedure

;- und das ist bei mir inder repeatschleife
  If mouseovergadget(#button1) And sprache$="german" And mausgadaktiv=1
       If Schalterbut1=1
             SetGadgetState(#button1,UseImage(#bover1))
             
             Schalterbut1=0
             Else
          EndIf 
          ElseIf Schalterbut1=0 And sprache$="german"
      
          SetGadgetState(#button1,UseImage(#bild1))
      Schalterbut1=1
       EndIf 
       
      If mouseovergadget(#button2) And sprache$="german" And mausgadaktiv=1
      If Schalterbut2=1
             SetGadgetState(#button2,UseImage(#bover2))
             
         
             Schalterbut2=0
         Else
      EndIf 
          ElseIf Schalterbut2=0 And sprache$="german"
      
      
          SetGadgetState(#button2,UseImage(#bild2))
      Schalterbut2=1
      
       EndIf 
       ;-----------
       ;-english mausover
       If mouseovergadget(#button1) And sprache$="english" And mausgadaktiv=1
          SetGadgetState(#button1,UseImage(#bengover2))
          Schalterbut1=0
          ElseIf Schalterbut1=0 And sprache$="english"
      
          SetGadgetState(#button1,UseImage(#bild4))
      Schalterbut1=1
       EndIf 
       
      If mouseovergadget(#button2) And sprache$="english" And mausgadaktiv=1
      
          SetGadgetState(#button2,UseImage(#bengover1))
          Schalterbut2=0
      
          ElseIf Schalterbut2=0 And sprache$="english"
      
      
          SetGadgetState(#button2,UseImage(#bild3))
      Schalterbut2=1
      
       EndIf 

;habe auch flags eingebaut,ich hatte das gleiche problem,vileicht hilfts weiter
edit: Kannst ja hier mal gucken,da ist es in meinem programm eingebaut:
http://home.arcor.de/romartens/entwickl ... 0.2005.rar
Purebasic 5.0 32bit und 64 bit

I'm back from hell
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 brauche keine Routine für MouseOver, es geht darum, das das ButtonImageGadget flackert. Bei anderen Controls (Gadgets) passiert es nicht. Mit einem ImageGadget gibts garkeine Probleme.
Ich will ja nur existierende Gadgets erweitern. Wenn ich die Controls selber erstellen würde, gäbe es das Problem wohl auch nicht mehr.

Warum flackert ausgerechnet das ButtonImageGadget wenn man #WM_MOUSEMOVE in einem Callback abfragt. Kann ich den Style des Gadgets beeinflussen um diesen Effekt zu verhindern?
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
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

ts-soft hat geschrieben:Mit dem Flickern komme ich nicht so recht weiter, vielleicht kennt ja von euch einer die Lösung. Hier der Library-Source HoverButton.pb :

Code: Alles auswählen

Structure Hover
  hWnd.l
  DefaultImage.l
  PressedImage.l
  HoverImage.l
EndStructure

ProcedureDLL HoverButton_Init()
  NewList Hover.Hover()
EndProcedure

Procedure HoverCallback(hWnd, Msg, lParam, wParam)
  Protected Found
  Shared OldProc
  ForEach Hover()
    If Hover()\hWnd = hWnd
      Found = #True
      Break
    EndIf
  Next
  If Found
    If Msg = #WM_MOUSEMOVE
      GetCursorPos_(pt.POINT)
      GetWindowRect_(hWnd,re.RECT)
      If PtInRect_(re,pt\x,pt\y)
        SetCapture_(hWnd)
        If Hover()\HoverImage
          If GetGadgetState(GetDlgCtrlID_(Hover()\hWnd)) <> Hover()\HoverImage
            SetGadgetState(GetDlgCtrlID_(Hover()\hWnd),Hover()\HoverImage)
          EndIf
        EndIf
      Else
        ReleaseCapture_()
        If GetGadgetState(GetDlgCtrlID_(Hover()\hWnd)) <> Hover()\DefaultImage
          SetGadgetState(GetDlgCtrlID_(Hover()\hWnd),Hover()\DefaultImage)
        EndIf
      EndIf
    EndIf
  ElseIf Msg = #WM_KEYDOWN Or Msg = #WM_LBUTTONDOWN Or Msg = #WM_RBUTTONDOWN
    If Hover()\PressedImage
      If GetGadgetState(GetDlgCtrlID_(Hover()\hWnd)) <> Hover()\PressedImage
        SetGadgetState(GetDlgCtrlID_(Hover()\hWnd),Hover()\PressedImage)
      EndIf
    EndIf
  ElseIf Msg = #WM_KEYUP Or Msg = #WM_LBUTTONUP Or Msg = #WM_RBUTTONUP
    If Hover()\DefaultImage
      If GetGadgetState(GetDlgCtrlID_(Hover()\hWnd)) <> Hover()\DefaultImage
        SetGadgetState(GetDlgCtrlID_(Hover()\hWnd),Hover()\DefaultImage)
      EndIf
    EndIf
  EndIf
  ProcedureReturn CallFunctionFast(OldProc, hWnd, Msg, lParam, wParam)
EndProcedure

ProcedureDLL ButtonHoverGadget2(Gadget, x, y, With, Height, DefaultImageID, HoverImageID, PressedImageID)
  Protected hWnd, Result
  Shared OldProc
  Result = ButtonImageGadget(Gadget, x, y, With, Height, DefaultImageID)
  If Result
    If Gadget = #PB_Any 
      hWnd = GadgetID(Result)
    Else
      hWnd = Result
    EndIf
    AddElement(Hover())
    Hover()\hWnd = hWnd
    Hover()\DefaultImage = DefaultImageID
    Hover()\PressedImage = PressedImageID
    Hover()\HoverImage = HoverImageID
    OldProc = GetWindowLong_(hWnd, #GWL_WNDPROC)
    SetWindowLong_(hWnd, #GWL_WNDPROC, @HoverCallback())
  EndIf
  ProcedureReturn Result
EndProcedure

ProcedureDLL ButtonHoverGadget(Gadget, x, y, With, Height, DefaultImageID, HoverImageID)
  ProcedureReturn ButtonHoverGadget2(Gadget, x, y, With, Height, DefaultImageID, HoverImageID, 0)
EndProcedure

Bin für jede Hilfe dankbar, weil mit dem geflicker macht der HoverButton keine Spaß :wink:
Das funktioniert hier nicht einmal. Das "PressedImage" kann
auch nie angezeigt werden, da Deine Abfrage nach "Found"
gekürzt so aussieht:

Code: Alles auswählen

  If Found
    If Msg = #WM_MOUSEMOVE
      ....
    EndIf
  ElseIf Msg = #WM_KEYDOWN Or Msg = #WM_LBUTTONDOWN Or Msg = #WM_RBUTTONDOWN
    ....
  ElseIf Msg = #WM_KEYUP Or Msg = #WM_LBUTTONUP Or Msg = #WM_RBUTTONUP
    ....
  EndIf
  ProcedureReturn CallFunctionFast(OldProc, hWnd, Msg, lParam, wParam)
EndProcedure
Wenn das Fenster in der LinkedList gefunden wurde, wird
also nur #WM_MOUSEMOVE bearbeitet - die anderen
Nachrichten werden nie bearbeitet. Total verbuggt das bissl Code.

Das flickern ist ganz einfach zu erklären:

Code: Alles auswählen

    If Msg = #WM_MOUSEMOVE
      GetCursorPos_(pt.POINT)
      GetWindowRect_(hWnd,re.RECT)
      If PtInRect_(re,pt\x,pt\y)
        SetCapture_(hWnd)
        If Hover()\HoverImage
          If GetGadgetState(GetDlgCtrlID_(Hover()\hWnd)) <> Hover()\HoverImage
            SetGadgetState(GetDlgCtrlID_(Hover()\hWnd),Hover()\HoverImage)
            Beep_(800,100)
          EndIf
        EndIf
      Else
Füge dort das Beep_() ein, und Du wirst feststellen das es
bei jedem MouseMove beept.
Das heißt: GetGadgetState() gibt nicht die ImageID des
ButtonImageGadgets zurück, sondern wahrscheinlich den
Status ob der Button gedrückt ist oder nicht (0 oder 1).
In der Hilfe steht bei GetGadgetState() aber auch nicht das
es für ButtonImageGadgets die ImageID zurück gibt.
Ein 'Debug GetGadgetState(0)' zeigt mir für ein ButtonHoverGadget
jedenfalls 0 an, direkt nachdem das Gadget erstellt wurde.
Das neue Bild wird somit bei jedem Durchlauf gesetzt.

Weitermachen! :D
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
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 »

Danilo hat geschrieben: Das funktioniert hier nicht einmal. Das "PressedImage" kann
auch nie angezeigt werden, da Deine Abfrage nach "Found"
gekürzt so aussieht:

Code: Alles auswählen

  If Found
    If Msg = #WM_MOUSEMOVE
      ....
    EndIf
  ElseIf Msg = #WM_KEYDOWN Or Msg = #WM_LBUTTONDOWN Or Msg = #WM_RBUTTONDOWN
    ....
  ElseIf Msg = #WM_KEYUP Or Msg = #WM_LBUTTONUP Or Msg = #WM_RBUTTONUP
    ....
  EndIf
  ProcedureReturn CallFunctionFast(OldProc, hWnd, Msg, lParam, wParam)
EndProcedure[/quote]Den Fehler hab ich schon beseitigt gehabt, ist beim Experimentieren entstanden[quote="Danilo"]
Wenn das Fenster in der LinkedList gefunden wurde, wird
also nur #WM_MOUSEMOVE bearbeitet - die anderen
Nachrichten werden nie bearbeitet. Total verbuggt das bissl Code.

Das flickern ist ganz einfach zu erklären:
[code]    If Msg = #WM_MOUSEMOVE
      GetCursorPos_(pt.POINT)
      GetWindowRect_(hWnd,re.RECT)
      If PtInRect_(re,pt\x,pt\y)
        SetCapture_(hWnd)
        If Hover()\HoverImage
          If GetGadgetState(GetDlgCtrlID_(Hover()\hWnd)) <> Hover()\HoverImage
            SetGadgetState(GetDlgCtrlID_(Hover()\hWnd),Hover()\HoverImage)
            Beep_(800,100)
          EndIf
        EndIf
      Else
Füge dort das Beep_() ein, und Du wirst feststellen das es
bei jedem MouseMove beept.
Das heißt: GetGadgetState() gibt nicht die ImageID des
ButtonImageGadgets zurück, sondern wahrscheinlich den
Status ob der Button gedrückt ist oder nicht (0 oder 1).
In der Hilfe steht bei GetGadgetState() aber auch nicht das
es für ButtonImageGadgets die ImageID zurück gibt.
Ein 'Debug GetGadgetState(0)' zeigt mir für ein ButtonHoverGadget
jedenfalls 0 an, direkt nachdem das Gadget erstellt wurde.
Das neue Bild wird somit bei jedem Durchlauf gesetzt.

Weitermachen! :D
Hab vorher mit nem Flag gemacht, das Bild wird also nur einmal getauscht. Das Flickern ist trotzdem vorhanden. Wenn ich das ButtonImageGadget gegen ein ImageGadget austausche flickert nichts mehr, mit demselben Code.

thx :D
Ich weiß leider immer noch nicht, warum sich das ButtonImageGadget anders als ein ImageGadget verhält, weil mit dem funzt es ja, sogar der vermurkste kram von da oben :wink:
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
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 »

Immer noch Fehlerhaft, sorry
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
Antworten