Shift-click, alt-click, ctrl-click

Started by stevengraff, January 21, 2014, 03:48:52 PM

Previous topic - Next topic

stevengraff

Is it possible to make any of these combo-click events "meaningful" in WinBatch? (I'm trying to create an easter egg in my app :) )

Deana

WinBatch Dialogs may not broadly capture mouse clicks or keystrokes, however you could do something like, create a hidden context menu that contains the accelerator Ctrl+Alt+0 that can be your Easter egg.

The code might look something like this:

Code (winbatch) Select
#DefineSubRoutine InitDialogConstants()
   ;DialogProcOptions Constants
   MSG_INIT=0                    ; The one-time initialization
   MSG_TIMER=1                   ; Timer event
   MSG_BUTTONPUSHED=2            ; Pushbutton or Picturebutton
   MSG_RADIOPUSHED=3             ; Radiobutton clicked
   MSG_CHECKBOX=4                ; Checkbox clicked
   MSG_EDITBOX=5                 ; Editbox or Multilinebox
   MSG_FILESELECT=6              ; Filelistbox
   MSG_ITEMSELECT=7              ; Itembox
   MSG_COMBOCHANGE=8             ; Combobox/Droplistbox
   MSG_CALENDAR=9                ; Calendar date change
   MSG_SPINNER=10                ; Spinner number change
   MSG_CLOSEVIA49=11             ; Close clicked (Enabled via DialogProcOptions 1002
   MSG_FILEBOXDOUBLECLICK=12     ; Get double-click message on a FileListBox
   MSG_ITEMBOXDOUBLECLICK=13     ; Get double-click message on an ItemBox
   MSG_COMEVENT=14               ; COMCONTROL Event notification from DialogObject (NOT DialogProcOptions)
   MSG_MENUITEM=15               ; MenuItem selected
   MSG_MENUITEMINIT=16           ; MenuItem initialized
   MSG_RESIZE=17                 ; Dialog resized
   MSG_RVITEMSELROW=18           ; Reportview item select row
   MSG_RVDBLCLICKROW=19          ; Reportview double-click row
   MSG_RVCHECKEDITEM=20          ; Reportview checked/unchecked Item
   MSG_RVITEMTEXT=21             ; Reportview changed text of first column
   MSG_RVHEADER=22               ; Reportview header clicked

   DPO_DISABLESTATE=1000         ; codes -1=GetSetting 0=EnableDialog 1=DisableDialog
   DPO_CHANGEBACKGROUND=1001     ; -1=Get Current otherwise bitmap or color string
   DPO_CHANGESYSMENU=1002        ; -1=Get Current 0=none 1=close 2=close/min 3=close/max 4=close/min/max
   DPO_CHANGETITLE=1003          ; Set/Get Dialog Title - (-1 to get)
   DPO_GETNAME=1004              ; Returns the name associated with a control's number.
   DPO_GETNUMBER=1005            ; Returns the number associated with a control's name.
   DPO_GETCLIENTAREA=1007        ; Returns a space delimited list of the width and height of the client area.

   ;DialogControlState Constants
   DCSTATE_SETFOCUS=1            ; Give Control Focus
   DCSTATE_QUERYSTYLE=2          ; Query control's style
   DCSTATE_ADDSTYLE=3            ; Add control style
   DCSTATE_REMOVESTYLE=4         ; Remove control style
   DCSTATE_GETFOCUS=5            ; Get control that has focus
   DCSTATE_MOVEMOUSEOVER=6       ; Move the mouse over the control

   DCSTYLE_DEFAULT=0             ; Set Default Style
   DCSTYLE_INVISIBLE=1           ; Set Control Invisible
   DCSTYLE_DISABLED=2            ; Set Control Disabled
   DCSTYLE_NOUSERDATA=4          ; Note: Setable via DialogControlState function ONLY SPINNER control only
   DCSTYLE_READONLY=8            ; Sets control to read-only (user cannot type in data) EDITBOX MULTILINEBOX SPINNER
   DCSTYLE_PASSWORD=16           ; Sets 'password mode' where only *'s are displayed EDITBOX
   DCSTYLE_DEFAULTBUTTON=32      ; Sets a button as the default button PUSHBUTTON PICTUREBUTTON
   DCSTYLE_DIGITSONLY=64         ; Set edit box to accept digits only EDITMOX MULTILINEBOX
   DCSTYLE_FLAT=128              ; Makes a 'flat' hyperlink-looking button PUSHBUTTON PICTUREBUTTON
   DCSTYLE_NOADJUST=256          ; Turns off auto-height adjustment  ITEMBOX FILELISTBOX
   DCSTYLE_TEXTCENTER=512        ; Center text in control VARYTEXT STATICTEXT
   DCSTYLE_TEXTRIGHT=1024        ; Flush-Right text in control VARYTEXT STATICTEXT
   DCSTYLE_NOSELCURLEFT=2048     ; No selection, cursor left EDITBOX MULTILINEBOX
   DCSTYLE_NOSELCURRIGHT=4096    ; No selection, cursor right EDITBOX MULTILINEBOX
   DCSTYLE_SHIELD=8192           ; Display Security Shield icon on button (Vista only) PUSHBUTTON PICTUREBUTTON
   DCSTYLE_MENUCHECK=32768       ; Adds a check mark to the left of a menu item MENUITEM
   DCSTYLE_MENURADIO=65536       ; Adds a radio button like dot graphic to the left of a menu item MENUITEM
   DCSTYLE_MENUSEP=131072        ; Separator bar graphic MENUITEM
   DCSTYLE_MENUBREAK=262144      ; Column break MENUBAR
   DCSTYLE_NOHEADER=524288       ; No header bar REPORTVIEW
   DCSTYLE_COLHEADER=1048576     ; First row column header REPORTVIEW
   DCSTYLE_GRIDLINES=2097152     ; Grid lines REPORTVIEW
   DCSTYLE_SELONEROW=4194304     ; Only one row can be selected at a time REPORTVIEW
   DCSTYLE_SELALLROW = 8388608   ; Highlight complete row REPORTVIEW
   DCSTYLE_SORTASC=16777216      ; Ascending sort REPORTVIEW
   DCSTYLE_SORTDESC=33554432     ; Descending sort REPORTVIEW
   DCSTYLE_EDITCOL=67108864      ; Edit first columns text REPORTVIEW
   DCSTYLE_COLCHECKBOX=134217728 ; Add checkbox to first column REPORTVIEW
   DCSTYLE_INSHEADER=268435456   ; Include column header text REPORTVIEW

   ;DialogControlSet / DialogControlGet Constants
   DC_CHECKBOX=1             ; CHECKBOX REPORTVIEW
   DC_RADIOBUTTON=2          ; RADIOBUTTON
   DC_EDITBOX=3              ; EDITBOX MULTILINEBOX
   DC_TITLE=4                ; PICTURE RADIOBUTTON CHECKBOX PICTUREBUTTON VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON MENUITEM
   DC_ITEMBOXCONTENTS=5      ; ITEMBOX FILELISTBOX DROPLISTBOX REPORTVIEW
   DC_ITEMBOXSELECT=6        ; ITEMBOX FILELISTBOX DROPLISTBOX REPORTVIEW
   DC_CALENDAR=7             ; CALENDAR
   DC_SPINNER=8              ; SPINNER
   DC_MULTITABSTOPS=9        ; MULTILINEBOX
   DC_ITEMSCROLLPOS=10       ; ITEMBOX FILELISTBOX
   DC_BACKGROUNDCOLOR=11     ; RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FILELISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX REPORTVIEW
   DC_PICTUREBITMAP=12       ; PICTURE PICTUREBUTTON
   DC_TEXTCOLOR=13           ; RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FILELISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX REPORTVIEW
   DC_ITEMBOXADD=14          ; ITEMBOX FILELISTBOX DROPLISTBOX REPORTVIEW
   DC_ITEMBOXREMOVE=15       ; ITEMBOX FILELISTBOX DROPLISTBOX REPORTVIEW
   DC_RADIOVALUE=16          ; RADIOBUTTON
   DC_POSITION=17            ; ALL CONTROLS (Except MENUBAR and MENUITEM)
   DC_MENUNAMES=18           ; ALL CONTROLS
   DC_HANDLE=19              ; ALL CONTROLS (Except MENUBAR and MENUITEM)
   DC_RVCOLHEAD=20           ; REPORTVIEW
   DC_RVCOLWIDTH=21          ; REPORTVIEW
   DC_RVADDCOL=22            ; REPORTVIEW
   DC_RVREMOVECOL=23         ; REPORTVIEW
   DC_RVMATCHCOL=24          ; REPORTVIEW
   DC_RVCANCELEDIT=25        ; REPORTVIEW
   DC_RVCHECKEDROWS=26       ; REPORTVIEW
   DC_RVJUSTIFY=27           ; REPORTVIEW


   ;DialogObject constants
   DLGOBJECT_ADDEVENT=1      ; Call dialog callback when the specified event occurs
   DLGOBJECT_STOPEVENT=2     ; Stop calling dialog callback when an event previously requested with
   DLGOBJECT_GETOBJECT=3     ; Return an object references to the specified control
   DLGOBJECT_GETPICTURE=4    ; Create and return an object reference to a picture object

   ;Return code constants
   RET_DO_CANCEL=0           ; Cancels dialog
   RET_DO_DEFAULT= -1        ; Continue with default processing for control
   RET_DO_NOT_EXIT= -2       ; Do not exit the dialog
   return
#EndSubroutine
;============================================================
;============================================================
;============================================================


#DefineFunction MyDialogCallbackProc(MyDialog_Handle,MyDialog_Message,MyDialog_Name,MyDialog_EventInfo,MyDialog_ChangeInfo)
    InitDialogConstants()                                   ; Initialize Dialog Constants
   ON_EQUAL = @TRUE                                         ; Initialize variable ON_EQUAL
   switch MyDialog_Message                                  ; Switch based on Dialog Message type
      case MSG_INIT                                         ; Standard Initialization message
;         DialogProcOptions(MyDialog_Handle,MSG_TIMER,1000)
         DialogProcOptions(MyDialog_Handle,MSG_BUTTONPUSHED,@TRUE)
;         DialogProcOptions(MyDialog_Handle,MSG_COMBOCHANGE,@TRUE)
         DialogProcOptions(MyDialog_Handle,MSG_MENUITEM,@TRUE)
;         DialogProcOptions(MyDialog_Handle,MSG_MENUITEMINIT,@TRUE)
         return(RET_DO_DEFAULT)

     case MSG_BUTTONPUSHED
        if MyDialog_Name == "PushButton_OK"                ; OK
              return(RET_DO_DEFAULT)

        elseif MyDialog_Name == "PushButton_Cancel"        ; Cancel
              return(RET_DO_DEFAULT)

        elseif MyDialog_Name == "PushButton_Fill"             ; Fill

              DialogControlSet( MyDialog_Handle, "DropListBox_1", DC_ITEMBOXCONTENTS, "1":@tab:"2":@tab:"3" )
              DialogControlSet( MyDialog_Handle, "DropListBox_1", DC_ITEMBOXSELECT, "1" )
              return(RET_DO_NOT_EXIT)

        endif                                              ; MyDialog_Name
        return(RET_DO_DEFAULT)


     case MSG_MENUITEM                                     ; ID "cmi1_MyDialog"  Sample \^!0 (Ctrl+Alt+0)
        Pause("","Easter Egg")
        return(RET_DO_DEFAULT)

   endswitch                                                ; MyDialog_Message
   return(RET_DO_DEFAULT)
#EndFunction                                                ; End of Dialog Callback MyDialogCallbackProc

;============================================================
;============================================================
;============================================================



MyDialogFormat=`WWWDLGED,6.2`

MyDialogCaption=`Acellerator Easter Egg`
MyDialogX=002
MyDialogY=059
MyDialogWidth=540
MyDialogHeight=257
MyDialogNumControls=005
MyDialogProcedure=`MyDialogCallbackProc`
MyDialogFont=`DEFAULT`
MyDialogTextColor=`DEFAULT`
MyDialogBackground=`DEFAULT,DEFAULT`
MyDialogConfig=0

MyDialog001=`155,201,036,012,PUSHBUTTON,"PushButton_OK",DEFAULT,"OK",1,10,32,DEFAULT,DEFAULT,DEFAULT`
MyDialog002=`301,203,036,012,PUSHBUTTON,"PushButton_Cancel",DEFAULT,"Cancel",0,20,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog003=`099,057,288,080,DROPLISTBOX,"DropListBox_1",dlVariable1,"Select button to fill",DEFAULT,30,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog004=`000,000,000,000,MENUITEM,"cmi1_MyDialog",DEFAULT,"Sample \^!0",DEFAULT,10,1`
MyDialog005=`395,057,036,012,PUSHBUTTON,"PushButton_Fill",DEFAULT,"Fill",2,50,DEFAULT,DEFAULT,DEFAULT,DEFAULT`

ButtonPushed=Dialog("MyDialog")





Deana F.
Technical Support
Wilson WindowWare Inc.

stevengraff


kdmoyers

Deana,

could this method be used to react to general keystrokes?  Like Escape key or PageUp or whatever?

if not, any chance you could find the old request for "general keystroke trap events" in the idea pile and move it nearer to the top?

I've got a work around using Autohotkey, but it's a horrible kluge.  Using WaitForKey on a timer event isn't much prettier.

$0.02,
-Kirby
The mind is everything; What you think, you become.

Deana

Quote from: kdmoyers on January 22, 2014, 12:32:10 PM
Deana,

could this method be used to react to general keystrokes?  Like Escape key or PageUp or whatever?

if not, any chance you could find the old request for "general keystroke trap events" in the idea pile and move it nearer to the top?

I've got a work around using Autohotkey, but it's a horrible kluge.  Using WaitForKey on a timer event isn't much prettier.

$0.02,
-Kirby

Kirby,
No this would definitely NOT be a method to trap general keystrokes. Can you give me a specific example of your expectations. I will be happy to pass on the specific request to our developers.

Deana F.
Technical Support
Wilson WindowWare Inc.

kdmoyers

Quote from: Deana on January 22, 2014, 12:43:03 PM
Can you give me a specific example of your expectations. I will be happy to pass on the specific request to our developers.

Well, from the Dialog function's point of view, I'm imagining a dialog definition line like:

MyDialog003=`000,000,000,000,KEYEVENT,"Roger",DEFAULT,"{ESCAPE}",DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
which makes an event for someone pressing the escape key.  the "control" for this event is named "Roger".

There would be a new event type for this, maybe number 17 "MSG_KEYEVENT"

There would need to be some UI for this in the dialog editor, similar to, but simpler than, the UI for the menu events.

The syntax for the key specification would be the same syntax as is used in the WaitForKey function.

The key would get recognized any time the dialog is the active window.  It would not be recognized of the dialog was not the active window.

That's my idea anyway.  you guys usually do things better than I imagine.

$0.02
-Kirby
The mind is everything; What you think, you become.

td

You more or less have most of that functionality with invisible context menus.  There are a few things you need to watch out for but they become fairly obvious when you test a given menu accelerator key and can often can be scripted around in the dialog's UDC procedure. 
"No one who sees a peregrine falcon fly can ever forget the beauty and thrill of that flight."
  - Dr. Tom Cade

kdmoyers

Wow. I had always thought the "accelerator" had to be ALT-someletter .  If I can make it keys like Home, End, etc them I'm good!  Tinkering commencing! Thanks Tony
The mind is everything; What you think, you become.

td

You are likely thinking of menu mnemonic keys.  Mnemonics keys are the underlined letters you see in menu names when you press the Alt key when an application with a menu bar has the input focus.   Mnemonic keys and menu accelerator keys have different internal implementations and different behavioral characteristics.
"No one who sees a peregrine falcon fly can ever forget the beauty and thrill of that flight."
  - Dr. Tom Cade

Deana

Quote from: kdmoyers on January 26, 2014, 06:36:27 AM
Wow. I had always thought the "accelerator" had to be ALT-someletter .  If I can make it keys like Home, End, etc them I'm good!  Tinkering commencing! Thanks Tony

You can associate a shortcut key with a MENUITEM in the TEXT attribute by following the item's text with a back slash (\) and a key combination.  The key combination is indicated by using the same key descriptions use with the SendKey function.

For example here is a hidden context menu item with a shortcut key accelerator {HOME}:
Code (winbatch) Select
MyDialog004=`000,000,000,000,MENUITEM,"cmi1_MyDialog",DEFAULT,"Sample \{HOME}",DEFAULT,10,1`
Deana F.
Technical Support
Wilson WindowWare Inc.

td

One thing to consider when using accelerator keys to capture key strokes is that all menu accelerators keys are global to the application. 

This means that a context menu accelerator key can be associated with either the dialog or any control in the dialog and the key press will be passed to a UDC procedure even if the associated control does not have the focus. 

This also means that the control name passed to the UDC when a accelerator key is pressed may not be the control with the input focus.  So, if you need to know the control with the focus when the key was pressed, you will need to call the DialogControlState function  to obtain that bit of info.
"No one who sees a peregrine falcon fly can ever forget the beauty and thrill of that flight."
  - Dr. Tom Cade

kdmoyers

Ah. Good bits to know.  Thanks guys!!
The mind is everything; What you think, you become.

td

Forgive the belated post but I realized that I never explained one of the reasons the global nature of accelerator keys is important. The problem with using global accelerator keys is that they can rob controls of some of their functionality.   For example, the 'home' key is normally processed by an edit control to place the caret at the beginning of the text line when the control has the focus.  If you map the 'home' key to a dialog accelerator, the edit control will never receive that key stroke and move the edit caret to the beginning of the text line.  If you want the home key to still have the default behavior when the edit control has the focus, you would need to detect that the edit control has the focus when the 'home' key accelerator is pressed.

Admittedly, this may not be an issue depending on what you intend to use the accelerator for but many controls give keys special meaning when they have the focus and it is something that should be kept in mind when using accelerators. If you don't, you can end up with a dialog that doesn't play nice with your user's expectations.
"No one who sees a peregrine falcon fly can ever forget the beauty and thrill of that flight."
  - Dr. Tom Cade

stevengraff

and the MENUITEM control was introduced when?

Deana

The MenuItem Controls were introduced in back in October of 2009 (WinBatch version 2009C):  http://www.winbatch.com/winbatchversions.html#WB2009C
Deana F.
Technical Support
Wilson WindowWare Inc.