我有一个面板的画图事件,它在面板周围画一个矩形来突出显示它。
油漆事件-
private void deal_details_panel_Paint(object sender, PaintEventArgs e)
{
int thickness = 2;//it's up to you
int halfThickness = thickness / 2;
using (Pen p = new Pen(Color.GreenYellow, thickness))
{
e.Graphics.DrawRectangle(p, new Rectangle(halfThickness,
halfThickness,
deal_details_panel.ClientSize.Width - thickness,
deal_details_panel.ClientSize.Height - thickness));
}
}
最初我不想显示这个矩形,我有一个按钮,如果我在上面悬停,只有这样,我才想显示这个矩形和MouseLeave事件,我想让它再次不可见。
Button_Hover-
private void add_MouseHover(object sender, EventArgs e)
{
deal_details_panel.Invalidate();
}
我看到了一些答案,这些答案是要使用Invalidate()的,但是,for ()对我不起作用。
发布于 2018-08-08 10:44:20
使用Refresh()
而不是Invalidate()
。
Invalidate()
方法不强制重新绘制,它只是将控件标记为“需要重新绘制”,在需要时由操作系统重新绘制。
Refresh()
方法将立即强制重新绘制。
有关更多信息,请阅读Control.Invalidate,Control.Update和Control.Refresh有什么区别?博客文章,其中明确指出:
Control.Invalidate( )/ Control.Invalidate(bool) /Control.Invalidate(矩形)/Control.Invalidate(矩形,bool) / Control.Invalidate(Region) / Control.Invalidate(Region,bool) .这里需要注意的是,这些函数仅通过将其添加到控件窗口的当前更新区域来“使”客户区域“失效”或“脏”。当接收到下一条WM_PAINT消息时,将此无效区域以及更新区域中的所有其他区域标记为绘制。因此,您可能不会立即(或同步)看到控件刷新(并显示无效)。
更新
为了使面板只在鼠标悬停在按钮上时显示YellowGreen边框,您需要稍微修改代码。
首先,向表单中添加一个bool字段,以指示是否绘制边框,并初始化为false:
private bool _drawBorder = false;
然后,更改paint
方法以考虑该值:
private void deal_details_panel_Paint(object sender, PaintEventArgs e)
{
if(_drawBorder)
{
int thickness = 2;//it's up to you
int halfThickness = thickness / 2;
using (Pen p = new Pen(Color.GreenYellow, thickness))
{
e.Graphics.DrawRectangle(p, new Rectangle(halfThickness,
halfThickness,
deal_details_panel.ClientSize.Width - thickness,
deal_details_panel.ClientSize.Height - thickness));
}
}
}
最后,不要在按钮上使用mouse_Hover事件,而是使用MouseEnter
和MouseLeave
。
这有两个原因: 1: Mouse_Hover有内置延迟;2:使用Mouse_Hover,当鼠标停止在按钮上悬停时,您不会得到指示。
在MouseEnter
和MouseLeave
事件处理程序中,只需更新_drawBorder
的值并调用deal_details_panel.Refresh()
即可。
private void add_MouseEnter(object sender, EventArgs e)
{
_drawBorder = true;
deal_details_panel.Refresh();
}
private void add_MouseLeave(object sender, EventArgs e)
{
_drawBorder = false;
deal_details_panel.Refresh();
}
发布于 2018-08-08 10:56:28
Zohar指出了正确的解决方案,但我想补充一个改变的建议:
using (Pen p = new Pen(Color.GreenYellow, thickness))
至:
using (Pen p = new Pen(Color.Transparent, thickness))
这将从一开始就设置正确的状态,因此不需要重新绘制。
https://stackoverflow.com/questions/51744530
复制相似问题