当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 改变窗口中的光标形状

VC++
用VC++创建自定义向导程序
自定义 CRichEditCtrl 控件
Office 2000 风格的停泊、智能型菜单
黑客攻击手段之偷梁换柱
完善 CPopupText 类
让工具条显示256色图像
定制编辑框的上下文菜单
列表控件排序功能的实现
一个优秀的网格控件CGridCtrl
如何用代码动态添加控件
如何在编辑框中使用IAutoComplete接口
应用程序中添加“Coolbars”的简单方法
介绍一个有Toolbar功能的可重用类 CPopupText
在工具栏按钮上添加文本标签
类似Dreamweaver的颜色选择器
如何设置ListView控件的完全行(Full Row)选项
如何enable/disable菜单项
关于CEdit控件的透明 --作者:monsoon
动态菜单项、状态条提示、工具条提示问题
CAnimateCtrl::Open的使用问题

VC++ 中的 改变窗口中的光标形状


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 86 ::
收藏到网摘: n/a

C++ Q&A...

在注册表中查找默认浏览器信息
改变窗口中的光标形状
避免资源ID冲突


原著:Paul DiLascia

翻译:曾国


原文出处:January 2001 issue of MSDN Magazine

原代码下载:CQA0101.exe(47KB)

  • 如何在注册表中查找默认浏览器信息?
  • 如何改变窗口中的光标形状?
  • 如何避免资源ID冲突?


如何在注册表中查找默认浏览器位置的定义?我需要知道EXE文件的路径和名称以便启动一个应用程序会话。我的目的很简单,就是打开默认的浏览器,这样用户能够象普通程序一样使用它,而不是在我设计的程序窗口内浏览因特网。

Rolf Wenger

据我所知,在Window中没有专门指定默认浏览器的注册表键值或设定值。即使专家也很难弄清楚整个注册表,更何况常人。我知道可能存在这样一个键值,

HKCU\System\Mumble\Bletch\Blah\Gak\DefaultBrowser

  如果你知道这样的键值,请写信告诉我。不过,我知道一个简单的解决办法,那就是查找哪个程序和HTML文件相关联。在Window操作系统中HTML文件的后缀通常为.htm和.html,所以你要做的就是查找HKCR/.htm的键值。如果你查找了会找到下面的键值:

HKEY_CLASSES_ROOT\.htm="htmlfile"

再根据这个键值查找HKCR/htmlfilm的条目,你会找到下面的键值:

[HKEY_CLASSES_ROOT\htmlfile\shell\open\command] @="\"C:\\PROGRA~1\\INTERN~1\\iexplore.exe\" -nohome"

这个键值表明Microsoft Internet Explorer (iexplore.exe)是用来打开.htm文件的程序。(-nohome开关标志告诉IE浏览器不要打开主页)如果默认的浏览器是Netscape,这个条目会是这样:

[HKEY_CLASSES_ROOT\htmlfile\shell\open\command]@="\"C:\\PROGRA~1\\NETSCAPE\\netscape.exe\".

我的回答满意吗?

我想为对话框的一个按钮设置不同的光标,应该如何进行设置?

Rolf Wenger
有两种方式可以改变窗口中的光标:你可以在注册窗口类时声明一个全局光标(HCURSOR)作为WNDCLASS结构的一部分,或者通过处理WM_SETCURSOR消息来手工设置光标。标准的MFC程序采用第一种方式设置光标,它自动为主窗口注册一个箭头光标。你可以在主窗口或子窗口中通过处理WM_SETCURSOR消息来改写这个行为。
// 在按钮类中处理WM_SETCURSOR消息BOOL CMyButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT msg) {	::SetCursor(m_hMyCursor);
return TRUE;
}

  不管什么时候,当用户将鼠标移动到按钮上并且鼠标没有被捕获时,Windows 会发送一条WM_SETCURSOR消息给按钮。它传递一个窗口句柄——即鼠标指针指向的窗口, 此时就是按钮本身;击中测试码——即在WM_NCHITTEST消息中使用的HTXXX码(见 Figure 1);和一个触发事件的消息ID,比如说它触发了WM_MOUSEMOVE事件。设置鼠标 光标的最佳机会就是在处理WM_SETCURSOR消息的时候。如果要这么做,你必须返回TRUE以阻止窗口默认的处理过程。
  此时处理会如何进行呢?首先窗口默认的处理过程向父窗口(如果有的话)发送WM_SETCURSOR消息到父窗口。如果父窗口处理了WM_SETCURSOR消息(就是说它返回了TURE),Windows就不做什么了, 该消息就算处理完了。如果父窗口没有处理WM_SETCURSOR消息(返回FALSE),Windows就给子窗口一个处理这条消息的机会。假如子窗口也没有处理该消息(返回FALSE),Windows就使用全局光标,要是连全局光标也没有,则使用箭头光标。
  这些意味着什么?这意味着在需要动态设置光标时,你要决定是在子窗口还是在父窗口处理WM_SETCURSOR消息。两个选择都可行,这取决于实际情况。一般来说,最好让对象决定自己的属性,这就是说最好在子窗口处理消息。本例中子窗口是指按钮。但这需要从CButton类继承一个新的按钮类,让它有自己的消息映射和其 它一些必要的属性,如果你是乐于使用 Class Wizard 的人(有没有人用它啊