Page 1 sur 1

Hyperlien à deux couleurs paramétrables

Publié : lun. 31/mai/2004 2:43
par fweil

Code : Tout sélectionner

;
; Hyperlien avec attributs de couleur
;
; F.Weil 20040531
;
; En l'état actuel de PureBasic, il n'est pas possible de passer deux couleurs différentes en argument pour changer l'aspect du lien selon l'état
;
; Ce code permet de gérer un texte comme un hyperlien avec un attribut de couleur paramétrable.
;
; La gestion se fait dans le callback et n'est pas générique en l'état. Tel quel ce code ne traite qu'un seul hyperlien. La personnalisation est cependant facile
; à réaliser
;
Enumeration
  #Window_Main
  #Gadget_HyperLink
EndEnumeration

Procedure WindowCallback(WindowID, Message, wParam, lParam)
Static HyperlinkBrush.l, OverHyperLink.l, HyperlinkColor.l
    Result = #PB_ProcessPureBasicEvents
    Select Message
      Case #WM_LBUTTONUP ; Si le bouton est relaché et que le pointeur était sur le lien
        If OverHyperlink
            ShellExecute_(0, "open", "http:\\www.purebasic.com", 0, 0, #SW_SHOWNORMAL) ; On exécute la fonction prévue pour ce lien
        EndIf
      Case #WM_MOUSEMOVE ; Lorsque la souris bouge
        GetWindowRect_(GadgetID(#Gadget_HyperLink), Rectangle.RECT) ; On relève le rectangle contenant le lien
        GetCursorPos_(Point.POINT)
        OverHyperLink = PtInRect_(Rectangle, Point\x, Point\y) ; et on mémorise si le curseur se trouve dans le rectangle ou non
        If OverHyperLink ; Si tel est le cas
            HyperlinkColor = RGB(240, 0, 0) ; On utilise une couleur donnée
            SetCursor_(LoadCursor_(0, #IDC_HAND)) ; et un curseur 'main'
          Else
            HyperlinkColor = RGB(0, 0, 255) ; ou une autre couleur si le lien n'est pas atteint.
            SetCursor_(LoadCursor_(0, #IDC_ARROW)) ; et on revient au curseur standard
        EndIf
        InvalidateRect_(WindowID(), 0, 0)
      Case #WM_CTLCOLORSTATIC
        If lParam = GadgetID(#Gadget_HyperLink) ; Le gadget est mis à jour selon la couleur correspondant à son état.
            DeleteObject_(HyperlinkBrush)
            HyperlinkBrush = GetStockObject_(#HOLLOW_BRUSH)
            SetTextColor_(wParam, HyperlinkColor)
            SetBkMode_(wParam, #TRANSPARENT)
            Result = HyperlinkBrush
        EndIf
    EndSelect
    ProcedureReturn Result
EndProcedure

  WindowXSize = 320
  WindowYSize = 240
  Quit = #FALSE
  If OpenWindow(0, 0, 0, WindowXSize, WindowYSize, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "HyperlinkGadget")
      AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
      If CreateGadgetList(WindowID())
          TextGadget(#Gadget_HyperLink, 10, 50, 200, 20, "www.purebasic.com")
          SetGadgetFont(#Gadget_HyperLink, LoadFont(0, "Verdana", 10, #PB_Font_Bold | #PB_Font_Underline))
      EndIf
      SetCursorPos_(WindowX() + WindowWidth() / 2, WindowY() + WindowHeight() / 2) ; On génère un évènement fictif pour valider les séquences du callback
      SetWindowCallback(@WindowCallback())
      Repeat
        Select WaitWindowEvent()
          Case #PB_Event_CloseWindow
            Quit = #TRUE
          Case #PB_Event_Menu
            Select EventMenuID()
              Case #PB_Shortcut_Escape
                Quit = #TRUE
            EndSelect
        EndSelect
      Until Quit
  EndIf
End