Drawing xor lines

  • Thread starter Thread starter Guest
  • Start date Start date
In my opinion, one of the worst failures of Net (VB2005 Pro) was not
providing an XOR line draw feature, as in VB6.

A major feature of my app is allowing the user to draw Markers (vertical
lines) on a trace so they can measure the time difference between markers.

Once they click on a desired location, on a trace, arrow buttons are
provided so they can move the marker to an exact location. With xor, I just
redraw the current marker to make it disappear then draw a new marker one
pixel away. No sweat in VB6.

I have put a screen shot of a typical trace with markers on my web site
under "Private" then click on "Marker display" "screen shot"
http://home.surewest.net/galen/index.html

I would appreciate any guidance I can get.

The traces are on a bitmap which is contained in a User Control. I thought
of drawing the marker on a copy of the bitmap. To move the marker I would
toss the copy and draw the new marker on a new copy of the original bitmap.
This, of course, would complicate my User Control.

Also there can be up to four markers displayed. If I move one and toss the
bitmap copy, I not only have to draw the new marker but I have to redraw the
other three which didn't move.

As you can see on the screen shot, a marker also shows some text (time
difference between markers). This means I can't just read in a vertical set
of pixels and later restore them as the marker is moved.

I could read a vertical rectangle which would be as wide as the worst case
text size.

Also, as the marker nears the right edge of the screen, the text is placed
to the left of the marker.

H E L P

GalenS
 
it's there, just called something different, Galen already stated it, it's
been there since .NET 1.0
 
AMercer said:
DrawReversibleFrame()

That would be a real kludge. DrawReversibleLine would do for the actual
marker line.

But what about the text? Also the user now has the ability to use a specific
color for the markers.

GalenS
 
Galen Somerville said:
That would be a real kludge. DrawReversibleLine would do for the actual
marker line.

But what about the text? Also the user now has the ability to use a
specific color for the markers.

Unfortunately this is a limitation of GDI+ which 'System.Drawing' is based
on.
 
Herfried K. Wagner said:
Unfortunately this is a limitation of GDI+ which 'System.Drawing' is based
on.
I was hoping you wouldn't say that.

Looks like I have build up a class to replace a one-liner in VB6

GalenS
 
how about this. have the fixed trace be one bitmap drawn first and have a
changing overlay bitmap that has a transparent background drawn on top of the
trace.

make a bitmap (bmOverlay) of the same size as the fixed drawing (the trace).
Make this bitmap transparent for black via
bmOverlay.MakeTransparent(Color.Black)
when an update happens, clear the bmOverlay to black, rebuild all its
vertical lines and text as you wish (location, color, etc). When it is time
to paint, paint the fixed bitmap first, then bmOverlay.
 
AMercer said:
how about this. have the fixed trace be one bitmap drawn first and have a
changing overlay bitmap that has a transparent background drawn on top of
the
trace.

make a bitmap (bmOverlay) of the same size as the fixed drawing (the
trace).
Make this bitmap transparent for black via
bmOverlay.MakeTransparent(Color.Black)
when an update happens, clear the bmOverlay to black, rebuild all its
vertical lines and text as you wish (location, color, etc). When it is
time
to paint, paint the fixed bitmap first, then bmOverlay.

That would work. My user control has a "permanent" bitmap (Bmp) which I
believe is continually painted by

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
e.Graphics.DrawImage(Bmp, e.ClipRectangle, e.ClipRectangle,
GraphicsUnit.Pixel)
End Sub

When I want to clear the bitmap I use the BackColor property. The first use
of this property sets up the permanent bitmap and sets a flag. Subsequent
calls see the flag and skip the setup and just clears the bitmap to the
proper color.

The user, of the app, has 12 default colors that can be changed to suit
them. This includes back and fore colors, marker color, trace1/2/3 etc
colors.

Question. To paint the bmOverlay would I just set a flag then have an If
statement in the above OnPaint event?

GalenS
 
My user control has a "permanent" bitmap (Bmp) which I
believe is continually painted by

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
e.Graphics.DrawImage(Bmp, e.ClipRectangle, e.ClipRectangle,
GraphicsUnit.Pixel)
End Sub

"Continually" painted? Do you mean that the trace bitmap needs repainting
because it is being updated, maybe moving horizontally as time passes? If
so, don't you want the overlay to move with it? "Continually" kind of throws
me.
When I want to clear the bitmap I use the BackColor property. The first use
of this property sets up the permanent bitmap and sets a flag. Subsequent
calls see the flag and skip the setup and just clears the bitmap to the
proper color.

Still thrown by continually and now permanent above.
Question. To paint the bmOverlay would I just set a flag then have an If
statement in the above OnPaint event?

I ran one test, and painting (via DrawImage) the overlay bitmap after the
trace bitmap works fine. A flag that governs whether the overlay is visible
or not sounds like a good idea to me. Just to be complete, my test program
did not use OnPaint. Instead, when it had an updated bitmap it did
Form1.Invalidate(), and painting took place as follows:

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) _
Handles MyBase.Paint
e.Graphics.DrawImage(bmImage, 0, 0)
e.Graphics.DrawImage(bmOverlay, 0, 0)
End Sub

I don't think this difference is of consequence.
 
AMercer said:
"Continually" painted? Do you mean that the trace bitmap needs repainting
because it is being updated, maybe moving horizontally as time passes? If
so, don't you want the overlay to move with it? "Continually" kind of
throws
me.


Still thrown by continually and now permanent above.


I ran one test, and painting (via DrawImage) the overlay bitmap after the
trace bitmap works fine. A flag that governs whether the overlay is
visible
or not sounds like a good idea to me. Just to be complete, my test
program
did not use OnPaint. Instead, when it had an updated bitmap it did
Form1.Invalidate(), and painting took place as follows:

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As
PaintEventArgs) _
Handles MyBase.Paint
e.Graphics.DrawImage(bmImage, 0, 0)
e.Graphics.DrawImage(bmOverlay, 0, 0)
End Sub

I don't think this difference is of consequence.

Yes it is rather confusing. The trace display is Heart sounds and is an
oscilloscope type of display. That is, every few seconds lines are drawn to
connect the next 4 pixels horizontally. Since we show a gap, typically 5 to
10 pixels wide, we have to also have to redraw the existing 4 pixels beyond
the gap to the background color.

Originally I was getting flickering and other display problems. In a stroke
of genious, I added a module to the usercontrol and moved certain
declarations to this module as Public. Specifically g as Graphics, p as Pen,
f as Font and Bmp as bitmap. This is what I meant by "permanent".

Now the display is as solid as a rock. Continually is probably the wrong
wording. I don't make a change an then invalidate. I just make the changes.
As I understand it, invalidate means do a Paint on next vertical sweep. I
further understand that the overides OnPaint means Paint on every vertical
sweep.

GalenS
 
Galen Somerville said:
Yes it is rather confusing. The trace display is Heart sounds and is an
oscilloscope type of display. That is, every few seconds lines are drawn
to connect the next 4 pixels horizontally. Since we show a gap, typically
5 to 10 pixels wide, we have to also have to redraw the existing 4 pixels
beyond the gap to the background color.

Originally I was getting flickering and other display problems. In a
stroke of genious, I added a module to the usercontrol and moved certain
declarations to this module as Public. Specifically g as Graphics, p as
Pen, f as Font and Bmp as bitmap. This is what I meant by "permanent".

Now the display is as solid as a rock. Continually is probably the wrong
wording. I don't make a change an then invalidate. I just make the
changes. As I understand it, invalidate means do a Paint on next vertical
sweep. I further understand that the overides OnPaint means Paint on every
vertical sweep.

GalenS
Oops, I use Me.Invalidate

GalenS
 
Back
Top