Seite 2 von 2

Verfasst: 24.10.2005 23:25
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 ?

:(

Verfasst: 25.10.2005 10:41
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

Verfasst: 25.10.2005 11:33
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?

Verfasst: 25.10.2005 19:00
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

Verfasst: 25.10.2005 19:26
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:

Verfasst: 25.10.2005 20:01
von ts-soft
Immer noch Fehlerhaft, sorry