In this tutorial, I go over how to simulate a Graphical Button in a GUI, using methods first shown by SKAN, plus what he calls the Mobile Phone Power Switch (MPPS) technique. It is an advanced type of MPPS button that simulates a Mouse Hook. The code sample given herein below may not work on the systems running a lower version of Windows. Apart from the MPPS type clicking, we will use two control styles – flat and sunken to generate the simulated button effect.
This tutorial has been divided into two parts, as listed below:
- Using images to generate the simulate effect on a button
- Using MPPS effect when we click our button
Let us see how these two parts can be implemented.
Using images to generate the simulate effect on a button
A button has two states. One is On and the second is Off. When someone clicks a button, it looks projected like a 3D button – this state is called the ON state of a button. And, when the mouse is released, the button comes back to the sunken state – this is called the off state of a button.
To create these states, we need two images that are identical so that we can give them the simulate effect using control styles. So, we can either do this with a projected button and a sunken button, or we can do this task with a Flat button and a sunken button. In this tutorial, our attempt is to work with a Flat and a sunken button.
Code for Flat and Sunken Button
Gui, -Sysmenu +Toolwindow Gui, Add , Picture, x10 y10 w42 h42 E0x200 vState1 icon1, %A_AhkPath% Gui, Add , Picture, x+10 y10 w45 h45 Border vState0 icon1, %A_AhkPath% Gui, Add, Text , x10 ,E0x200 Border Gui, Show, x50 y50, Style Options Return GuiEscape: ExitApp Return
In the above code,
- A border has been created around the flat button to make it look different from the sunken button.
- The sunken button has been extended using E0x200 so that there is a simulate effect on the mouse click.
- Flat button has +3 size than the sunken button, whereas the size of the button is 42 x 42.
Extending the above code to simulate the graphical button
Gui, +Sysmenu +ToolWindow Gui, Add , Picture, x10 y10 w45 h45 E0x200 vState1 icon1 gSR1, %A_AhkPath% Gui, Add , Picture, x10 y10 w42 h42 0x400000 vState0 icon1 gSR1, %A_AhkPath% Gui, Show, x50 y50, Button Return SR1: GuiControl, Hide, State0 Sleep 250 GuiControl, Show, State0 Msgbox, < code we have written using MPPS below will go here Return GuiEscape: GuiClose: ExitApp Return
In the above code,
- 0x400000 has been to showcase the button as projected on mouse press.
- SR1 is the label in which the code of MPPS will be called and executed.
So, in this part, we have seen how to use images to generate the simulate effect. Let us go ahead and see how MPPS works in coordination with the above code.
Using MPPS type button
In this part, you will see how the mouse press is detected on the image for a specific duration.
Gui, +Sysmenu +ToolWindow +AlwaysOnTop Gui, Add , Picture, x10 y10 w32 h32 E0x200 vState1 icon1 gMPPS_Type_Button, %A_AhkPath% Gui, Add , Picture, x10 y10 w34 h34 Border vState0 icon1 gMPPS_Type_Button, %A_AhkPath% Gui, Show, x50 y5, MPPS type Return MPPS_Type_Button: GuiControl Hide, State0 TC := A_TickCount Loop, { MouseDown:=GetKeyState("LButton","P") If (!MouseDown) { LongClick=0 Break } If (A_TickCount-TC) > 1000 { LongClick=1 Break } } GuiControl Show, State0 If (LongClick) GoSub,SR1 Else GoSub, SR0 Return SR1: Msgbox,64, SR1 , Long Click..`n`n This SR may be used to execute a Special task, 10 Return SR0: Msgbox,64, SR0 , Normal Click..`n`n This SR may be used to Toggle a Variable, 10 Return GuiEscape: GuiClose: ExitApp Return
In the above code,
- A normal click on the graphical button will call SR0.
- A long click on the graphical button for more than one second will trigger SR1.
Conclusion
Demonstrated above is just an example,
which is modified a little as per our requirement.
You can make modifications in the above code as per your requirement.
For example, you can increase / decrease the width and height of the buttons, increase or decrease the duration of mouse press, and so on.
Try different parameters and combinations until you see the expected results.
Let me know if you’ve come up with other great ways to do the same!