【发布时间】:2019-09-16 19:50:59
【问题描述】:
在较旧的 MFC 应用程序中,我必须向另一台计算机执行网络连接请求,如果计算机名称不正确,请求超时之前可能需要几秒钟。所以我正在启动一个工作线程来建立初始连接,以便用户界面仍然响应。
网络连接请求是由用户选择一个菜单项触发的,该菜单项会弹出一个对话框来填写目标计算机信息。当用户点击对话框上的 Ok 按钮时,使用工作线程处理网络连接请求。
我想要做的是将鼠标光标更改为等待指示器,然后在实际建立连接或尝试超时后移除等待指示器。
我遇到的是鼠标光标仍然是指针,并且鼠标光标没有变为等待指示器。
我最初的想法是我可以使用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吗? -
@1201ProgramAlarm 我刚刚尝试过,我发现它确实将鼠标光标更改为等待指示。但是有一个本地范围要求,这意味着一旦菜单处理程序启动工作线程然后返回,
CWaitCursor对象就会超出范围。我发现如果我使用BeginWaitCursor(),然后在启动工作线程后休眠,冻结UI,我也会看到鼠标光标等待指示。所以看来,除了BeginWaitCursor()之外,我还需要做一些其他事情来将光标保持为等待光标。 -
您可以动态创建
CWaitCursor对象,但由于您的主消息线程一直在运行,因此无论如何可能会替换光标。当您尝试获取网络连接时,您如何处理用户选择另一个菜单选项(或其他交互)?您可能需要求助于“连接到服务器”应用程序模式对话框。 -
@1201ProgramAlarm 在建立连接并启动之前,大多数菜单项都被禁用并变灰。在连接存在之前,用户唯一能做的就是退出。什么是“连接到服务器”应用程序模式对话框?此应用程序使用 UDP “连接”到目标计算机,这实际上涉及通知目标服务器需要创建新的通信会话并提供使用新会话所需的令牌。所有通信都是通过 UDP 而不是 TCP。
-
您创建等待光标,创建一个对话框或窗口,其中包含某种应用程序模式的消息(保留应用程序其余部分的输入),可能还有一个“取消”按钮。一旦建立连接并且您的线程终止,请关闭对话框。
标签: c++ mfc mouse-cursor