我会尝试保留此通用名称以备将来参考。
假设我们的Form有一个Squares网格(RectangleShapes,我们将单独作为“points”)。由于此网格的大小可以在Form加载之前变化,我们在面板中创建所有点当我们第一次加载我们的表格并且可以使用...
foreach (Squares point in mySquares)
......当我们想要改变他们的行为或外表时。现在,我们已经开发了代码,可以在用户向左或向右单击时更改每个点的颜色。它看起来像是:
private void panelGrid_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Right)
{
foreach (Squares point in mySquares)
{
if (point.Rectangle.Contains(e.Location)) // determine which point to use
{
if (e.Button == MouseButtons.Left)
{
Pencil(point); // left-click to fill color
}
else
{
Erase(point); // right-click to erase color
}
}
}
panelGrid.Invalidate(); // refreshes grid
}
}
这就像一个魅力。但是假设我们需要更改此代码:现在我们还希望在按住鼠标按钮时将颜色更改,并将光标移动到新点。 (类似于MS-Paint:将铅笔工具拖动到多个像素上依次填充每个像素。)
令我困惑的是正确实施此行为的正确方法。根据我的理解,我希望在以下情况下调用Pencil / Eraser方法:
A。)鼠标进入“点”和按钮已被按下。
或
B。)按下鼠标按钮。 (见上面的代码)
这对我来说很棘手决定了如何最好地实施新检查,以及如何在网格中的各个点上执行它们 - 或者即使这是必要的。有什么提示吗?
答案 0 :(得分:1)
听起来你希望MouseDown和MouseMove事件做同样的事情:
private void MouseStuff(MouseEventArgs e) {
if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Right)
{
foreach (Squares point in mySquares) {
if (point.Square.Contains(e.Location)) {
if (e.Button == MouseButtons.Left) {
Pencil(point);
} else {
Erase(point);
}
}
}
panelGrid.Invalidate();
}
}
然后尝试从两个事件中调用它:
private void panelGrid_MouseDown(object sender, MouseEventArgs e) {
MouseStuff(e);
}
private void panelGrid_MouseMove(object sender, MouseEventArgs e) {
MouseStuff(e);
}
考虑使用双缓冲面板使控件不那么闪亮,因为在MouseMove事件上使面板无效可能非常密集:
public class BufferedPanel : Panel {
public BufferedPanel() {
this.DoubleBuffered = true;
this.ResizeRedraw = true;
}
}