AutoHotkey Homepage AutoHotkey Community
Let's help each other out
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Gui URL and and mouse cursor
Goto page 1, 2  Next
 
Reply to topic    AutoHotkey Community Forum Index -> Ask for Help
View previous topic :: View next topic  
Author Message
AGU
Guest





PostPosted: Sun Nov 06, 2005 2:08 pm    Post subject: Gui URL and and mouse cursor Reply with quote

Took this code from a posting in "Wish List"

Code:
Gui, Font, underline
Gui, Add, Text, cBlue gMyLink, www.google.com
Gui, Font, norm

Gui, Font, underline
Gui, Add, Text, cBlue gMyMail, someone@place.com
Gui, Font, norm

Gui, Show
return

MyLink:
Run, www.google.com
return

MyMail:
Run, mailto: someone@place.com
return

Do you see a way to let the mouse cursor change to the "hand" cursor during hovering the URL?
I searched the forum but didn't find a solution. Am I blind? Wink
Back to top
AGU
Guest





PostPosted: Sun Nov 06, 2005 3:02 pm    Post subject: Reply with quote

Searched Google. Wink

Thought about a combination of SetCursor and
Code:
MouseGetPos,,,, ACtrl

When ACtrl holds the name of the correct control the mouse cursor should change to the hand symbol.
Am I completely wrong? I'm not sure 'bout the function and how to eventually implement it via DllCall.

Or is there a way to change mouse cursor within AHK I have overlooked?
Back to top
AGU
Guest





PostPosted: Sun Nov 06, 2005 8:27 pm    Post subject: Reply with quote

Found this thread: http://www.autohotkey.com/forum/viewtopic.php?t=4570

Code:
  NULL=
  IDC_HAND := 32649
  IDC_ARROW := 32512

!0::Gosub, CursorTest
Return


CursorTest:
  ;// Load a cursor. If the 1st arg is NULL, specify one of the Constants above
  ;// as the second arg to load a system cursor
  result1 := DllCall("LoadCursor", "Uint", NULL, "Int", IDC_HAND, "Uint")

  ;// Changes a system cursor.
  result2 := DllCall("SetSystemCursor", "Uint", result1, "Int", IDC_ARROW, "Uint")
Return


Pressing Alt+0 changes arrow mouse cursor to hand cursor. Pressing it again restores arrow cursor. Don't know why.
Is this of any help for solving my problem?
Back to top
AGermanUser



Joined: 12 Feb 2005
Posts: 82

PostPosted: Mon Nov 07, 2005 11:15 am    Post subject: Reply with quote

I'm still looking for a solution. Rolling Eyes No one here with an idea?

This is how far I came:
Code:
ScriptName = CursorURLTest

NULL=
IDC_HAND := 32649
IDC_ARROW := 32512
GoSub, CreateTestGui
Return

CreateTestGui:
  Gui, Font, underline
  Gui, Add, Text, cBlue gMyLink, www.google.com
  Gui, Font, norm
  Gui, Show, w200 h100, %ScriptName%
 
  SetTimer, ShowCursor, 100
Return

GuiClose:
  ExitApp
Return

MyLink:
Run, www.google.com
Return

ShowCursor:
IfWinNotActive, %ScriptName%
  {
    Return
  }
 
  MouseGetPos,,,, ACtrl
 
  If ACtrl = Static1
    {
      GoSub, CursorURL
      SetTimer, ShowCursor, Off
    }
 
  If ACtrl <> Static1
    {
      Return
    }
Return

CursorURL:
  ;// Load a cursor. If the 1st arg is NULL, specify one of the Constants above
  ;// as the second arg to load a system cursor
  result1 := DllCall("LoadCursor"
                    , "Uint"
                    , NULL
                    , "Int"
                    , IDC_HAND
                    , "Uint")

  ;// Changes a system cursor.
  result2 := DllCall("SetSystemCursor"
                    , "Uint"
                    , result1
                    , "Int"
                    , IDC_ARROW
                    , "Uint")
Return

It works once, but cursor stays to be a hand. Fix it by closing gui, running script again and hover the URL again.
_________________
Cheers
BBCodeWriterToDo-ListCopyPassage
Back to top
View user's profile Send private message
AGU
Guest





PostPosted: Tue Nov 08, 2005 5:39 pm    Post subject: Reply with quote


I'm still here looking for a solution. Nobody here with a possible solution?
Back to top
shimanov



Joined: 25 Sep 2005
Posts: 610

PostPosted: Tue Nov 08, 2005 8:29 pm    Post subject: Reply with quote

AGU wrote:

I'm still here looking for a solution. Nobody here with a possible solution?


It would be useful if you provide some additional information.

* Will this behavior only be active for a Text control?
* Will the URL be the only text within that control?
* Will the URL text always have a specific color?
* Would you like any other behaviors or characteristics?
Back to top
View user's profile Send private message
AGU
Guest





PostPosted: Tue Nov 08, 2005 9:50 pm    Post subject: Reply with quote

Hello shimanov:),

concerning your questions / additional informations:

Quote:
* Will this behavior only be active for a Text control?
As Chris proposed it in this thread you can accomplish a hyperlink by using a text control. That's why I used a text control. Don't know if it must be a text control, but I would say a text control is perfect for this purpose.
Quote:
* Will the URL be the only text within that control?
I would say yes. All I want to accomplish is an URL with the known mouse cursor behaviour.
Quote:
* Will the URL text always have a specific color?
Hmm, good question. I would say, it must have a different color than normal text to indicate it's a hyperlink. As blue is the IE standard color for (unvisited) hyperlinks I took this one. But I can't tell you if it has to be blue at all. If you think a specific color is the best, I would vote for blue. Otherwise maybe configurable?
Quote:
* Would you like any other behaviors or characteristics?
Hmm, maybe the text gets underlined during hovering it? Just as you would expect from a hyperlink. If this is to complicated all I want is the mouse cursor to change to the "hand" cursor during hovering the URL (text control, or whatever Wink)

Thanks for any help.
Cheers AGU
Back to top
shimanov



Joined: 25 Sep 2005
Posts: 610

PostPosted: Wed Nov 09, 2005 3:57 am    Post subject: Reply with quote

The code below seems to fulfill your request. If it works for you, I will help you complete it.

Known limitations:

    * Underline is not removed if the mouse "jumps" (e.g., via MouseMove)

    To observe this limitation, press F10 while hovering over the underlined text. Under normal use, this limitation should not be an issue. If it is, there is a solution which requires addition of a timer.


Usage:

    * Hover behavior requires (for convenience) an associated variable with a "URL_" prefix.
    * Move the cursor and observe the ensuing effects. Have fun.


Code:
Gui, Add, Picture,, c:\windows\winnt.bmp

Gui, Add, Text,, www.test.com

Gui, Add, Text, cBlue gMyLink vURL_MyLink, www.google.com
Gui, Font, norm

Gui, Add, Text, cGreen gMyMail, someone@place.com
Gui, Font, norm

Gui, Add, Text, cRed, www.hello.com

Gui, Show, x50 y50

Process, Exist
pid_this := ErrorLevel

WinGet, hw_gui, ID, ahk_class AutoHotkeyGUI ahk_pid %pid_this%

WM_SETCURSOR = 0x20
OnMessage( WM_SETCURSOR, "HandleMessage" )

WM_MOUSEMOVE = 0x200
OnMessage( WM_MOUSEMOVE, "HandleMessage" )
return

F10::
   CoordMode, Mouse, Screen
   MouseMove, 5, 5, 0
return

F11::
   Reload
return

F12::
ExitApp

HandleMessage( p_w, p_l, p_m, p_hw )
{
   global   WM_SETCURSOR, WM_MOUSEMOVE
   static   URL_hover, h_old_cursor
   
   if ( p_m = WM_SETCURSOR )
   {
      return, true
   }
   else if ( p_m = WM_MOUSEMOVE )
   {
      if ( A_GuiControl = "URL_MyLink" )
      {
         if URL_hover=
         {
            Gui, Font, cBlue underline
            GuiControl, Font, URL_MyLink
            
            h_cursor_hand := DllCall( "LoadCursor", "uint", 0, "uint", 32649 )
            
            h_old_cursor := DllCall( "SetCursor", "uint", h_cursor_hand )
            
            URL_hover := true
         }
      }
      else
      {
         if ( URL_hover )
         {
            Gui, Font, norm cBlue
            GuiControl, Font, URL_MyLink
            
            DllCall( "SetCursor", "uint", h_old_cursor )
            
            URL_hover=
         }
      }
   }
}

GuiClose:
ExitApp

MyLink:
   MsgBox, MyLink
return

MyMail:
   MsgBox, MyMail
return
Back to top
View user's profile Send private message
AGU
Guest





PostPosted: Wed Nov 09, 2005 2:11 pm    Post subject: Reply with quote

Hello shimanov,

works great. But I found a strange behaviour. When the GUI is created and the mouse cursor is not within the new window at startup, the mouse cursor is an hourglass (IDC_WAIT?) when entering the GUI.
Another thing I recognized. Sometimes the mousecursor changes back to the arrow cursor when moving over the URL text control. But that's no problem.

The limitation (mouse jumps) is negligible I think.

I made some slight modifications to your script for my personal use. Very Happy
(comments, indentation, ...)

Code:
  Gui, Add, Picture,, %A_WinDir%\winnt.bmp
  Gui, Add, Text,, www.test.com
  Gui, Add, Text, cBlue gMyLink vURL_MyLink, www.google.com
  Gui, Font, norm
  Gui, Add, Text, cGreen gMyMail, someone@place.com
  Gui, Font, norm
  Gui, Add, Text, cRed, www.hello.com
  Gui, Show,, URL Workaround
 
  ; Retrieve scripts PID
  Process, Exist
  pid_this := ErrorLevel
 
  ; Retrieve unique ID number (HWND/handle)
  WinGet, hw_gui, ID, ahk_class AutoHotkeyGUI ahk_pid %pid_this%
 
  ; Call "HandleMessage" when script receives WM_SETCURSOR message
  WM_SETCURSOR = 0x20
  OnMessage( WM_SETCURSOR, "HandleMessage" )
 
  ; Call "HandleMessage" when script receives WM_MOUSEMOVE message
  WM_MOUSEMOVE = 0x200
  OnMessage( WM_MOUSEMOVE, "HandleMessage" )
Return

GuiClose:
  ExitApp
;###############################################################################
;######## End of GUI ###########################################################
;###############################################################################


;###############################################################################
;######## GUI glabels ##########################################################
;###############################################################################
MyLink:
   MsgBox, MyLink
return

MyMail:
   MsgBox, MyMail
return
;###############################################################################
;######## End Of GUI glabels ###################################################
;###############################################################################


;###############################################################################
;######## Hotkeys ###############################################################
;###############################################################################
F10::
  CoordMode, Mouse, Screen
  MouseMove, 5, 5, 0
Return

F11::
  Reload
Return

F12::
  ExitApp
;###############################################################################
;######## End of Hotkeys ######################################################
;###############################################################################


;###############################################################################
;######## Functions ############################################################
;###############################################################################
HandleMessage( p_w, p_l, p_m, p_hw )
  {
     global   WM_SETCURSOR, WM_MOUSEMOVE
     static   URL_hover, h_old_cursor
     
     If ( p_m = WM_SETCURSOR )
       {
          Return, true
       }
     Else If (p_m = WM_MOUSEMOVE)
       {
          ; Mouse cursor hovers URL text control
          If (A_GuiControl = "URL_MyLink")
            {
               If URL_hover =
                 {
                    ; Underline URL Text control during hover
                    Gui, Font, cBlue underline
                    GuiControl, Font, URL_MyLink
                   
                    h_cursor_hand := DllCall("LoadCursor", "uint", 0, "uint", 32649)
                   
                    h_old_cursor := DllCall("SetCursor", "uint", h_cursor_hand)
                   
                    URL_hover := true
                 }
            }
          ; Mouse cursor doesn't hover URL text control
          Else
            {
               If URL_hover
                 {
                    Gui, Font, norm cBlue
                    GuiControl, Font, URL_MyLink
                   
                    DllCall("SetCursor", "uint", h_old_cursor)
                   
                    URL_hover =
                 }
            }
       }
  }
;###############################################################################
;######## End Of Functions #####################################################
;###############################################################################
Back to top
shimanov



Joined: 25 Sep 2005
Posts: 610

PostPosted: Wed Nov 09, 2005 8:23 pm    Post subject: Reply with quote

AGU wrote:
works great.


Nearly so.

AGU wrote:
When the GUI is created and the mouse cursor is not within the new window at startup, the mouse cursor is an hourglass (IDC_WAIT?) when entering the GUI.
...
Another thing I recognized. Sometimes the mousecursor changes back to the arrow cursor when moving over the URL text control.
...
The limitation (mouse jumps) is negligible I think.


This modified HandleMessage should overcome all the issues and limitations mentioned:

Code:

HandleMessage( p_w, p_l, p_m, p_hw )
{
   global   WM_SETCURSOR, WM_MOUSEMOVE
   static   URL_hover, h_cursor_hand, h_old_cursor
   
   if ( p_m = WM_SETCURSOR )
   {
      if ( URL_hover)
         return, true
   }
   else if ( p_m = WM_MOUSEMOVE )
   {
      if ( A_GuiControl = "URL_MyLink" )
      {
         if URL_hover=
         {
            Gui, Font, cBlue underline
            GuiControl, Font, URL_MyLink
            
            h_cursor_hand := DllCall( "LoadCursor", "uint", 0, "uint", 32649 )
            
            URL_hover := true
         }
         
         h_old_cursor := DllCall( "SetCursor", "uint", h_cursor_hand )
      }
      else
      {
         if ( URL_hover )
         {
            Gui, Font, norm cBlue
            GuiControl, Font, URL_MyLink
            
            DllCall( "SetCursor", "uint", h_old_cursor )
            
            URL_hover=
         }
      }
   }
}


AGU wrote:
I made some slight modifications to your script for my personal use. Very Happy
(comments, indentation, ...)


Well, it seems you understand the code. I am sure you will be able to adjust it to suit your needs.
Back to top
View user's profile Send private message
Guest






PostPosted: Thu Nov 10, 2005 1:02 am    Post subject: Reply with quote

Works perfect now. Thanks a lot for your help with this problem.
But also a big "thank you" for your work in this forum. Your code examples and solutions, tips, ... are a big benefit to this community. Very Happy

Wanted to say this quite some times now.

Quote:
Well, it seems you understand the code.
I would say "nearly". One thing I don't understand are these four parameters of "HandleMessage"
Where do they come from. I just see p_m is used within the function. I assume it means p = parameter m = message. But what about the other ones (p_w, p_l and p_hw)? What is done with these or where have they been passed to "HandleMessage?
Is this complicated windows inner life? Wink

Nevertheless your code and many of your similar examples made me understand that Message thing a little bit better. Thx for this too.

Cheers
AGU a.k.a AGermanUser
Back to top
shimanov



Joined: 25 Sep 2005
Posts: 610

PostPosted: Thu Nov 10, 2005 3:14 am    Post subject: Reply with quote

Anonymous wrote:
Works perfect now. Thanks a lot for your help with this problem.
But also a big "thank you" for your work in this forum. Your code examples and solutions, tips, ... are a big benefit to this community. Very Happy

Wanted to say this quite some times now.


Another happy customer... I am glad I was able to help.

Anonymous wrote:
One thing I don't understand are these four parameters of "HandleMessage"


Start by reviewing OnMessage and SendMessage (which is complementary) in the help file..

Anonymous wrote:
Is this complicated windows inner life? Wink


Absolutely. But only because you're unfamiliar with it.
Back to top
View user's profile Send private message
froz
Guest





PostPosted: Sat Feb 17, 2007 5:08 am    Post subject: Reply with quote

How about multiple hyperlinks in a GUI? I am creating an autorun app for a CD-ROM. Is it possible to modify the function so that it can be reused without modifying the code?

Also as I place the hyperlinks over an image, the hover effect works but when it hovers it has a black border around the hover text (The hover color is red).

Code:

#NoTrayIcon
#NoEnv
#SingleInstance force

BackColor = 000000
TextColor = 0000FF
HoverColor = FF0000

FontSize = 18
isBold = Bold
FontFace = Tahoma

WindowTitle = Window Title
CmdCount = 8

Link1 = File 1
Cmd1 = 001.avi
Link2 = File 2
Cmd2 = 002.avi
Link3 =
Cmd3 =
Link4 =
Cmd4 =
Link5 =
Cmd5 =
Link6 =
Cmd6 =
Link7 = Install Video Decoder
Cmd7 = ffdshow.exe

Link8 = Exit

OnExit, GuiClose

Gui, Margin, 0, 0
Gui, Color, %BackColor%, %BackColor%
Gui, Font, s%FontSize% %isBold% c%TextColor% BackgroundTrans, %FontFace%
Gui, Add, Pic, w550 h60 guiMove, title.bmp
Gui, Add, Pic, w550 h340, bg.bmp
;Gui, -MaximizeBox
Gui, -Caption
Gosub Labelinit
Gui, Show,, %WindowTitle%

Gosub HoverInit

return

cmmd1:
if %Cmd1%
Run %Cmd1%
return
cmmd2:
if %Cmd2%
Run %Cmd2%
return
cmmd3:
if %Cmd3%
Run %Cmd3%
return
cmmd4:
if %Cmd4%
Run %Cmd4%
return
cmmd5:
if %Cmd5%
Run %Cmd5%
return
cmmd6:
if %Cmd6%
Run %Cmd6%
return
cmmd7:
if %Cmd7%
Run %Cmd7%
return
cmmd8:
ExitApp
return

Labelinit:
Loop %CmdCount%
{
LabelText := Link%A_Index%
LabelTop := 55 + A_Index * 35
if LabelText <>
Gui, Add, Text, x20 y%LabelTop% vLink%A_Index% gcmmd%A_Index% BackgroundTrans, %LabelText%
}
return

GuiClose:
ExitApp

uiMove:
PostMessage, 0xA1, 2,,, A
return

HoverInit:
  ; Retrieve scripts PID
  Process, Exist
  pid_this := ErrorLevel
 
  ; Retrieve unique ID number (HWND/handle)
  WinGet, hw_gui, ID, ahk_class AutoHotkeyGUI ahk_pid %pid_this%
 
  ; Call "HandleMessage" when script receives WM_SETCURSOR message
  WM_SETCURSOR = 0x20
  OnMessage(WM_SETCURSOR, "HandleMessage")
 
  ; Call "HandleMessage" when script receives WM_MOUSEMOVE message
  WM_MOUSEMOVE = 0x200
  OnMessage(WM_MOUSEMOVE, "HandleMessage")
Return

;######## Function #############################################################
HandleMessage(p_w, p_l, p_m, p_hw)
  {
    global   WM_SETCURSOR, WM_MOUSEMOVE, TextColor, HoverColor, CmdCount
    static   URL_hover, h_cursor_hand, h_old_cursor, PrevLinkNum
   
    If (p_m = WM_SETCURSOR)
      {
        If URL_hover
          Return, true
      }
    Else If (p_m = WM_MOUSEMOVE)
      {
        ; Mouse cursor hovers URL text control
        If RegExMatch(A_GuiControl, "Link")
          {
            StringRight, LinkNum, A_GuiControl, 1

            If URL_hover=
              {
                Gui, Font, c%HoverColor% %isBold%
                GuiControl, Font, Link%LinkNum%
                h_cursor_hand := DllCall("LoadCursor", "uint", 0, "uint", 32649)
                URL_hover := true
              }                 
              h_old_cursor := DllCall("SetCursor", "uint", h_cursor_hand)
          }
        ; Mouse cursor doesn't hover URL text control
        Else
          {
            If URL_hover
              {
                Gui, Font, c%TextColor% %isBold% BackgroundTrans
                Loop %CmdCount%
                {
                GuiControl, Font, Link%A_Index%
                }
                DllCall("SetCursor", "uint", h_old_cursor)
               
                URL_hover=
              }
          }
      }
  }
;######## End Of Functions #####################################################
Back to top
froz
Guest





PostPosted: Sat Feb 17, 2007 5:55 am    Post subject: Reply with quote

I come up with a method to solve the problem of broken text after hover:

Code:

;hide the text
                GuiControl, Hide, Link%LinkNum%
;change the text color
                Gui, Font, c%HoverColor% %isBold%
;apply the format to the text
                GuiControl, Font, Link%LinkNum%
;show the text control again (so it will force it to redraw the control) and it is so quick that the hide-show sequence cannot be noticed :)
                GuiControl, Show, Link%LinkNum%

Back to top
MiamiGuy



Joined: 03 Nov 2006
Posts: 61
Location: Miami

PostPosted: Mon Feb 19, 2007 2:11 am    Post subject: Reply with quote

This post is great.

As froz mentioned "How about multiple hyperlinks in a GUI?"

I was wondering how I would go about doing that?

In my case, I am working on a simple GUI, with 4 links. The links rather than take you to a web site actualy launch 4 different programs. Using the code mentioned above I can have one of the lines become underlined and the cursor to change to the hand when you hover over it, but I cant figure out for the life of me how to get the other 3 to do the same.

Any Suggestions?
Back to top
View user's profile Send private message Send e-mail Yahoo Messenger MSN Messenger
Display posts from previous:   
Reply to topic    AutoHotkey Community Forum Index -> Ask for Help All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You can post new topics in this forum
You can reply to topics in this forum


Powered by phpBB © 2001, 2005 phpBB Group