在一个较老的MFC应用程序中,我需要向另一台计算机执行网络连接请求,如果计算机名称不正确,则可能需要等待几秒钟才能超时。因此,我启动了一个工作线程来进行初始连接,以便用户界面仍然响应。
当用户选择菜单项并弹出对话框填写目标计算机信息时,将触发网络连接请求。当用户在对话框上单击“确定”按钮时,将使用工作线程处理网络连接请求。
我想要做的是将鼠标光标更改为等待指示器,一旦实际建立连接或尝试超时,就将等待指示器删除。
但我遇到的问题是,鼠标光标仍然是指针,并且鼠标光标未更改为等待指示器。
我最初认为可以使用
进一步阅读表明,我还需要在
看起来,在
在上面的两个SO帖子中,似乎正在使用全局变量来决定是否调用默认的
当用户选择菜单项并弹出对话框填写目标计算机信息时,将触发网络连接请求。当用户在对话框上单击“确定”按钮时,将使用工作线程处理网络连接请求。
我想要做的是将鼠标光标更改为等待指示器,一旦实际建立连接或尝试超时,就将等待指示器删除。
但我遇到的问题是,鼠标光标仍然是指针,并且鼠标光标未更改为等待指示器。
我最初认为可以使用
BeginWaitCursor()
函数更改鼠标光标。 但是,我发现它没有任何效果。进一步阅读表明,我还需要在
CScrollView
类的 afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
方法中进行覆盖,但是我似乎找不到任何有用的东西来描述我需要在该方法中执行的操作。 OnSetCursor()
方法似乎会因各种原因而被调用,只是移动鼠标就会触发该方法中的断点。看起来,在
OnSetCursor()
方法中,我应该检测当前应用程序状态,并基于此使用 SetCursor()
函数设置已先前使用 LoadCursor()
加载的可能鼠标光标样式之一。请参见 Prevent MFC application to change cursor back to default icon 以及 Change cursor for the duration of a thread
但是,我不确定是否确实是这样做,以及提供给 OnSetCursor()
的参数实际上意味着什么以及如何使用它们。在上面的两个SO帖子中,似乎正在使用全局变量来决定是否调用默认的
CView::OnSetCursor()
方法。
CWaitCursor
对象就会超出范围。我发现如果我使用BeginWaitCursor()
,然后在启动工作线程后放置一个sleep,冻结UI,我也会看到鼠标光标等待指示。所以除了BeginWaitCursor()
之外,似乎还有其他事情我需要做来保持光标为等待光标。 - Richard ChambersCWaitCursor
对象,但由于主消息线程仍在运行,可能会替换光标。当您尝试获取网络连接时,如何处理用户选择其他菜单选项(或其他交互)?您可能需要使用“连接到服务器”应用程序模态对话框。 - 1201ProgramAlarmOnSetCursor()
。 - Constantine Georgiou