转自:http://blog.csdn.net/ydfy6/archive/2009/08/07/4422308.aspx
CCmdTarget类定义BeginWaitCursor()、EndWaitCursor()和RestoreWaitCursor()3个成员函数处理等待光标。BeginWaitCursor()将光标设置为沙漏形状,该函数有可能被程序框架调用,通知用户状态忙,例如当加载和存储文档时。EndWaitCursor()将光标恢复为沙漏之前的形状,一般与BeginWaitCursor()配合使用。
在实际编程中,在一个比较耗费机时的处理前应该主动调用BeginWaitCursor()设置光标,在处理结束时要调用EndWaitCursor()恢复光标。例如:
void CWaitCursorDoc::LoadFile(char * Filepath)
{
//显示沙漏光标
BeginWaitCursor();
//耗费机时的处理过程
TRACE("正在装入文件,请等待.../n");
......
//恢复为沙漏前的光标形状
EndWaitCursor();
}
如果在BeginWaitCursor()和EndWaitCursor()之间的处理中,弹出了模式对话框,光标会由沙漏变为标准形状(通常是标准箭头)。为处理这种情形,可以在对话框关闭后,调用成员RestoreWaitCursor()重新将光标设置回沙漏形状,直到处理结束后调用EndWait Cursor()。例如:
void CWaitCursorDoc::LoadFile(char * Filepath)
{
WIN32_FIND_DATA FindData;
//显示沙漏光标
BeginWaitCursor();
//耗费机时的处理过程
if(::FindFirstFile(Filepath,&FindData)==INVALID_HANDLE_VALUE)
{
TRACE("打开文件出错,请重新指定文件/n");
CFileDlg dlg;
dlg.DoModal();
//恢复光标的沙漏形状
RestoreWaitCursor();
}
TRACE("正在装入文件,请等待.../n");
......
//恢复沙漏前的光标形状
EndWaitCursor();
}
但如果弹出的是MessageBox()消息框,就不必调用RestoreWaitCursor(),光标会自动恢复为沙漏。
在非CCmdTarget派生类中,可以使用CWaitCursor类设置等待光标。该类的构造函数和析构函数相当于CCmdTarget::BeginWaitCursor()和CCmdTarget::EndWaitCursor(),成员函数Restore()相当于CCmdTarget:: RestoreWaitCursor()。
MFC中文手册中的解释如下:
CWaitCursor
CWaitCursor没有基类。
CWaitCursor类提供了显示等待光标的直接方式,当你进行冗长的操作时,它通常显示出一个沙漏。好的Windows编程方式要求你在执行耗用大量时间的操作时显示等待光标。
如果要显示等待光标,仅需在进入执行冗长操作的代码之前定义一个CWaitCursor变量。整个对象的构造函数自动地显示等待光标。
当对象超出作用域时(在定义了CWaitCursor对象的代码块的末尾),它的析构函数将光标设为原来的光标。换句话说,该对象自动执行必要的清除工作。
注意:
由于它们的构造函数和析构函数的工作方式,CWaitCursor对象总是被定义为局部变量__它们从不被定义为全局变量,也不用new来分配。
如果你执行了可能会使光标改变的操作,比如显示消息框或对话框,则应调用Restore成员函数以恢复光标。即使当前正在显示等待光标也可以调用Restore函数。
显示等待光标的另一种方式是使用CCmdTarget::BeginWaitCursor和CCmdTarget::EndWait Cursor的组合,可能还有CCmdTarget::RestoreWaitCursor。但是,CWaitCursor更易于使用,因为你在完成了冗长的操作之后不必将光标恢复到原来的光标。
注意:
MFC使用虚拟函数CWinApp::DoWaitCursor来设置和恢复光标。你可以重载这个函数以提供自定义的表现方式。
#include <afxwin.h>
问答:
Q:在函数中,使用CWaitCursor wait; 然后光标变成沙漏型,但还是可以操作,比如拖动对话框标题,关闭程序等。 怎么才能当光标变成沙漏型的时候,任何操作都不能进行。。。
A:回复于:2009-02-18 14:17:02
我有个采用非主流的方法,调用WaitCursor时设置鼠标捕捉SetCapture到一个没有任何按钮等可以响应的窗口上,这样不光鼠标点哪里都是由该窗口响应的,因此实质上就是不能操作其他界面元素了.等忙完了在SetCapture(0)即可回复.
回复于:2009-02-18 17:13:45 调用WaitCursor时设置SetCapture()。等待完成后ReleaseCapture()。
回复于:2009-02-18 23:43:52
Windows是一个消息驱动的系统,你没有阻塞消息自然还能操作;要么用一种方法(变量等)进行判断是否允许UI操作(比如菜单消息直接返回),要么用死循环。
分享到:
相关推荐
1、使用自制光标(cur)设置光标形状 2、使用cur文件设置和取消窗体光标形状 3、使用png文件设置和取消窗体光标形状 4、设置和取消系统光标形状
当抬起鼠标左键时,将前面所绘制度矩形拉伸到整个窗口,拉伸过程中将光标设置为沙漏型。然后,若双击鼠标的左键,则灰色消失,窗口恢复到初始状态。 编写一个鼠标应用程序,按下鼠标左键在窗口中移动时,将按下左键...
VisualC 实效编程 115 改变鼠标光标的形状VisualC 实效编程 115 改变鼠标光标的形状VisualC 实效编程 115 改变鼠标光标的形状VisualC 实效编程 115 改变鼠标光标的形状VisualC 实效编程 115 改变鼠标光标的形状...
unity3d改变鼠标的样式 设置光标形状 用GUI实现的可能效率有点差 能播动画图标 基本上现在的作法也只有这样了 不然网页上不能用 还要考虑多平台的问题
1.如何设置光标?(Visual C++编程 源代码)1.如何设置光标1.如何设置光标?(Visual C++编程 源代码)?(Visual C++编程 源代码)1.如何设置光标?(Visual C++编程 源代码)1.如何设置光标?(Visual C++编程 源...
VC 为文本框控件的光标设置输入焦点,焦点就是文本框默认出现光标的位置,光标默认在第几个文本框中显示,本代码将向你演示如何设置默认的文本框光标。下面是相关的代码: //获得编辑框窗口 CEdit* pEdit1 = ...
设置光标 设置光标 设置光标 设置光标 设置光标 设置光标 设置光标
动态设置窗体的光标外形程序(C#代码编写) 动态设置窗体的光标外形 QQ223857666勾月
改变窗口中的光标形状
设置光标的实验 实验内容:设置光标,起始位置为第5行第6列,结束位置为第8行第6列。
VB.NET将任意图像文件设置为鼠标形状,变换光标,光标文件读取,支持自定义光标的图像文件格式为:图像文件(*.jpg;*.gif;*.png;*.bmp)。操作方法挺简单的,点击 按钮选择一个格式合适的光标文件即可,注意查看鼠标...
设置动画光标设置动画光标
显示动画光标(C#源代码编写)显示动画光标,当运行程序时,光标将变成动画光标 VisualStudio2008创建[DllImport("user32")] private static extern IntPtr SetCursor(IntPtr hCursor); [DllImport("user32")] ...
C#动态设置窗体的光标C#动态设置窗体的光标C#动态设置窗体的光标C#动态设置窗体的光标
JavaScript获取,设置光标位置,兼容InputTextArea
光标形状 html css css知识 网页知识
asp.net中如何实现更改更改光标形状
c++应用程序,实现用鼠标拖动方式在窗口中画自由曲线,在鼠标拖动画线过程中,当光标设置为十字形。
cad十字光标红绿并且是斜的该怎么办?cad十字光标设置教程.docx
可以用汇编程序实现按光标键画出横向竖向形状,可以连续,可以断开,可以抹除