如何在基于对话框的程序中动态设置鼠标指针

2016-01-29 11:50 90 1 收藏

如何在基于对话框的程序中动态设置鼠标指针,如何在基于对话框的程序中动态设置鼠标指针

【 tulaoshi.com - C语言心得技巧 】

如何在基于对话框的程序中动态设置鼠标指针
赵湘宁
本文范例程序    

本文旨在示范在对话框的按钮上(或其它控制上)使用单独的鼠标指针。Windows编程中有两种方法改变指针:一种是当应用的主窗口类注册时,为WNDCLASS结构提供一个全程光标指针(HCURSOR),另外一种方法是在程序中处理WM_SETCURSOR消息来设置鼠标光标。标准的MFC应用程序使用第一种方法自动在主窗口注册时将光标指针设置为一个箭头。如果要改变光标指针,则可以通过在主窗口或子窗口中重载消息WM_SETCURSOR的处理函数来重新设置鼠标指针。


// handle WM_SETCURSOR in button class 
BOOL CMyButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT msg) 
{
::SetCursor(m_hMyCursor);
return TRUE;
}

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)


    当用户将鼠标指针移到按钮上时,鼠标不被捕获,Windows发送一个WM_SETCURSOR消息到按钮。从上面OnSetCursor的代码中可以看到,它传递一个参数是窗口句柄(pWnd)- 即鼠标指针所指的窗口,这里指的是按钮本身;OnSetCursor传递的第二个参数是nHitTest,这是一个鼠标点击测试代码(Mouse Hit-Test Codes),它以HTXXX开头,用于WM_NCHITTEST消息;OnSetCursor传递的第三个参数是触发事件的鼠标消息的消息ID-例如,WM_MOUSEMOVE。WM_SETCURSOR是专门用来设置鼠标指针的消息,当设置了鼠标指针以后,应该让它返回TRUE以防止Windows再作缺省处理。

   WM_SETCURSOR的处理机制是这样的,如果有父窗口的话,缺省的窗口过程首先发送WM_SETCURSOR消息到父窗口,如果父窗口处理WM_SETCURSOR消息(即返回TRUE),则Windows不再作任何多余的事情,处理完消息便结束。如果父窗口不处理WM_SETCURSOR消息(即返回FALSE),Windows让子窗口来处理WM_SETCURSOR,如果子窗口也不做任何处理(返回FALSE),Windows使用全程光标指针,如果没有全程光标指针,则使用箭头指针。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)


    如果你在程序中要是使用动态光标指针,你必须决定是在子窗口处理WM_SETCURSOR消息还是在父窗口中处理WM_SETCURSOR消息。两种方法各有利弊,根据具体情况而定。一般总是让对象决定它们自己的行为属性-也就是说最好在子窗口中做处理。本文中的子窗口即按钮。这就要派生一个新的按钮类,新的按钮类有自己的消息映射及其消息处理过程。可以使用类向导来产生新的按钮类,但那样要做的事情太多。如果你已经有自己的按钮类,那当然是在自己的按钮类中处理WM_SETCURSOR消息。如果没有自己的按钮类而又想偷懒的话,那就在对话框中处理WM_SETCURSOR消息得啦,只是不要向面向对象专家说是我告诉你这么做的。


    本文附带一个简单的基于对话框的程序,MyCursor,这个例子程序示范了两种方法来改变光标指针。如果将鼠标移到按钮上(“OK”键和“Cancel”键),光标指针变为蓝色手指,它是通过在对话框中处理OnSetCursor实现的(参见代码),另外,如果将鼠标指针移到带下划线的超链接上,光标指针又变为另外一个Windows中常常使用的手指。它是通过在窗口子类(CStaticLink)中实现的。CStaticLink是一个通用的可重用类,在VC知识库的范例程序中经常用到,其中CStaticLink::OnSetCursor的大多数代码处理是从win32hlp.exe可执行程序中吸取手型指针,它们与本文有关光标设置的内容关系不大,我没有全部列出来,如果你对细节感兴趣,可以从本文的开始处下载范例程序......最后祝大家编程愉快!

来源:http://www.tulaoshi.com/n/20160129/1483577.html

延伸阅读
如何定制对话框中的回车键 作者/赵湘宁 本文例子代码     基于对话框的程序中,每次按下回车键时,程序都退出。去掉按钮的 BS_DEFPUSHBUTTON 属性并重写OnOK函数也没用。那么如何定制回车键的行为呢?这个问题很easy,但是要说明白,却要费点时间。  ...
获取静态控件文本的方法:GetDlgItem函数获得对话框中控件的指针,然后调用GetWindowText获得文本。注意:静态控件的属性必须将Notify选为可能。同理:SetWindowText可以指定文本。 获取编辑框内容:GetDlgItem(ID)-GetWindowText(); 字符内容转换为数值:atoi()把字符串转换为数值;同理:数字到字符串itoa(); GetDlgItemText(ID)可以完成...
1、意图 有时候我们希望将非模态窗口显示为模态窗口。比如在IE的“文件”菜单下选择“打印”,弹出的“打印”对话框就是非模态的(也许我们不太清楚Microsoft的设计意图,一般来说这里的“打印”对话框应该是模态的)。这种情况下如何将“打印”对话框显示为模态的呢(这个对话框对我们来说是Black Box)? 2、简单实现 简单...
也谈如何隐藏显示在任务栏中的对话框程序 作者:1.5kg 下载源代码 介绍 在 VCKBASE Online Journal 第21期中,NorthTibet 写了“如何隐藏显示在任务栏中的对话框程序”一文,颇为巧妙,而且非常好用,唯一不爽的是有点麻烦。踩在他的肩膀上,我找到了一个比较简单的方...
目前几乎所有的商业软件在启动时都会显示一个“日积月累”对话框,该对话框一般一次显示一条关于该软件的使用技巧,用户也可以逐条浏览其中的所有技巧。 下面是用VisualBasic5.0实现该功能的方法: 关键是有三个问题要解决:一是技巧信息以何种形式保存;二是如何随机读取;三是如何控制启动是否显示。 解决第一个问题,有两种思路...

经验教程

876

收藏

57
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部