我正在使用自定义 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_NCHITTEST
为 0x0084
,HTTRANSPARENT
为 -1
。
虽然我不确定此解决方案是否也适用于子控件,但值得一试。只需派生一个控件并覆盖 WndProc
。
关于用于绘制的 C# WinForms 透明点击控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10053521/