c# – 通过透明的Windows窗体防止鼠标单击
在浮动侧边栏中切换“笔”按钮后,我正在制作一个用鼠标在屏幕上绘图的小工具.
我做了这个(请不要笑)通过最顶层的窗体形式及其背景,因为它的透明度键覆盖整个屏幕. 它成功地停止了鼠标,但也没有最大化窗体并用鼠标拖动它(使用HTCAPTION IntPtr(2)这是)我尝试使用MSDN上列出的一些其他值,但没有运气. 我离开了我的深度,任何帮助都非常感激(请新手友好!) PS我现在正在使用它.. //code for allowing clicking through of menus protected override void WndProc(ref Message m) { if (penMode && m.Msg == 0x84) { m.Result = new IntPtr(2); } else base.WndProc(ref m); } 更新:现在完全通过另一种方式解决问题.它看起来不像WndProc会工作所以我只是在整个屏幕上创建了一个空白表单,从中显示了我的主要表单(form.Show(this)).然后调整位于下方的空白表单的不透明度从0%到1%以允许/防止点击.作品! 解决方法
实际上,没有必要笑 – 这对我来说听起来就像你正在以正确的方式做到这一点.由于您不拥有桌面,因此不应直接在桌面上绘制.相反,您需要通过覆盖您拥有的透明表单来模拟它,然后绘制它.因为您拥有透明覆盖表单,所以在它上面绘制没有问题.
但除此之外,听起来你只是在没有清楚地了解他们实际做什么的情况下随意尝试价值.这就像闭上眼睛扔飞镖一样.你不会有很高的命中率. 让我们从理解代码的作用开始.魔术值0x84对应于 > HTCAPTION(值为2)表示窗口的单击部分应被视为窗口的标题/标题栏.您知道使用Windows可以使用标题栏在屏幕上拖动窗口,因此返回HTCAPTION以响应鼠标单击将允许您的窗口可拖动.您会看到这在无边框表格(即没有标题栏的表格)上使用,以允许它们移动. 因此,当您没有绘图时,您可能想要返回HTTRANSPARENT.在绘图时,您可能希望返回HTCLIENT,以便绘图代码可以查看鼠标事件并绘制结果. 修复你的代码,然后: // Code for allowing clicking through of the form protected override void WndProc(ref Message m) { const uint WM_NCHITTEST = 0x84; const int HTTRANSPARENT = -1; const int HTCLIENT = 1; const int HTCAPTION = 2; // ... or define an enum with all the values if (m.Msg == WM_NCHITTEST) { // If it's the message we want,handle it. if (penMode) { // If we're drawing,we want to see mouse events like normal. m.Result = new IntPtr(HTCLIENT); } else { // Otherwise,we want to pass mouse events on to the desktop,// as if we were not even here. m.Result = new IntPtr(HTTRANSPARENT); } return; // bail out because we've handled the message } // Otherwise,call the base class implementation for default processing. base.WndProc(ref m); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |