首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MouseHover上调用call事件?

如何在MouseHover上调用call事件?
EN

Stack Overflow用户
提问于 2018-08-08 10:35:01
回答 2查看 1.2K关注 0票数 1

我有一个面板的画图事件,它在面板周围画一个矩形来突出显示它。

油漆事件-

代码语言:javascript
运行
复制
 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-

代码语言:javascript
运行
复制
private void add_MouseHover(object sender, EventArgs e)
        {



            deal_details_panel.Invalidate();



        }

我看到了一些答案,这些答案是要使用Invalidate()的,但是,for ()对我不起作用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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:

代码语言:javascript
运行
复制
private bool _drawBorder = false;

然后,更改paint方法以考虑该值:

代码语言:javascript
运行
复制
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事件,而是使用MouseEnterMouseLeave

这有两个原因: 1: Mouse_Hover有内置延迟;2:使用Mouse_Hover,当鼠标停止在按钮上悬停时,您不会得到指示。

MouseEnterMouseLeave事件处理程序中,只需更新_drawBorder的值并调用deal_details_panel.Refresh()即可。

代码语言:javascript
运行
复制
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();
}
票数 1
EN

Stack Overflow用户

发布于 2018-08-08 10:56:28

Zohar指出了正确的解决方案,但我想补充一个改变的建议:

代码语言:javascript
运行
复制
using (Pen p = new Pen(Color.GreenYellow, thickness))

至:

代码语言:javascript
运行
复制
using (Pen p = new Pen(Color.Transparent, thickness))

这将从一开始就设置正确的状态,因此不需要重新绘制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51744530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档