我创建了两个矩形。我想在上面添加事件。例如,当鼠标悬停在一个上时,悬停的鼠标将改变颜色,可以调整大小或将它们(矩形)拖动到其他位置...
我只是想知道我是否可以控制绘制的图形,或者它会像 Microsoft Paint 那样,在绘制之后,除非清除画布并重新绘制,否则该对象将无法操作。
是否有可能控制绘制的图形,谢谢您的任何建议。
我绘制的图形的简单代码
private void Form1_Paint(object sender, PaintEventArgs e)
{
// Create pen.
Pen blackPen = new Pen(Color.Black, 3);
// Create rectangle.
Rectangle rect1 = new Rectangle(20, 20, 250, 250);
Rectangle rect2 = new Rectangle(70, 70, 150, 150);
// Draw rectangle to screen.
e.Graphics.FillRectangle(Brushes.DeepSkyBlue, rect1);
e.Graphics.FillRectangle(Brushes.LightBlue, rect2);
}
答案 0 :(得分:1)
此外,您可以创建自己的控件,例如:
class RectangleControl : Control
{
public void FillRectangle(Color color)
{
this.BackColor = color;
}
}
然后:
private void Form1_Paint(object sender, PaintEventArgs e)
{
RectangleControl rect1 = new RectangleControl() { Parent = this, Left = 20, Top = 20, Width = 250, Height = 250 };
rect1.FillRectangle(Color.DeepSkyBlue);
RectangleControl rect2 = new RectangleControl() { Parent = rect1, Left = 50, Top = 50, Width = 150, Height = 150 };
rect2.FillRectangle(Color.LightBlue);
rect1.MouseHover += Rect1_MouseHover;
rect2.MouseLeave += Rect2_MouseLeave;
}
private void Rect2_MouseLeave(object sender, EventArgs e)
{
(sender as RectangleControl).BackColor = Color.Yellow;
}
private void Rect1_MouseHover(object sender, EventArgs e)
{
(sender as RectangleControl).BackColor = Color.LightBlue;
}
答案 1 :(得分:0)
您可以改为使用面板控件。 只需添加2个面板控件即可,并添加2个事件处理程序:
Measure 2 =
IF(
HASONEVALUE(CPP[KPI Group]),
DIVIDE(
SUM(CPP[Actual Y.T.D]),
SUM('Corporate Planning Project'[Full Year Budget]),
0
)
)
答案 2 :(得分:0)
您可以监视MouseMove
。
这里的代码使用MouseMove
和矩形使用的一些笔刷值。
using System.Drawing;
using System.Windows.Forms;
namespace Question_Answer_WinForms_App
{
public partial class Form1 : Form
{
public Brush outerRectangleBrush = Brushes.DeepSkyBlue;
public Brush innerRectangleBrush = Brushes.LightBlue;
public Form1()
{
InitializeComponent();
Paint += Form1_Paint;
MouseMove += Form1_MouseMove;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
var isWithinOuterRectangle = e.Location.X >= 20
&& e.Location.X <= 250 + 20
&& e.Location.Y >= 20
&& e.Location.Y <= 250 + 20;
var isWithinInnerRectangle = e.Location.X >= 70
&& e.Location.X <= 150 + 70
&& e.Location.Y >= 70
&& e.Location.Y <= 150 + 70;
if (isWithinOuterRectangle)
{
if (isWithinInnerRectangle)
{
outerRectangleBrush = Brushes.DeepSkyBlue;
innerRectangleBrush = Brushes.Red;
Refresh();
}
else
{
outerRectangleBrush = Brushes.Red;
innerRectangleBrush = Brushes.LightBlue;
Refresh();
}
}
else
{
outerRectangleBrush = Brushes.DeepSkyBlue;
innerRectangleBrush = Brushes.LightBlue;
Refresh();
}
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
// Create pen.
Pen blackPen = new Pen(Color.Black, 3);
// Create rectangle.
Rectangle rect1 = new Rectangle(20, 20, 250, 250);
Rectangle rect2 = new Rectangle(70, 70, 150, 150);
// Draw rectangle to screen.
e.Graphics.FillRectangle(outerRectangleBrush, rect1);
e.Graphics.FillRectangle(innerRectangleBrush, rect2);
}
}
}
答案 3 :(得分:0)
@FJF,编写类似于ms-paint的应用程序并不复杂。 Windows窗体应用程序正在使用GDI +渲染图形。因此您可以使用WindowsForms编写一个简单的绘画应用程序。
@nexolini使用面板进行一些绘制。实际上,佩恩女士也这样做。 Ms-Paint是单层编辑器。因此,您无法随时调整所有对象的大小(但是正如我之前所说,您可以假设每个新绘制的Shapes都有一个面板;类似于Ms-Paint所做的事情)。
那是什么问题?
Ms-Paint不会跟踪鼠标的移动,也不需要(因为它是单层)。您可以使用这些答案完成所有任务。
例如:用于添加“填充颜色”工具,您可以使用getpixel和putpixel对图像执行递归算法。而且您无需知道您正在加工哪种形状。
其他所有任务都可以轻松实现。
对于多层编辑器,我将更喜欢使用更强大的框架(但它也可能以不良的方式在Windows窗体中实现),例如WPF。 WPF使用DirectX渲染图形,并且您可以编写流畅的编辑器。 WPF旨在处理您的图形请求,因此在图形上表现更好。
@Reza_Aghaei的注释对于Windows窗体很有用。