Below is the graphics and code:
Red is I draw a geometric figure, green is the mouse choose rendering rectangle, the question now is, in the mouse choose many rectangle, extendedPanel1 is a new panel, give his inheritance in it defines transparency, now every time a new draw the mouse rectangular box box still exists in the previous step, even if I use Invalidate or doesn't work, if there is no transparency, you can achieve this choice, also is the same as other drawing software, but as a result of extendedPanel1 is transparent, every time just reload, but inside painting figure don't disappear, tried the cancel controls also doesn't fit, I don't know how to solve, or do you have a better solution? (but in winform)

//a new definition of transparent panel
Public class ExtendedPanel: Panel
{
Private const int WS_EX_TRANSPARENT=0 x20;
Public ExtendedPanel ()
{
SetStyle (ControlStyles. Opaque, true);
}
Private int opacity=0;
[DefaultValue (0))
Public int Opacity
{
The get
{
Return this. The opacity;
}
Set
{
If (value & lt; 0 | | value & gt; 100)
Throw new ArgumentException (" value must be between 0 and 100 ");
This. Opacity=value;
}
}
Protected override CreateParams CreateParams
{
The get
{
CreateParams cp=base. CreateParams;
Cp. ExStyle=cp. ExStyle | WS_EX_TRANSPARENT;
Return the cp;
}
}
Protected override void OnPaint (PaintEventArgs e)
{
Using (var brush=new SolidBrush (Color FromArgb (enclosing opacity * 255/100, enclosing BackColor)))
{
Um participant raphics. FillRectangle (brush, enclosing ClientRectangle);
}
Base. The OnPaint (e);
}
}
//mouse code
Private void SetSelectionRect ()
{
int x, y;
Int width, height;
X=selectionStart. X & gt; SelectionEnd. X? SelectionEnd. X: selectionStart. X;
Y=selectionStart. Y & gt; SelectionEnd. Y? SelectionEnd. Y: selectionStart. Y;
Width=selectionStart. X & gt; SelectionEnd. X? SelectionStart. X-ray selectionEnd. X: selectionEnd) X - selectionStart. X;
Height=selectionStart. Y & gt; SelectionEnd. Y? SelectionStart. Y - selectionEnd. Y: selectionEnd) - selectionStart. Y Y;
Selection=new Rectangle (x, y, width, height);
}
Private void extendedPanel1_Paint (object sender, PaintEventArgs e)
{
Base. The OnPaint (e);
ExtendedPanel1. Opacity=0;
If (mouseDown)
{
Using (Pen Pen=new Pen (Color Green, 1 f))
{
Pen. DashStyle=DashStyle. Dash;
Um participant raphics. DrawRectangle (pen, selection);
}
}
}
Private void extendedPanel1_MouseDown (object sender, MouseEventArgs e)
{
SelectionStart=extendedPanel1. PointToClient (MousePosition);
MouseDown=true;
}
Private void extendedPanel1_MouseUp (object sender, MouseEventArgs e)
{
MouseDown=false;
SetSelectionRect ();
ExtendedPanel1. Invalidate ();
}
Private void extendedPanel1_MouseMove (object sender, MouseEventArgs e)
{
if (! MouseDown)
return;
SelectionEnd=extendedPanel1. PointToClient (MousePosition);
SetSelectionRect ();
ExtendedPanel1. Invalidate ();
}
CodePudding user response:
. Give you an idea of the Mouse Move event to do the following:After 1, draw new selection box, to save the rectangular box temporarily, for subsequent use
Before 2, draw new selection box, remove the step 1 to draw the selection box, otherwise, like your screenshot, leaving many of residual box before
3, can study the ControlPaint DrawReversibleFrame (), it is a rectangular box drawing method
CodePudding user response:
Will draw a box on the original image, put a background and the relationship between the state of the object, is the state object manipulation, such as defining a Border of the object, which contains the graphic data width coordinates radius, z axis or depth, etc., if the mouse is moved to a box, it changes the state of the corresponding object value, borders drawn according to need, delete a box, just remove the object,