Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

30
Chapter 16 Chapter 16 Graphical User Graphical User Interfaces Interfaces Bjarne Stroustrup Bjarne Stroustrup www.stroustrup.com/Programming www.stroustrup.com/Programming

Transcript of Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

Page 1: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

Chapter 16Chapter 16Graphical User InterfacesGraphical User Interfaces

Bjarne StroustrupBjarne Stroustrupwww.stroustrup.com/Programmingwww.stroustrup.com/Programming

Page 2: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

OverviewOverview PerspectivePerspective

I/O alternativesI/O alternatives GUIGUI Layers of softwareLayers of software

GUI exampleGUI example GUI codeGUI code

callbackscallbacks

22Stroustrup/ProgrammingStroustrup/Programming

Page 3: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

I/O alternativesI/O alternatives Use console input and outputUse console input and output

A strong contender for technical/professional workA strong contender for technical/professional work Command line interfaceCommand line interface Menu driven interfaceMenu driven interface

Graphic User InterfaceGraphic User Interface Use a GUI LibraryUse a GUI Library To match the “feel” of windows/Mac applicationsTo match the “feel” of windows/Mac applications When you need drag and drop, WYSIWYGWhen you need drag and drop, WYSIWYG Event driven program designEvent driven program design A web browser – this is a GUI library applicationA web browser – this is a GUI library application

HTML / a scripting languageHTML / a scripting language For remote access (and more)For remote access (and more)

33Stroustrup/ProgrammingStroustrup/Programming

Page 4: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

Common GUI tasksCommon GUI tasks Titles / TextTitles / Text

Names Names Prompts Prompts User instructionsUser instructions

Fields / Dialog boxesFields / Dialog boxes InputInput OutputOutput

ButtonsButtons Let the user initiate actionsLet the user initiate actions Let the user select among a set of alternativesLet the user select among a set of alternatives

e.g. yes/no, blue/green/red, etc.e.g. yes/no, blue/green/red, etc.

44Stroustrup/ProgrammingStroustrup/Programming

Page 5: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

Common GUI tasks (cont.)Common GUI tasks (cont.) Display resultsDisplay results

ShapesShapes Text and numbersText and numbers

Make a window “look right”Make a window “look right” Style and colorStyle and color

Note: our windows look different (and appropriate) on Note: our windows look different (and appropriate) on different systemsdifferent systems

More advanced More advanced Tracking the mouse Tracking the mouse Dragging and droppingDragging and dropping Free-hand drawingFree-hand drawing

55Stroustrup/ProgrammingStroustrup/Programming

Page 6: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

GUIGUI From a programming point of view GUI is From a programming point of view GUI is

based on two techniquesbased on two techniques Object-oriented programmingObject-oriented programming

For organizing program parts with common interfaces For organizing program parts with common interfaces and common actionsand common actions

EventsEvents For connecting an event (like a mouse click) with a For connecting an event (like a mouse click) with a

program actionprogram action

66Stroustrup/ProgrammingStroustrup/Programming

Page 7: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

Layers of softwareLayers of software When we build software, we usually build upon existing codeWhen we build software, we usually build upon existing code

77

Our program

Our GUI/Graphics interface library

FLTK

The operating system Graphics GUI facilities

Device driver layer

Example of a layer

• Provides services

• Uses services

Stroustrup/ProgrammingStroustrup/Programming

Page 8: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

GUI exampleGUI example

Window withWindow with two two ButtonButtons, Two s, Two In_boxIn_boxes, and an es, and an Out_boxOut_box

88Stroustrup/ProgrammingStroustrup/Programming

Page 9: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

GUI exampleGUI example

Enter a point in the Enter a point in the In_boxIn_boxeses

99Stroustrup/ProgrammingStroustrup/Programming

Page 10: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

GUI exampleGUI example

When you hit When you hit next pointnext point that point becomes the current that point becomes the current (x,y) and is displayed in the (x,y) and is displayed in the Out_boxOut_box

1010Stroustrup/ProgrammingStroustrup/Programming

Page 11: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

GUI exampleGUI example

Add another point an you have a lineAdd another point an you have a line

1111Stroustrup/ProgrammingStroustrup/Programming

Page 12: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

GUI exampleGUI example

Three points give two linesThree points give two lines Obviously, we are building a polylineObviously, we are building a polyline

1212Stroustrup/ProgrammingStroustrup/Programming

Page 13: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

GUI exampleGUI example

And so on, until you hit And so on, until you hit Quit. Quit.

1313Stroustrup/ProgrammingStroustrup/Programming

Page 14: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

So what? And How?So what? And How? We saw buttons, input boxes and an outbox in a windowWe saw buttons, input boxes and an outbox in a window

How do we define a window?How do we define a window? How do we define buttons?How do we define buttons? How do we define input and output boxes?How do we define input and output boxes?

Click on a button and something happensClick on a button and something happens How do we program that action?How do we program that action? How do we connect our code to the button?How do we connect our code to the button?

You type something into a input boxYou type something into a input box How do we get that value into our code?How do we get that value into our code? How do we convert from a string to numbers?How do we convert from a string to numbers?

We saw output in the output boxWe saw output in the output box How do we get the values there?How do we get the values there?

Lines appeared in our windowLines appeared in our window How do we store the lines?How do we store the lines? How do we draw them?How do we draw them?

1414Stroustrup/ProgrammingStroustrup/Programming

Page 15: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

MappingMapping We map our ideas onto the FTLK version of We map our ideas onto the FTLK version of

the conventional Graphics/GUI ideas the conventional Graphics/GUI ideas

1515Stroustrup/ProgrammingStroustrup/Programming

Page 16: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

Define class Lines_windowDefine class Lines_windowstruct Lines_window : Window struct Lines_window : Window // // Lines_window inherits from WindowLines_window inherits from Window{{

Lines_window(Point xy, int w, int h, const string& title); Lines_window(Point xy, int w, int h, const string& title); // // declare declare constructorconstructorOpen_polyline lines;Open_polyline lines;

private:private:Button next_button;Button next_button; // // declare some buttons – type Buttondeclare some buttons – type Button

Button quit_button;Button quit_button;In_box next_x;In_box next_x; // // declare some i/o boxesdeclare some i/o boxes

In_box next_y;In_box next_y;Out_box xy_out;Out_box xy_out;

void next(); void next(); // // what to do when next_button is pushedwhat to do when next_button is pushedvoid quit(); void quit(); // // what to do when quit_botton is pushedwhat to do when quit_botton is pushed

static void cb_next(Address, Address window); static void cb_next(Address, Address window); // // callback for next_buttoncallback for next_buttonstatic void cb_quit(Address, Address window); static void cb_quit(Address, Address window); // // callback for quit_buttoncallback for quit_button

}; }; 1616Stroustrup/ProgrammingStroustrup/Programming

Page 17: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

GUI exampleGUI example

Window withWindow with two two ButtonButtons, Two s, Two In_boxIn_boxes, and an es, and an Out_boxOut_box

1717Stroustrup/ProgrammingStroustrup/Programming

Page 18: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

The Lines_window constructorThe Lines_window constructor

Lines_window::Lines_window(Point xy, int w, int h, const string& title)Lines_window::Lines_window(Point xy, int w, int h, const string& title):Window(xy,w,h,title), :Window(xy,w,h,title),

// // construct/initialize the parts of the window:construct/initialize the parts of the window: // // locationlocation size name action size name action

next_button(Point(x_max()-150,0), 70, 20, "Next point", cb_next),next_button(Point(x_max()-150,0), 70, 20, "Next point", cb_next),quit_button(Point(x_max()-70,0), 70, 20, "Quit", cb_quit), // quit_button(Point(x_max()-70,0), 70, 20, "Quit", cb_quit), // quit buttonquit buttonnext_x(Point(x_max()-310,0), 50, 20, "next x:"), next_x(Point(x_max()-310,0), 50, 20, "next x:"), // // io boxesio boxesnext_y(Point(x_max()-210,0), 50, 20, "next y:"),next_y(Point(x_max()-210,0), 50, 20, "next y:"),xy_out(Point(100,0), 100, 20, "current (x,y):")xy_out(Point(100,0), 100, 20, "current (x,y):")

{{attach(next_button);attach(next_button); // // attach the parts to the windowattach the parts to the windowattach(quit_button);attach(quit_button);attach(next_x);attach(next_x);attach(next_y);attach(next_y);attach(xy_out);attach(xy_out);attach(lines);attach(lines); // // attach the open_polylines to the windowattach the open_polylines to the window

}}1818Stroustrup/ProgrammingStroustrup/Programming

Page 19: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

Widgets, Buttons, and CallbacksWidgets, Buttons, and Callbacks

A Widget is something you see in the window which A Widget is something you see in the window which has an action associated with ithas an action associated with it

A Button is a Widget that displays as a labeled A Button is a Widget that displays as a labeled rectangle on the screen, and when you click on the rectangle on the screen, and when you click on the button, a Callback is triggeredbutton, a Callback is triggered

A Callback connects the button to some function or A Callback connects the button to some function or functions (the action to be performed)functions (the action to be performed)

1919Stroustrup/ProgrammingStroustrup/Programming

Page 20: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

2020

Widgets, Buttons, and CallbacksWidgets, Buttons, and Callbacks

//// A widget is something you see in the windowA widget is something you see in the window//// which has an action associated with itwhich has an action associated with it

//// A Button is a Widget that displays as a labeled rectangle on the screen;A Button is a Widget that displays as a labeled rectangle on the screen;//// when you click on the button, a Callback is triggered when you click on the button, a Callback is triggered//// A Callback connects the button to some function A Callback connects the button to some function

struct Button : Widget {struct Button : Widget {Button(Point xy, int w, int h, const string& s, Callback cb)Button(Point xy, int w, int h, const string& s, Callback cb)

:Widget(xy,w,h,s,cb) { }:Widget(xy,w,h,s,cb) { }};};

Stroustrup/ProgrammingStroustrup/Programming

Page 21: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

How it worksHow it works

2121

Our code

Window

FLTK

Attach Button

Describe where the button isDescribe what the button looks likeRegister Button’s callback

Call “callback” when Button is pressed

Stroustrup/ProgrammingStroustrup/Programming

Page 22: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

GUI exampleGUI example

Add another point an you have a lineAdd another point an you have a line

2222Stroustrup/ProgrammingStroustrup/Programming

Page 23: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

WidgetWidget

A basic concept in Windows and X windows systemsA basic concept in Windows and X windows systems Basically anything you can see on the screen and do something Basically anything you can see on the screen and do something

with is a widget (also called a "control")with is a widget (also called a "control")

struct Widget {struct Widget {Widget(Point xy, int w, int h, const string& s, Callback cb)Widget(Point xy, int w, int h, const string& s, Callback cb)

:loc(xy), width(w), height(h), label(s), do_it(cb):loc(xy), width(w), height(h), label(s), do_it(cb){ }{ }// // … connection to FLTK …… connection to FLTK …

};};

2323Stroustrup/ProgrammingStroustrup/Programming

Page 24: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

ButtonButton A Button is a Widget thatA Button is a Widget that

displays as a labeled displays as a labeled rectangle on the screen;rectangle on the screen; when you click on it, a Callback is triggeredwhen you click on it, a Callback is triggered

struct Button : Widget {struct Button : Widget {Button(Point xy, int w, int h, const string& s, Callback cb)Button(Point xy, int w, int h, const string& s, Callback cb)

:Widget(xy,w,h,s,cb) { }:Widget(xy,w,h,s,cb) { }};};

2424Stroustrup/ProgrammingStroustrup/Programming

Page 25: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

CallbackCallback Callbacks are part of our interface to “The system”Callbacks are part of our interface to “The system”

Connecting functions to widgets is messy in most GUIsConnecting functions to widgets is messy in most GUIs It need not be, butIt need not be, but

““the system” does not “know about” C++ the system” does not “know about” C++ the style/mess comes from systems designed in/for C/assemblerthe style/mess comes from systems designed in/for C/assembler Major systems always use many languages, this is one example of how to cross a Major systems always use many languages, this is one example of how to cross a

language barrierlanguage barrier A callback function maps from system conventions back to C++A callback function maps from system conventions back to C++

void Lines_window::cb_quit(Address, Address pw)void Lines_window::cb_quit(Address, Address pw)// // Call Lines_window::quit() for the window located at address pwCall Lines_window::quit() for the window located at address pw

{{ reference_to<Lines_window>(pw).quit();reference_to<Lines_window>(pw).quit(); // // now call our functionnow call our function} }

2525

Map an address into a reference to the type of object residing at that address – to be explained the following chapters

Stroustrup/ProgrammingStroustrup/Programming

Page 26: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

Our “action” codeOur “action” code// // The action itself is simple enough to writeThe action itself is simple enough to write

void Lines_window::quit()void Lines_window::quit(){{

//// here we can do just about anything with thehere we can do just about anything with the Lines_window Lines_windowhide();hide(); // // peculiar FLTK idiom for “get rid of this window”peculiar FLTK idiom for “get rid of this window”

}}

2626Stroustrup/ProgrammingStroustrup/Programming

Page 27: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

The next functionThe next function// // our action for a click (“push”) on the next buttonour action for a click (“push”) on the next button

void Lines_window::next()void Lines_window::next(){{

int x = next_x.get_int();int x = next_x.get_int();int y = next_y.get_int();int y = next_y.get_int();

lines.add(Point(x,y));lines.add(Point(x,y));

// // update current position readout:update current position readout:stringstream ss;stringstream ss;ss << '(' << x << ',' << y << ')';ss << '(' << x << ',' << y << ')';xy_out.put(ss.str());xy_out.put(ss.str());

redraw(); // redraw(); // now redraw the screennow redraw the screen} }

2727Stroustrup/ProgrammingStroustrup/Programming

Page 28: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

In_boxIn_box// // An In_box is a widget into which you can type charactersAn In_box is a widget into which you can type characters//// It’s “action” is to receive characters It’s “action” is to receive characters

struct In_box : Widget {struct In_box : Widget {In_box(Point xy, int w, int h, const string& s)In_box(Point xy, int w, int h, const string& s)

:Widget(xy,w,h,s,0) { }:Widget(xy,w,h,s,0) { }int get_int();int get_int();string get_string();string get_string();

};};

int In_box::get_int()int In_box::get_int(){{

// // get a reference to the FLTK FL_Input widget:get a reference to the FLTK FL_Input widget:Fl_Input& pi = reference_to<Fl_Input>(pw); Fl_Input& pi = reference_to<Fl_Input>(pw); // // use it:use it:return atoi(pi.value()); return atoi(pi.value()); // // get the value and convertget the value and convert

// // it from characters (it from characters (aalpha) lpha) toto iintnt}}

2828Stroustrup/ProgrammingStroustrup/Programming

Page 29: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

SummarySummary We have seenWe have seen

Action on buttonsAction on buttons Interactive I/OInteractive I/O

Text input Text input Text outputText output Graphical outputGraphical output

MissingMissing Menu (See Section 16.7)Menu (See Section 16.7) Window and Widget (see Appendix E)Window and Widget (see Appendix E) Anything to do with tracking the mouseAnything to do with tracking the mouse

DraggingDragging HoveringHovering Free-hand drawingFree-hand drawing

What we haven’t shown, you can pick up if you need itWhat we haven’t shown, you can pick up if you need it

2929Stroustrup/ProgrammingStroustrup/Programming

Page 30: Chapter 16 Graphical User Interfaces Bjarne Stroustrup .

Next lectureNext lecture The next three lectures will show how the The next three lectures will show how the

standard vector is implemented using basic standard vector is implemented using basic low-level language facilities.low-level language facilities.

This is where we really get down to the This is where we really get down to the hardware and work our way back up to a more hardware and work our way back up to a more comfortable and productive level of comfortable and productive level of programming.programming.

3030Stroustrup/ProgrammingStroustrup/Programming