C# 在屏幕上动态绘制填充矩形
Draw a fill rectangle dynamically on screen in C#
我想在我的屏幕上动态绘制一个填充矩形,不透明度为 0.1。问题是当我移动鼠标时,之前的矩形不清晰。
这是绘图方法。
private void OnMouseDown(object sender, MouseEventArgs e)
{
isMouseDown = true;
x = e.X;
y = e.Y;
g = this.selectorForm.CreateGraphics();
}
private void OnMouseMove(object sender, MouseEventArgs e)
{
if (!isMouseDown) return;
this.selectorForm.Invalidate();
g.FillRectangle(brush, this.getRectangle(x, y, e.X, e.Y));
g.DrawRectangle(pen, this.getRectangle(x, y, e.X, e.Y));
}
这是我的选择器表单
internal class SelectorForm : Form
{
protected override void OnPaintBackground(PaintEventArgs e)
{
}
}
An example when I draw a rectangle (several overlapping rectangles)
并且 Invalidate()
不起作用,因为我覆盖了 OnPaintBackground
。但是,如果我不执行此覆盖,当我执行 this.selectorForm.Show()
、my screen becomes gray.
时
那么如何在屏幕上绘制不透明度为 0.1 的矩形?
谢谢!
您可以试试下面的代码:
g.Clear();
g.FillRectangle(brush, this.getRectangle(x, y, e.X, e.Y));
g.DrawRectangle(pen, this.getRectangle(x, y, e.X, e.Y));
这是一个适合我的例子。
关键部分是:
- 使用
Paint
事件和 其 Graphics
- 添加
Clear(BackgroundColor)
否则我会得到与您看到的相同的工件
- 为了透明度,应该使用 TransparencyKey 属性。有一定的颜色选择:
- 常用颜色可能会与表单上的其他内容冲突
- Fuchsia 有效 如果 您想要单击 表单
- 其他不太常见的颜色都适合;我选择了浅绿色
你可能想适应你设置事件的方式,我只是这样做是为了更快的测试。
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
DoubleBuffered = true;
Opacity = 0.1f;
// a color that will allow using the mouse on the form:
BackColor = Color.GreenYellow;
TransparencyKey = BackColor;
}
Point mDown = Point.Empty;
Point mCur = Point.Empty;
private void Form2_MouseDown(object sender, MouseEventArgs e)
{
mDown = e.Location;
}
private void Form2_MouseUp(object sender, MouseEventArgs e)
{
mDown = Point.Empty;
}
private void Form2_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left) return;
mCur = e.Location;
Invalidate();
}
private void Form2_Paint(object sender, PaintEventArgs e)
{
if (mDown == Point.Empty) return;
Size s = new System.Drawing.Size(Math.Abs(mDown.X - mCur.X),
Math.Abs(mDown.Y - mCur.Y) );
Point topLeft = new Point(Math.Min(mDown.X, mCur.X),
Math.Min(mDown.Y, mCur.Y));
Rectangle r = new Rectangle(topLeft, s);
e.Graphics.Clear(this.BackColor); // <--- necessary!
e.Graphics.FillRectangle(Brushes.Bisque, r ); // <--- pick your..
e.Graphics.DrawRectangle(Pens.Red, r); // <--- colors!
}
}
}
我想在我的屏幕上动态绘制一个填充矩形,不透明度为 0.1。问题是当我移动鼠标时,之前的矩形不清晰。
这是绘图方法。
private void OnMouseDown(object sender, MouseEventArgs e)
{
isMouseDown = true;
x = e.X;
y = e.Y;
g = this.selectorForm.CreateGraphics();
}
private void OnMouseMove(object sender, MouseEventArgs e)
{
if (!isMouseDown) return;
this.selectorForm.Invalidate();
g.FillRectangle(brush, this.getRectangle(x, y, e.X, e.Y));
g.DrawRectangle(pen, this.getRectangle(x, y, e.X, e.Y));
}
这是我的选择器表单
internal class SelectorForm : Form
{
protected override void OnPaintBackground(PaintEventArgs e)
{
}
}
An example when I draw a rectangle (several overlapping rectangles)
并且 Invalidate()
不起作用,因为我覆盖了 OnPaintBackground
。但是,如果我不执行此覆盖,当我执行 this.selectorForm.Show()
、my screen becomes gray.
那么如何在屏幕上绘制不透明度为 0.1 的矩形?
谢谢!
您可以试试下面的代码:
g.Clear();
g.FillRectangle(brush, this.getRectangle(x, y, e.X, e.Y));
g.DrawRectangle(pen, this.getRectangle(x, y, e.X, e.Y));
这是一个适合我的例子。
关键部分是:
- 使用
Paint
事件和 其Graphics
- 添加
Clear(BackgroundColor)
否则我会得到与您看到的相同的工件 - 为了透明度,应该使用 TransparencyKey 属性。有一定的颜色选择:
- 常用颜色可能会与表单上的其他内容冲突
- Fuchsia 有效 如果 您想要单击 表单
- 其他不太常见的颜色都适合;我选择了浅绿色
你可能想适应你设置事件的方式,我只是这样做是为了更快的测试。
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
DoubleBuffered = true;
Opacity = 0.1f;
// a color that will allow using the mouse on the form:
BackColor = Color.GreenYellow;
TransparencyKey = BackColor;
}
Point mDown = Point.Empty;
Point mCur = Point.Empty;
private void Form2_MouseDown(object sender, MouseEventArgs e)
{
mDown = e.Location;
}
private void Form2_MouseUp(object sender, MouseEventArgs e)
{
mDown = Point.Empty;
}
private void Form2_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left) return;
mCur = e.Location;
Invalidate();
}
private void Form2_Paint(object sender, PaintEventArgs e)
{
if (mDown == Point.Empty) return;
Size s = new System.Drawing.Size(Math.Abs(mDown.X - mCur.X),
Math.Abs(mDown.Y - mCur.Y) );
Point topLeft = new Point(Math.Min(mDown.X, mCur.X),
Math.Min(mDown.Y, mCur.Y));
Rectangle r = new Rectangle(topLeft, s);
e.Graphics.Clear(this.BackColor); // <--- necessary!
e.Graphics.FillRectangle(Brushes.Bisque, r ); // <--- pick your..
e.Graphics.DrawRectangle(Pens.Red, r); // <--- colors!
}
}
}