Help wanted on SIMPLE task

Stephan Rose kermos at somrek.net
Sun Mar 4 05:34:48 PST 2007


On Sunday 04 March 2007 14:05, Bengt Nilsson wrote:
> Hi!
>
> I am very new to wx programming and I need help on a simple task.
>
> How do I make a simple selection dragbox (using e.g. OnMouseEvent )
> in a graphics window without destroying what's in it?
>
> I have the "Cross-Platform GUI Programming whith wxWidgets" book, and
> I think I have seen the source listing for the method there, but I
> just can't seem to find int.
> I have gone thru it several times and failed.
>
> I do not want to paint anything in the graphics window, I just want
> to make a flickering frame over the content to select an area to get
> input to a zooming in function.
>
> Extremely standard, apparently too simple to be demonstrated in
> wxWidgets samples, since I cannot find it there.

There are multiple ways you can do this.

First way is to draw all your stuff in your window to a backbuffer. Then when 
you go draw your selection box, first copy your backbuffer to your graphics 
window and then draw your selection box.

This way you always have a copy of your original data without the selection 
box in it. 

That is the way I'd recommend it.

The other way is to use inverted lines to draw your selection box. Using that 
method you do not need a backbuffer. An inverted line basically draws itself 
by inverting pixels instead of drawing itself in a set color.

If you invert the pixel again, it goes back to its previous color.

So basically it works like this:

- Draw box with inverted line
- Mouse move
- Draw box *again* with inverted line on previous coordinates
- Draw new box now with inverted lines on new coordinates

You basically draw the box twice each mouse move. Once to erase the old box, 
then again to draw the new box. 

This was a very popular technique in the DOS and early windows days as it 
requires very little CPU resources to implement.

Drawback though is that it is easy to screw up. If your coordinates get out of 
sync for any reason you will end up with pixels that stay inverted until you 
redraw your entire view.

Another way, this is how I do it, is to use hardware accelerated drawing and 
simply draw the entire view every frame. That requires OpenGL though. I can 
draw over 20,000 objects in less than 10ms on this system here so I can 
afford to redraw the entire view every frame. =)





More information about the wx-users mailing list