Creating User
Interface
Lesson 1
User Interface Design
Principles
-
Ease of use = paramount
importance
-
Design of UI primary consideration =
target audience
Forms, Controls,
Menus
-
Form
-
Primary element of
UI
-
Contain related info / options -
provide user with info required to proceed
-
= class
-
can create multiple instances
of form
-
can inherit from
form
-
Control
-
Make information / options
accessible
-
Some display info (e.g. labels,
picture boxes)
-
Some display and accept info (e.g.
text box, list box, combo box)
-
Others (e.g. button ) allow course of
action to be selected
-
Menu and
toolbars
-
Expose available commands in
structured fashion
-
Menus provide access to high level
commands common to all forms in application (e.g. save,
exit)
-
Items can be enabled / disabled to
control options available at different
times
Composition
-
V. important
-
Only expose functionality needed at
that stage of application
-
Use tab orders to facilitate rapid
navigation
-
Dont reproduce real-world objects
(e.g. paper forms) utilise capabilities added by
computer
-
Use default values (based around
target audience)
-
Utilise user feedback when designing
UI
-
Reflect importance and frequency of
use
-
Most UIs read left-to-right,
top-to-bottom
-
Important / frequently used at top
of form
-
Controls used after from completed
(e.g. submit button) placed according to logical flow at bottom of
form
-
Group related
information
-
Key = design
-
Consistently use colours, fonts and
control types
-
Only use what is needed dont
show-off
-
Avoid busy
forms
-
Colour
-
Use muted, agreeable
colours
-
Design around target
audience
-
Corporate
colours
-
Cultural
significance
-
Avoid hard / unreadable
combinations
-
High contrast in important elements
of application
-
Dont rely on alone to convey
information
-
Fonts
-
Consistent throughout
application
-
Avoid embellishments use simple
ones (e.g. Times New Roman)
-
Images and
Icons
-
Add interest
-
Avoid distraction with busy
images
-
Be aware of cultural significance
(e.g. road signs for STOP vary)
-
Keep icons to shapes that can
render within 16 x 16 grid
-
Shapes and
Transparency
-
Do not overuse unconventional
shapes
-
Doughnut shaped textbox may be
unique but is unusable
-
Transparency can be used to
manipulate controls while monitoring background
activities
Lesson 2
Using
Forms
-
Can create app without forms, e.g.
service or console application, but rare
-
Apps with frequent user interaction
have at least 1 form
-
Complex apps may require several
forms
Adding Forms to
Project
-
Create new Windows Forms project
receive initial form named Form1
-
Form1 = class representing code behind
an instance of Form1
-
Add additional
forms
-
On Project menu select Add Windows
Form
-
On Add New Item dialog click
Windows Form and Open
-
Declare variable representing type
of form
-
Create instance of
form
// Assumes
form called DialogForm
// already
designed by you
DialogForm
myform
Myform = new
dialogForm()
Visual Inheritance
-
Used to create several closely related
forms
-
Allows a form to incorporate all
members, controls, menus and code of existing
form
-
Create base form with common UI
elements
-
Use inherited forms to provide specific
behaviours
-
Add visual inheritance through
IDE
-
On Project menu select Add Inherited
Form
-
From Add New Item dialog choose Local
Project Items in left pane. In right pane select Inherited Form.
Provide a name and click Open.
-
Inheritance Picker shows Forms in
project. Choose one to inherit from and click
OK
or
-
To inherit from form outside project
click Browse and navigate to appropriate application. Click Open and
choose desired Form.
-
Add visual inheritance through
code
// Derive
from MainForm residing within project
public class
myForm : MainForm
{
}
Set Startup Form
-
If app contains multiple forms must
designate one for startup and it must have a Main method
static void
Main()
{
}
-
Choose any form (implementing
Main) in Startup Object of project
properties window
Form Start
Location
-
Form StartPosition property
select
-
Manual open at Location
property
-
CenterScreen open centred in
screen
-
WindowsDefaultLocation open at
default location
-
WindowsDefaultBounds open at
default location and size
-
CenterParent open centred within
parent
Changing
Appearance
-
Some properties controlling appearance
are structures. Expand by clicking + in properties
window
-
Can change properties via
code
// Change
form colour within its implementation
this.BackColor
= System.Drawing.Color.Red;
BackColor, ForeColor, Text
Properties
-
Text = form
caption
-
BackColor and ForeColor control forms
colour
-
Controls inherit ForeColor from parent
form
-
Many have also have BackColor from
parent, others (e.g. text) are independent
-
Choose colours carefully aim for high
contrast
Font, Cursor,
BackGroundImage
-
Once Font changed on form it is applied
to all controls within form (for consitency)
-
Cursor controls icon displayed while
mosue over form
-
BackGroundImage places specified image
as form backdrop. Overrides Backcolor setting
Opacity
-
Opacity controls form transparency,
range 0 to 1
-
0 = opaque, 1 =
transparent
-
Control inherits form
opacity
-
In property window Opacity represented
as percentage
Form
Methods
-
Methods perform
actions
-
Every form inherits functionality from
System.Windows.Forms.Form including
-
Form.Show causes form class to
load, display on screen (Visible property set to true) and receive
input focus. If form already in memory effect = setting Visible to
true
-
Form.ShowDialog same as Form.Show
except form displayed as modal dialog (no other app forms can be
interacted with until this form dismissed)
-
Form.Activate shifts input focus to
form currently visible. If form not visible, method has no
effect
-
Form.Hide remove form from view,
but maintain in memory. Sets Visible property to
false
-
Form.Close closes from and removes
from memory. If called on
application startup form then application
closed
Form
Events
·
Interesting
occurrence occurs, raises event enabling other portions of app to handle
event
·
Each control
and form can raise events, e.g. FormHide method raised Deactivate event
and VisibleChanged event
·
Developers
create event handler a method executing in response to
event
·
Create via IDE
or programmatically (latter more complicated)
-
Select form or control to host event
handler
-
From properties window click Events
button (lightning bolt)
-
Select desired event from
list
-
Some events raised during forms
lifetime
-
Load fired when instance of form
first loaded via Form.Show or Form.ShowDialog. Only raised once per
form instance. Use to initialise form + prepare for
use
-
Activate raised when form receives
input focus (Form.Show, Form.ShowDialog, Form.Activate). Use to set
focus to particular control. Does not fire if click on another app and
then return
-
Deactivate raised when form looses
input focus (Form.Hide, Form.Close). Use to validate user input. Does
not fir if click on another app
-
VisibleChanged raised when visible
property of form changes (Form.Show, Form.Showdialog, Form.Hide,
Form.Close)
-
Closing form in process of closing
but not yet closed (Form.Close). Use to verify all tasks require by
form have completed can abort close if required by adding
following:
CancelEventArgsCancel
= true;
-
Closed raised after form closed
(Form.Close) and handlers for Closing event completed. Use to execute
clean-up code
Lesson 3
Using Controls and
Components
-
Control
-
graphical tool to create / enhance
app functionality
-
hosted by form
-
added from
toolbox
-
some, e.g. button, textbox receive
user input and perform simple tasks
-
customise functionality via event
handlers
-
Component
-
similar to
control
-
do not have visual representation,
e.g. timer
-
Together implement most app
functionality
Working with Controls and
Components
-
Add to form using designer which
displays form in graphical state similar to how looks at
run-time
-
Designer adds code for control to
app
-
Position and size via
mouse
-
Properties window displays / permits
modification of properties for selected control (or common properties of
multiply selected controls)
-
Can achieve same through code but
designer + properties window = easy!
-
Components no visual representation
placed into component tray, not form. Use properties window to change
its properties
-
Add to Toolbox
-
Select desired Toolbox
tab
-
Right click and select
Customize
-
If already registered select from
appropriate list (.NET or COM)
-
Otherwise browse to location, select
and click OK.
-
Add event
Handler
-
Every control has default event, e.g.
Button = click. To add handler double click control in
designer
-
For other events
-
select
control
-
Click events button in properties
window
-
Find required event in list and
select it
Control Tab
Order
-
Tab Order dictates sequence controls
selected when tab key pressed
-
Specified by controls TabIndex property
lower values receive input first. If two controls have same value
focus goes to control closes to font of form (set by Bring To Front /
Send To Back menu items)
-
IDE has tool for setting Tab Order.
From View choose Tab Order and click controls in desired
order
Controls Can Contain Other
Controls
-
Container controls allow others
controls to be placed within them
-
Use to logically organise groups of
controls group set of related radio buttons within
GroupBox
-
Logical groupings can be manipulated
programmatically
-
Create sense of flow within
UI
-
GroupBox and
Panel
-
Both provide logical and physical
grouping
-
Changes in their properties, e.g.
Enabled, affect all contained controls
-
Move + position all contained
controls as group
-
Groupbox provides caption to label
contained controls
-
Panel provides no label but is
scrollable
-
TabControl
-
TabControl hosts number of
TabPages
-
TabPages host
controls
-
Group controls onto a set of
tabs
-
Example = app property
pages
-
TabPages similar to Panel controls
scrollable subdivision of form
-
Controls collection
-
exposed by all control
containers
-
Count property = number of controls.
-
Item property = returns specific
control
-
Add and Remove methods support
dynamic maintenance of controls within
container
Control
aControl;
aControl =
myForm.Controls[3];
myForm.RemoveAt(2);
Docking and Anchoring
Controls
-
Anchor
-
Define constant distance between
control and 1+ edges of
form
-
Fixed position in form by anchoring
top and left
-
Resize by anchoring to opposite
edges
-
Float freely by removing
anchor
-
Set via properties window. Choose
Anchor property and choose
edges to anchor control to
-
Dock
-
Attach control to edge of form /
completely fill form
-
Docked control resizes with
form
-
Example = menu bar at top of
form
-
Set via properties window. Click on
part of interface corresponding to edge of form to dock to. Clicking
in centre causes control to fill form
-
Anchor automatically set to
top-left
Extender
Providers
-
Specialised components that provide
additional properties to other controls
-
E.g. ToolTip provider. Place instance
on form and every control has new property ToolTip that is displayed
when mouse hovers over control
-
Others include HelpProvider and
ErrorProvider
-
Via Properties Window set new property
for each control in turn
-
Programmatically set values via the
Extender Provider
// Retrieve
ToolTip for button1
String
myToolTip;
myToolTip =
toolTip1.GetToolTip(button1);
// Set
tooltip for button1
toolTip1.SetToolTip(button1,
Click this button for help);
Lesson 4
Using
Menus
-
Access top-level commands and functions
in familiar, easy to understand interface
-
Expose app functionality logically and
consistently
-
Group items according to
functionality
Creating Menus at Design
Time
-
Created via MainMenu component which
manages MenuItem controls
-
Add MainMenu component to
form
-
Component appears in component
tray
-
Box with text Type Here appears in
menu bar of form. Create new items by typing where indicated.
Additional boxes created below and to right (below = menu items, right
= new / sub menus)
-
Each menu item represented by
MenuItem object. Its properties can be adjusted in Properties
window
-
Menu separators (horizontal bar) added
as hyphon in text box
Access and Shortcut
Keys
-
Menu access via
keyboard
-
Access Keys
-
Open menu via Alt-<key>
combination, e.g. Alt-F for file
-
Select menu item in same
way
-
Can have same access keys for
different menu items - provided they are in different menu groups.
If in same group use
access key to toggle between them, cannot select with Enter
key
-
Identified by underline character in
menu item
-
To assign type & in front of
desired letter for access key in menu item
-
Shortcut keys
-
Instant access to menu items
shortcut for frequently used items
-
Single key, e.g. Delete, F1, etc. or
combinations Ctrl+A, Ctrl+Shift+A, etc.
-
Key combination written to right in
menu (provided ShowShortcut property of menu is
true)
-
To assign
-
Select menu
item
-
Select its shortcut
property
-
Choose key
combination
Menu Item
Events
-
Create in same way as other
controls
-
Click executed when menu
clicked
-
Select menu highlighted, e.g. provide
detailed help
-
Popup prior to menu items being
displayed, e.g. enable / disable menu items
Context
Menus
-
Appear when item
right-clicked
-
Similar to main menus, access keys not
supported
-
Create with ContextMenu component (edit
same way as MainMenu component)
-
Can associate single ContextMenu with
several controls only cone menu per control
Enable / Disable Menu
Commands
-
Every menu has Enabled property.
-
When false menu disabled (including
action and shortcut keys) and greyed out
Check Marks On
Menu
-
Checked property displays check mark
next to menu item
Radio Buttons On
Menu
-
Set RadioCheck property of menu item to
true. Menu item will display radio button instead of check mark when
Checked set to true
-
Radio buttons used to indicate
exclusive options e.g. background colour. Must write own code to
handle exclusivity
Menu Item
Visibility
-
Set Visible property to
false
-
Removes item (and any submenus) from
menu becomes inaccessible
Cloning
Menus
-
Can copy menus at runtime, e.g. clone
edit menu form MainMenu to serve as ContextMenu
-
Create new menu via CloneMenu
method
-
Cloned menu all original menu items,
properties and event handlers
// Declare +
instantiate context menu
ContextMenu
myContextMenu = new ContextMenu();
// Clone
fileMenuItem
myContextMenu.MenuItems.Add(fileMenuItem.CloneMenu());
//Attach
context menu to myButton
myButton.ContextMenu
= myContextMenu;
Merge Menus
-
Display multiple menus (main or
context) as single item
-
Call MergeMenu
method
mainMenu1.MergeMenu(contextMenu1);
Add Menu
Items
-
e.g. display pathnames of most recently
opened files
-
No event handlers associated with them,
can add Click handler via constructor of new menu
item
// Define
event handler
Public void
ClickHandler (object sender, System.EventArgs e)
{
}
MenuItem
myItem;
myItem = new
MenuItem (Item 1, new EventHandler(myClick));
MainMenu1.MenuItems.Add(myItem);
Lesson 5
Validating User
Input
-
Validate UI -> reduced chance of
input error
-
2 types
-
field-level control over UI as it
occurs
-
form-level validate data after all
fields completed
Field-level
Validation
-
Use properties and
events
-
Common control for UI = TextBox. Some
properties include:
-
MaxLength limits number of
characters entered
-
PasswordChar display text entered
as * or other desired character
-
ReadOnly prevent entry of data in
TextBox
-
MultiLine allow entry of multiple
lines. Individual lines stored in array of strings
(TextBox.Lines)
-
Keyboard events permit immediate UI
validation
-
KeyDown and KeyUp raised when key
pressed and released. Commonly used to determine if Alt, Ctrl or Shift
pressed (via KeyEventsArg parm)
private void
textBox1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs
e)
{
if (e.Alt ==
true) MessageBox.Show(The ALT key is still down);
}
·
KeyPress
raised when user presses key that has an ASCII value (a z, 0 9,
special characters such as Enter). Ctrl, Alt and Function keys do not
raise KeyPress. Intercept and evalauet keystrokes, e.g. ensure key pressed
is numeric
·
Validating
Characters via static char methods such as Char.IsDigit, Char.IsLetter,
Char.IsLower, etc. Return true if match
private void
textBox1_KeyPress(object sender, System.Windows.Forms.KeyEventArgs
e)
{
if
(Char.IsDigit(e.KeyChar) == true) MessageBox.Show(You pressed a number
key);
}
-
Focus = ability for object to receive
UI
-
Every control implement Focus method
sets focus to control that called it
-
If succeeds method returns
true
-
Determine if control can receive
focus by checking CanFocus property
-
Following Focus events
raised:
-
Enter focus arrives at
control
-
GotFocus control obtains
focus
-
Leave focus leaves
control
-
Validating raised before control
looses focus, only if CausesValidation property set (default).
Validating event includes CancelEventArgs class its cancel
property when set to true causes focus to return to
control
-
Validated raised after control
validated. Perform actions based on validated
input
-
LostFocus control looses
focus
Form-level
Validation
-
Central procedure implements form-level
validation, called when user proceeds to next
step
-
Keyboard handler
-
more sophisticated form-level
validation, e.g. only enable command buttons after input present in
all fields
-
events passed to form if no visible,
enabled controls. Can force form to receive them first by setting
KeyPreview property to true
User
Feedback
-
User should be informed when invalid
data entered
-
Sound
-
Change control
colour
-
Message boxes (modal dialog
box)
-
Error provider
-
Set error message for each control
(either programmatically or at design time)
-
When message set, icon indicating
error appears next gto control and message displayed as tool
tip
-
Call SetError method to cause error
condition
myErrorProvider.SetError(
nameTextBox, Name cannot be blank);
o
Other
properties effect behaviour, e.g. BlinkStyle and
BlinkRate