Windows窗体应用程序中的非抗锯齿手形光标!好的,那么您知道如何在WindowsVista和Windows7MS中更改手形光标(当您将鼠标悬停在超链接上时显示的光标)并向其添加更多细节以使其边缘抗锯齿良好且平滑吗?那么,为什么它不像Windows窗体应用程序那样工作呢?我正在看一个看起来像穴居人画的蹩脚手形光标,有没有办法以编程方式告诉它显示系统中实际安装的那个?我查看了Windows目录中的Cursors文件夹,旧手形光标甚至不存在!那么为什么WinForms还在使用旧版本呢?我怎样才能“升级”它?是的,WinForms控件仍然使用Windows98/2000附带的旧手形光标。它缺少Aero光标附带的抗锯齿功能。这是因为.NETFramework包含自己的硬编码游标,而不是系统默认使用的游标。我认为这是因为针对Windows95等操作系统的早期版本的.NET并未与此游标捆绑在一起,但考古学尚未完成以证明这一点。幸运的是,很容易强迫它使用正确的。您只需告诉操作系统您希望它使用默认的手形光标,然后无论用户在哪个版本的Windows上运行该程序,即使他们将鼠标光标更改为默认值,它也将是正确的主题.最简单的方法是将现有控件子类化,覆盖WndProc函数以拦截WM_SETCURSOR消息,并告诉它使用系统IDC_HAND游标。您所需要的只是一点P/Invoke魔法。以下代码是使用LinkLabel控件的示例:publicclassLinkLabelEx:LinkLabel{privateconstintWM_SETCURSOR=0x0020;私有常量intIDC_HAND=32649;[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=true)]privatestaticexternIntPtrLoadCursor(IntPtrhInstance,intlpCursorName);[DllImport("user32.dll",CharSet=CharSet.Auto)]privatestaticexternIntPtrSetCursor(IntPtrhCursor);protectedoverridevoidWndProc(refMessagem){if(m.Msg==WM_SETCURSOR){//设置光标使用系统手形光标SetCursor(LoadCursor(IntPtr.Zero,IDC_HAND));//表示消息已经被处理m.Result=IntPtr.Zero;返回;}base.WndProc(refm);}}请原谅我复活了一年前的线程!!!在弄乱了原始解决方案并查看了反映的LinkLabel源代码之后,我“终于”找到了一个快速而干净的方法:usingSystem.Runtime.InteropServices;命名空间System.Windows.Forms{publicclassLinkLabelEx:LinkLabel{privateconstintIDC_HAND=32649;[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=true)]隐私testaticexternIntPtrLoadCursor(IntPtrhInstance,intlpCursorName);privatestaticreadonlyCursorSystemHandCursor=newCursor(LoadCursor(IntPtr.Zero,IDC_HAND));protectedoverridevoidOnMouseMove(MouseEventArgse){base.OnMouse//Move(e)如果基类决定显示丑陋的手形光标if(OverrideCursor==Cursors.Hand){//改为显示系统手形光标OverrideCursor=SystemHandCursor;}}}}这个类实际上做了我们想做的事情:它显示了Getthecorrectsystemhandcursorwithoutblinking,anddothisonlyontheLinkAreaof??thecontrol如果所有的分享内容对你有用,你需要了解更多关于C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
