用于绘制的 C# WinForms 透明点击控件

标签 c# winforms controls transparent

我正在使用自定义 TreeView 类,因为我需要拖放功能。我在 treeview 上画线,以便向用户显示拖动的项目将去哪里。这会产生很多可见的闪烁,因为每次“放置目标”发生变化时,我都必须重新绘制 TreeView (以清除之前绘制的任何内容)

不幸的是,TreeView 没有 DoubleBuffered 选项。

因此,我想到了这个解决方案:一个可以在自身上绘画的不可见控件,它位于 TreeView 上方,但会传递所有鼠标事件,但不会获得焦点。我可以在该控件上绘画,从而防止闪烁。

但是,我完全不知道该怎么做。我知道我可以将面板颜色设置为透明,但这不会让它变成点击...

PS:我最终采用了简单的方法,即 - 重新绘制我之前用白色绘制的内容,然后用黑色绘制新的选择指示器,而不会使控件无效。这消除了闪烁。但是,由于 StackOverflow 会强制您选择一个答案,所以我会选择一个我认为最合适的答案……可能……

最佳答案

看看 Locus Effect library ,他们绘制了可以点击的透明顶层窗口。

在解决方案的核心,这是通过覆盖类似于此的窗口过程的窗口完成的:

protected override void WndProc(ref Message m)
{
    // Do not allow this window to become active - it should be "transparent" 
    // to mouse clicks i.e. Mouse clicks pass through this window
    if ( m.Msg == Win32Constants.WM_NCHITTEST )
    {
        m.Result = new IntPtr( Win32Constants.HTTRANSPARENT );
        return;
    }

    base.WndProc( ref m ) ;
}

WM_NCHITTEST0x0084HTTRANSPARENT-1

虽然我不确定此解决方案是否也适用于子控件,但值得一试。只需派生一个控件并覆盖 WndProc

关于用于绘制的 C# WinForms 透明点击控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10053521/

相关文章:

c# - 如何正确转义这个字符串

c# - 64 位 Windows 上的气球工具提示

c# - 在 C# 中实现多参数泛型方法

c# - HttpClient.GetAsync(url) 将 504 返回到在浏览器中工作的 URL

c# - Windows 窗体应用程序中不同线程中的 GUI 和逻辑分离

c# - DataGridViewTextBoxColumn 在数字单元格中添加逗号

c# - 如何在代码隐藏中访问 Button.Content 中的控件?

c# - 为什么我的控件在以编程方式添加到选项卡时不显示

delphi - TFlowPanel。在运行时添加控件

c# - 如何在同步框架中过滤客户端数据?