User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

20
User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI

Transcript of User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

Page 1: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

User Interface Programming in C#:

Direct Manipulation

Chris North

CS 3724: HCI

Page 2: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

GUI Topics

ComponentsGUI layoutsEventsGraphics ManipulationAnimation

• Databases

• MVC

Page 3: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

Review

• 3 kinds of elements in a component’s API?

• How to receive Events?

• GUI Layout techniques?

• When to paint the graphics?

• How to paint the graphics?

Page 4: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

Direct Manipulation

Definition: (Shneiderman)

• ?

• ?

• ?

• ?

Page 5: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

Direct Manipulation

Definition: (Shneiderman)

• Visual objects

• Selection by pointing

• Rapid, incremental, reversible actions

• Immediate, continuous feedback

Examples:Drag a button, drag graphics,

over other graphics

Page 6: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

Typical interaction sequence

• select item by point-n-click: Hit testing

• act on item by drag: Dynamic update

• release item

MouseDown

MouseMove

MouseUp

Page 7: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

1. Hit Testing• Mouse down, mouse over

• Which dot did user click on?

• Using components:• Make each dot a simple component, like a Button

• Hit testing automatic, each component is a subwindow

• Receive events from components, check event source

• rectangular items, not scalable, inherit from UserControl

• Using custom graphics:• Get click (x,y) from MouseDown event

• Iterate through data structure, test for hit– E.g: if rect.contains(x,y)

• Data structure for fast lookup?

Page 8: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

2. Dynamic Updating

• Dragging, stretching, …

• MouseMove events

• Using components:• mouseDown store x,y click in component

• mouseMove– Calculate x,y delta

– Move component by delta

• Using graphics:• (need to erase it, repaint other graphics, repaint new item)

• Calculate delta, calculate new item location, store

• Call Refresh( )

• Draw new graphics in Paint event

Page 9: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

Problem

• Dynamic manipulation on top of other graphics• Need to preserve (redraw) other graphics

• Examples: MacDraw, powerpoint

• Simple solution:• Call refresh( ) or invalidate( ) while dragging

• Paint( ) event restores other graphics

• But: if lots of graphics, too slow & flashing!

Page 10: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

Problem: Flashing

• Ugly flashing when repaint:• Paint background

• Redraw shapes

Page 11: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

Solution: Double buffering

Page 12: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

Solution: Double buffering

• Double buffered repaint:• Draw all graphics in temporary off-screen image

» Paint background color

» Paint shapes

• Then paint image to Window

• Bonus: C# can do this for you!• Form1.DoubleBuffered = true; //VS 2005

• control maintains off-screen image

SetStyle(ControlStyles.DoubleBuffer | //VS 2003 ControlStyles.UserPaint |

ControlStyles.AllPaintingInWmPaint, true);

Page 13: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

Notes on DoubleBuffering in C#

• Form1.DoubleBuffered = true;

1. Only works for graphics in the Paint event• Graphics drawn in mouse events will not double buffer.

2. Only works on the component which is set• Setting Form1.DoubleBuffered = true for Form1 will

NOT doublebuffer child components like a Panel.

• Must set ‘DoubleBuffered=true’ for each component you want buffered.

• But…

Page 14: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

but…

• Can set Form1.DoubleBuffered = true• Cannot set Panel1.DoubleBuffered = true

• DoubleBuffered is Protected property• Can only set by Panel class or subclass

• Must make Panel subclass:public class MyPanel : Panel { public MyPanel() : base() { this.DoubleBuffered = true; } }

• Then use MyPanel component instead of Panel.

Page 15: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

More Solutions: Speed

• Minimize repaint rectangle:• this.Invalidate(rect), where rect is area of manipulation

• In Paint( ) event, process only graphics within e.ClipRect

• Modified double buffering:• maintain buffer image for background graphics

• Paint image to screen, then paint manip graphics

• XOR painting

Page 16: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

Rubber Band (XOR painting)

• Want multi-selection by stretching a rubber band

• Draw rubber band by inverting pixel colors• drawing with XOR once inverts background colors

• drawing with XOR twice returns to original look– No need to refresh( ), fast!

// in mouseMove event:

// erase previous rect: (must use screen coords, not window coords)

ControlPaint.DrawReversibleFrame(rect, Color.Black, FrameStyle.Dashed);

// <update rect here based on mouse x,y>

// draw new rect:

ControlPaint.DrawReversibleFrame(rect, Color.Black, FrameStyle.Dashed);

Page 17: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

Drag-n-Drop• Drag and Drop API for GUI controls

• Supports data transfer

DestControl.AllowDrop = True;

SourceControl_MouseEvent: this.DoDragDrop(data, DragDropEffects.Copy);

DestControl_DragOver(e): e.Effect = DragDropEffects.Copy;

DestControl_DragDrop(e): do something with e.Data.GetData(typeof(String));

Page 18: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

Animation

• Update components/graphics in a loop:for(int i =0; i<100; i++)

button2.Left += 10;

for(int i =0; i<100; i++)

myGraphicX += 10;

refresh();

• but? Loops blocks other events.

Page 19: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

Event-based Animation

• Use a Timer control• Non-visible control, fires a Tick event at specified intervals

• Timer1.Interval = 10 //milliseconds

• Timer1.Enabled = true //starts animation

• in Timer1_Tick( ) event:– Update graphics

– Refresh( )

• Timer1.Enabled = false //stops animation

• Use doublebuffering

Page 20: User Interface Programming in C#: Direct Manipulation Chris North CS 3724: HCI.

Software Architecture so far…

Program State -data structures

Paint event-display data

Interaction events-modify data