|
Boost : |
From: Andy Little (andy_at_[hidden])
Date: 2004-08-18 23:42:45
"Reece Dunn" <msclrhd_at_[hidden]> wrote
> I am currently designing a GUI framework in C++ (initially targeting the
> Windows platform) that uses a model similar to that which Java uses in
it's
> AWT and Swing libraries. Specifically:
>
> I would appreciate comments and ideas as to what people would like out of
a
> GUI framework, especially one that will be multi-platform.
I am currently looking into GUI but from the point of view of drawing whats
in a window.
One major issue with Windows SDK is spending a lot of time figuring out
whether device or logical units are required.
It seems a natural application for my physical quantities library. So
instead of saying:
DeviceContext dc;
int x,y;
dc.move(x,y);
One could say:
DeviceContext dc;
length::mm x,y;
dc.move(x,y);
Although I am more keen on an object approach as below, more like windows
metafile.
Another issue is the local coordinate system, so I am trying to look at how
to make that more user friendly too:
// A container for the drawing
Drawing drawing<Rectangle>;
// set drawing to "graphics" direction
drawing.set_direction(x_increasing_right(), y_increasing_up());
drawing.set_scale(1,1);
drawing.set_origin(point(length::mm(0),length::mm(0)));
printer printer = GetPrinter();
// synchronise printers way of looking at things with drawing
printer.set_direction(drawing.direction);
printer.set_scale(drawing.scale);
printer.set_origin(drawing.origin);
//ok should get sane values
//get paper size for printing
Rectangle<length::mm> paper_size = printer.get_paper_size();
drawing.rectangle = paper_size;
GraphicLayer border_layer; // a layer representing border for drawing
// sync border_layer direction with drawing
border.set_direction(drawing.direction);
border.set_scale(drawing.scale);
border.set_origin(drawing.origin);
length::mm left_border(10);
length::mm right_border = left_border;
typedef length height; // easy reading
height::mm top_border(10);
height::mm bottom_border(15);
//points representing the border
point<length::mm> first(left_border, bottom_border);
point<length::mm> second(paper_size.width - right_border, bottom_border);
point<length::mm> third(paper_size.width - right_border, paper_size.height -
top_border);
point<length::mm> fourth(left_border, paper_size.height - top_border);
typedef length width;
Pen pen(width::mm(0.2),color(BLACK),style(continuous));
border_layer << line(first,second,pen) << line(second,third,pen)
<< line(third,fourth,pen) << line(fourth,first,pen);
// add the layer to the drawing
drawing << border_layer;
TextLayer text_layer;
// sync text layer with drawing solely for purposes
// of getting correct origin offset in drawing
text_layer.set_direction(drawing.direction);
text_layer.set_scale(drawing.scale);
Font font ("Times New Roman",height::mm(7),width::mm(0));
text_layer.set_origin(left_border,-(paper_size.height - top_border-
font.height)));
// now set direction to text mode
text_layer.set_direction(x_increasing_right(), y_increasing_down());
//... play text into text layer
point(left_border,font.height) start_text;
Text text(start_text,font,"Hello
World",color(BLACK),increasing_right(),increasing_up(),of_angle::deg(0) );
drawing << text;
text.x += text.length ;
/*...*/
drawing >> printer;
Or something like that, then of course theres time and velocity for moving
things about in real time :-)
regards
Andy Little
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk