Creating Keyboard Event Functions
You can create custom functions to handle keyboard events in a graphics WINDOW or in a WIDGET_WINDOW. These functions must use the syntax described below.
Each function must return a value of 0 to turn off default event handling or 1 to perform default event handling.
Tip: Instead of creating a separate function for each event handler, you may find it convenient to use a custom event handling class along with the EVENT_HANDLER property. See Creating an Event Handler Class to Control Events for details on how to write this object class.
Syntax
Result = FUNCTION_NAME(Window, IsASCII, Character, KeyValue, X, Y, Press, Release, KeyMods)
Where FUNCTION_NAME is a unique name for the function, which will be called from one of the keyboard event handling keywords of WINDOW or WIDGET_WINDOW. Avoid using generic names such as "KeyboardHandler" to prevent name collisions with other applications using event handlers.
Arguments
Window
The object reference of the window in which a keyboard event happened.
IsASCII
A scalar byte value that indicates whether the keyboard event corresponds to an ASCII character. If IsASCII is non-zero, the Character argument will be set to a byte value corresponding to the character of the pressed key. If IsASCII is zero, the KeySymbol argument will be set to a numeric value indicating the key that was pressed.
Character
If IsASCII is non-zero, this argument is set to a byte value corresponding to the ASCII character of the key that was pressed. Otherwise, this argument is set to zero.
KeyValue
If IsASCII is zero, this argument is set to a value that indicates the key that was pressed. Otherwise, this argument is set to zero. Possible values are:
Value |
Key |
---|---|
1 |
Shift |
2 |
Control |
3 |
Caps lock |
4 |
Alt |
5 |
Left |
6 |
Right |
7 |
Up |
8 |
Down |
9 |
Page up |
10 |
Page down |
11 |
Home |
12 |
End |
Note: On East Asian (Chinese, Japanese, Korean) localized Windows operating systems with an Asian language pack installed, characters entered in the Windows Input Method Manager (IMM)composition window are returned in the the KeyValue argument as unsigned integers representing a Wide character (Unicode value). The I18N_WIDECHARTOMULTIBYTE routine can convert these characters to multibyte strings. For more information, see Internationalizing Code.
X
The position to the right of the lower left corner of the drawable area, in device coordinates (pixels).
Y
The position above the lower left corner of the drawable area, in device coordinates (pixels).
Press
The value indicating that this event represents a key press. This argument is non-zero if the event is the result of pressing the key.
Release
The value indicating that this event represents a key release. This argument is non-zero if the event is the result of releasing the key.
KeyMods
The value containing a bitwise mask indicating which modifier keys are active at the time of the keyboard event. If a bit is zero, the key is up; if the bit is set, the key is pressed. The following table describes the bits in this bit mask. Possible values are:
Value |
Modifier Key |
1 |
Shift |
2 |
Control |
4 |
Caps lock |
8 |
Alt |
Example
In the following example code, the KeyboardEventsTestHandler function creates graphic element selections based on the keyboard character that is typed. Copy this code into a new IDL file and compile it. The example below this one is a test that you can run to see these selections work.
FUNCTION KeyboardEventsTestHandler, Window, $
IsASCII, Character, KeyValue, X, Y, Press, Release, KeyMods
print, 'KeyboardHandler'
help, Window, $
IsASCII, Character, KeyValue, X, Y, Press, Release, KeyMods
IF Release then return, 1
graphics = Window.uValue
graphics[0].select, /clear
FOREACH graphic, graphics do begin
CASE string(character) OF
't': if ISA(graphic, 'TEXT') then graphic.select, /ADD
'c': if ISA(graphic, 'ELLIPSE') then graphic.select, /ADD
'l': if ISA(graphic, 'POLYLINE') then graphic.select, /ADD
'p': if ISA(graphic, 'POLYGON') then graphic.select, /ADD
ELSE:
ENDCASE
ENDFOREACH
Window.refresh
RETURN, 0 ; Skip default event handling
END
Keyboard Character Selection Example
Run the following code example to test the event handling functions defined in the previous code example.
PRO KeyboardEventsTest
window = window()
text1=text(.2, .95, 'Type t to select text, c for circles, p for polygons, l for lines')
text2=text(.5, .8, 'Text 1')
text3=text(.5, .65, 'Text 2')
circle = ELLIPSE(500, 150, MAJOR=50, /device, $
FILL_COLOR="yellow")
x = indgen(200)+225
y = SIN(2.0*FINDGEN(200)*!PI/25.0)*EXP(-0.02*FINDGEN(200))*100 + 150
polygon = POLYGON(x, y, /device, $
/FILL_BACKGROUND, FILL_COLOR=!COLOR.LIGHT_STEEL_BLUE)
x = [100, 200, 200, 100, 100]
y = [100, 100, 200, 200, 100]
line = POLYLINE(x, y, /DEVICE)
window.uValue = [text1, text2, text3, circle, polygon, line]
window.KEYBOARD_HANDLER='KeyboardEventsTestHandler'
END