Jump to content

Mnemonics in Dialog Boxes: Difference between revisions

From EDM2
mNo edit summary
Ak120 (talk | contribs)
 
(4 intermediate revisions by 2 users not shown)
Line 1: Line 1:
Written by [[Stefan Ruck]]
''Written by [[Stefan Ruck]]''


<font COLOR="#669966">[Here is a link to the http://www.edm2.com/0609/mnsrc.zip. Ed.]</font>
[Here is a link to the http://www.edm2.com/0609/mnsrc.zip. Ed.]


We all know them: Mnemonics (I'm glad I just have to write this word and not pronounce it). When we look at menu bars, we can find them almost
We all know them: Mnemonics (I'm glad I just have to write this word and not pronounce it). When we look at menu bars, we can find them almost anywhere. These nice underscored characters which make life easier for those who still use the keyboard instead of the mouse.
anywhere. These nice underscored characters which make life easier for those who still use the keyboard instead of the mouse.


==The Problem==
==The Problem==
Looking at dialog boxes e.g. of IBM's programs, I'm missing mnemonics a lot in conjunction with edit controls and other controls that don't have a text part of their own like radio buttons have.


Looking at dialog boxes e.g. of IBM's programs, I'm missing mnemonics a lot in conjunction with edit controls and other controls that don't have a
Believe me, for a long time I thought it was not possible to use them in static text controls. Just because I hadn't seen it in the OS/2 programs I'm using! Of course I had a look at the docs shipped with the DevCon I CDs. But searching for the keyword 'Mnemonic' only shows some very old stuff about mnemonics in menu bars and something about the use of the Universal Resource Editor (which I'm not using).
text part of their own like radio buttons have.
 
Believe me, for a long time I thought it was not possible to use them in static text controls. Just because I hadn't seen it in the OS/2 programs I'm using! Of course I had a look at the docs shipped with the
DevCon I CDs. But searching for the keyword 'Mnemonic' only shows some very old stuff about mnemonics in menu bars and something about the use of the Universal Resource Editor (which I'm not using).


So I was thinking about writing a class derived from IFrameWindow myself. This class should have the ability of putting mnemonics in static text controls to set the input focus directly e.g. to edit controls just by pressing the right keys, not by using the mouse.
So I was thinking about writing a class derived from IFrameWindow myself. This class should have the ability of putting mnemonics in static text controls to set the input focus directly e.g. to edit controls just by pressing the right keys, not by using the mouse.
Line 19: Line 15:


==What's Needed?==
==What's Needed?==
Before I started writing this class, I thought to myself, why not try to do it the way I know it from Windows programming. There were only two things to think about.


<p>Before I started writing this class, I thought to myself, why not try
First there was the question: How to get a character of a static text control to be underscored?
to do it the way I know it from Windows programming. There were only two
things to think about.
 
<p>First there was the question: How to get a character of a static text
control to be underscored?
 
<p>When you use IBM's dialog editor to design your dialogs, static text
controls do not convert the '~' by default. And because I didn't knew the
meaning of the word 'mnemonic' in the text style page I never tought of
setting this flag. But a short look at the dictionary was very helpful.
(When you use other controls like check boxes or radio button, there is no
mnemonic flag to set to enable mnemonics. Here mnemonics always work.)


<p>So the answer is simple. Just set the DT_MNEMONIC style for the desired
When you use IBM's dialog editor to design your dialogs, static text controls do not convert the '~' by default. And because I didn't knew the meaning of the word 'mnemonic' in the text style page I never thought of setting this flag. But a short look at the dictionary was very helpful. (When you use other controls like check boxes or radio button, there is no mnemonic flag to set to enable mnemonics. Here mnemonics always work.)
control. Using the IBM's dialog editor you just have to check the mnemonic
check box on the text style page of the control.


<p>The second question is: How does the dialog know where to set the
So the answer is simple. Just set the DT_MNEMONIC style for the desired control. Using the IBM's dialog editor you just have to check the mnemonic check box on the text style page of the control.
input focus when the mnemonic of a static text control is being used?


The second question is: How does the dialog know where to set the input focus when the mnemonic of a static text control is being used?


<p>This is similiar to Windows programming (or vice versa). Just take care
This is similar to Windows programming (or vice versa). Just take care with the sequence of the dialog's controls (IBM's dialog editor calls it 'order groups', Microsoft's dialog editor calls it 'tab control'). The text control has to be directly in front of the corresponding control which should receive the input focus when the mnemonic is used. This doesn't mean the position in the dialog box but the sequence in the dialog description (have a look at the sample below).
with the sequence of the dialog's controls (IBM's dialog editor calls it
'order groups', Microsoft's dialog editor calls it 'tab control'). The
text control has to be directly in front of the corresponding control
which should receive the input focus when the mnemonic is used. This
doesn't mean the position in the dialog box but the sequence in the dialog
description (have a look at the sample below).


<p>As you can see, there is no miracle about mnemonics and static text
As you can see, there is no miracle about mnemonics and static text controls. No need to do extra programming, just a little bit of dialog box design.
controls. No need to do extra programming, just a little bit of dialog box
design.


==The Sample==
==The Sample==
[[File:Mnsample.gif]]


<p><img WIDTH=291 HEIGHT=296 SRC="mnsample.gif">
''Figure 1: Sample dialog box.''
 
<p><font SIZE=2>
Figure 1: Sample dialog box.
</font>


<p>The dialog description for the dialog box shown in figure 1 looks like
The dialog description for the dialog box shown in figure 1 looks like this:
this:
<pre>
 
<font COLOR="#0000BB"><font COLOR="#0000BB"><pre>
   DLGTEMPLATE DLG_SAMPLE LOADONCALL MOVEABLE DISCARDABLE
   DLGTEMPLATE DLG_SAMPLE LOADONCALL MOVEABLE DISCARDABLE
   BEGIN
   BEGIN
Line 90: Line 60:
     END
     END
   END
   END
</pre></font></font>
</pre>
 
''Figure 2: Dialog description of the sample dialog box.''
<p><font SIZE=2>
Figure 2: Dialog description of the sample dialog box.
</font>


<p>As you can see, group boxes can also be used for mnemonics. And as said
As you can see, group boxes can also be used for mnemonics. And as said above, it is very important to keep the right sequence among the controls.
above, it is very important to keep the right sequence among the controls.


When 'Alt+E' is pressed in the dialog box shown in figure 1, the edit control receives the input focus, 'Alt+S' gives the slider the input focus and 'Alt+R' sets the input focus to the radio button selected the last time.
When 'Alt+E' is pressed in the dialog box shown in figure 1, the edit control receives the input focus, 'Alt+S' gives the slider the input focus and 'Alt+R' sets the input focus to the radio button selected the last time.


For test purpose, just swap the position of the text control 'Slider' and 'Edit Control' and see what happens. Because the sequence of the controls is very important, you can get funny (just for you, not for the
For test purpose, just swap the position of the text control 'Slider' and 'Edit Control' and see what happens. Because the sequence of the controls is very important, you can get funny (just for you, not for the user) effects by changing it.
user) effects by changing it.


I feel that using mnemonics in dialog boxes a little bit more than IBM does is a real help for anyone who is primary using the keyboard. It makes your programs more 'user friendly'. The user is able to work faster with your programs and so is more satisfied, and it costs you nearly nothing. So use them whenever possible.
I feel that using mnemonics in dialog boxes a little bit more than IBM does is a real help for anyone who is primary using the keyboard. It makes your programs more 'user friendly'. The user is able to work faster with your programs and so is more satisfied, and it costs you nearly nothing. So use them whenever possible.


In the source files there are two makefiles included. The one ending with .mav was made for IBM's VisualAge for C++. The one ending with .mac isn't a MAC file but the CSet++ makefile.
In the source files there are two makefiles included. The one ending with .mav was made for IBM's VisualAge C++. The one ending with .mac isn't a MAC file but the C Set++ makefile.


[[Category:PM Articles]]
[[Category:PM Articles]]

Latest revision as of 03:33, 9 November 2018

Written by Stefan Ruck

[Here is a link to the http://www.edm2.com/0609/mnsrc.zip. Ed.]

We all know them: Mnemonics (I'm glad I just have to write this word and not pronounce it). When we look at menu bars, we can find them almost anywhere. These nice underscored characters which make life easier for those who still use the keyboard instead of the mouse.

The Problem

Looking at dialog boxes e.g. of IBM's programs, I'm missing mnemonics a lot in conjunction with edit controls and other controls that don't have a text part of their own like radio buttons have.

Believe me, for a long time I thought it was not possible to use them in static text controls. Just because I hadn't seen it in the OS/2 programs I'm using! Of course I had a look at the docs shipped with the DevCon I CDs. But searching for the keyword 'Mnemonic' only shows some very old stuff about mnemonics in menu bars and something about the use of the Universal Resource Editor (which I'm not using).

So I was thinking about writing a class derived from IFrameWindow myself. This class should have the ability of putting mnemonics in static text controls to set the input focus directly e.g. to edit controls just by pressing the right keys, not by using the mouse.

But there is no need for such a class.

What's Needed?

Before I started writing this class, I thought to myself, why not try to do it the way I know it from Windows programming. There were only two things to think about.

First there was the question: How to get a character of a static text control to be underscored?

When you use IBM's dialog editor to design your dialogs, static text controls do not convert the '~' by default. And because I didn't knew the meaning of the word 'mnemonic' in the text style page I never thought of setting this flag. But a short look at the dictionary was very helpful. (When you use other controls like check boxes or radio button, there is no mnemonic flag to set to enable mnemonics. Here mnemonics always work.)

So the answer is simple. Just set the DT_MNEMONIC style for the desired control. Using the IBM's dialog editor you just have to check the mnemonic check box on the text style page of the control.

The second question is: How does the dialog know where to set the input focus when the mnemonic of a static text control is being used?

This is similar to Windows programming (or vice versa). Just take care with the sequence of the dialog's controls (IBM's dialog editor calls it 'order groups', Microsoft's dialog editor calls it 'tab control'). The text control has to be directly in front of the corresponding control which should receive the input focus when the mnemonic is used. This doesn't mean the position in the dialog box but the sequence in the dialog description (have a look at the sample below).

As you can see, there is no miracle about mnemonics and static text controls. No need to do extra programming, just a little bit of dialog box design.

The Sample

Figure 1: Sample dialog box.

The dialog description for the dialog box shown in figure 1 looks like this:

  DLGTEMPLATE DLG_SAMPLE LOADONCALL MOVEABLE DISCARDABLE
  BEGIN
    DIALOG  "Mnemonic Sample", DLG_SAMPLE, 8, 35, 141, 106,
            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
    BEGIN
      LTEXT           "~Edit Control", -1, 3, 89, 61, 8,
                      DT_MNEMONIC
      ENTRYFIELD      "", DID_EDIT_CONTROL, 73, 89, 59, 8,
                      ES_MARGIN
      LTEXT           "~Slider", -1, 3, 73, 61, 8,
                      DT_MNEMONIC
      SLIDER          DID_SLIDER, 71, 67, 64, 16,
                      SLS_SNAPTOINCREMENT
                      CTLDATA 12, 0, 20, 0, 0, 0
      GROUPBOX        "~Radiobutton Group", -1, 3, 24, 129, 40,
                      DT_MNEMONIC
      AUTORADIOBUTTON "Radio 1", DID_RADIO_1, 7, 42, 60, 10,
                      WS_TABSTOP | WS_GROUP
      AUTORADIOBUTTON "Radio 2", DID_RADIO_2, 7, 28, 60, 10
      AUTORADIOBUTTON "Radio 3", DID_RADIO_3, 70, 42, 60, 10
      AUTORADIOBUTTON "Radio 4", DID_RADIO_4, 70, 28, 60, 10
      DEFPUSHBUTTON   "~OK", DID_OK, 44, 3, 40, 14, WS_GROUP
    END
  END

Figure 2: Dialog description of the sample dialog box.

As you can see, group boxes can also be used for mnemonics. And as said above, it is very important to keep the right sequence among the controls.

When 'Alt+E' is pressed in the dialog box shown in figure 1, the edit control receives the input focus, 'Alt+S' gives the slider the input focus and 'Alt+R' sets the input focus to the radio button selected the last time.

For test purpose, just swap the position of the text control 'Slider' and 'Edit Control' and see what happens. Because the sequence of the controls is very important, you can get funny (just for you, not for the user) effects by changing it.

I feel that using mnemonics in dialog boxes a little bit more than IBM does is a real help for anyone who is primary using the keyboard. It makes your programs more 'user friendly'. The user is able to work faster with your programs and so is more satisfied, and it costs you nearly nothing. So use them whenever possible.

In the source files there are two makefiles included. The one ending with .mav was made for IBM's VisualAge C++. The one ending with .mac isn't a MAC file but the C Set++ makefile.