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

时间:2013-01-16 15:49:41

标签: c++ mfc cursor infinite-loop

我是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());


}
}

2 个答案:

答案 0 :(得分:4)

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

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

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

要解决此问题,您可以将代码拆分为新线程,或者更好的是,将其设计为完全消除循环。您的代码非常简单,这可以无环路完成:

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

答案 1 :(得分:0)

您应该使用OnMouseMove事件,并且只有在用户点击了开始时才更新编辑框。