如何在 MFC 中连续运行不冻结窗口的函数?



我是MFC的新手,正在制作一个简单的程序,将不断更新两个编辑框。编辑框包含鼠标光标的x和y坐标。程序只有在单击开始按钮时才开始抓取光标坐标,并且在单击停止按钮时应该停止。但是我一按开始键,整个窗口就死机了。

到目前为止我写的是:

//Way up high in the code:
#include <windows.h>
//way down low in the code
void CmfcpixelDlg::OnBnClickedButtonStart()
{
POINT p;
CString x;
CString y;
int px;
int py;
while(stop == false){
    GetCursorPos(&p);
    px = p.x;
    //convert x coordinate to a CString
    x.Format(L"%d", px);
    //convert y coordinate to a CString
    py = p.y;
    y.Format(L"%d", py);
    m_x.SetWindowTextW(x.GetBuffer());
    m_y.SetWindowTextW(y.GetBuffer());

}
}

您正在阻塞事件循环。你不能做一个需要用户干预才能在GUI线程中结束的循环——你需要在一个单独的线程中完成它。

事实上,你不应该在主线程中执行任何冗长的操作。

基本上,运行循环的线程就是负责显示和更新GUI的线程。因为这个线程现在正在等待GUI更新退出循环,这个线程是应该更新GUI的同一个线程,你有一个Catch-22,或者用程序员的话来说,死锁。

要解决这个问题,您可以将代码拆分为一个新线程,或者更好的是,将其设计为完全消除循环。您的代码相当简单,并且可以在没有循环的情况下完成:

  • 单击开始:设置标志。
  • 当鼠标移动时:如果设置了标志,则更新x, y坐标文本。没有循环!
  • 点击停止按钮:取消标志设置。

您应该使用OnMouseMove事件,并仅在用户单击开始时更新编辑框

相关内容

  • 没有找到相关文章

最新更新