我是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());
}
}
答案 0 :(得分:4)
你正在阻止事件循环。你不能做一个需要用户干预才能在GUI线程中结束的循环 - 你需要在一个单独的线程中完成它。
实际上,您不应该在主线程中执行任何冗长的操作。
基本上,运行循环的同一个线程是负责显示和更新GUI的线程。因为这个线程现在正在等待GUI更新以退出循环和这个线程与应该更新GUI的线程相同,所以你有一个Catch-22,或者在程序员中说,死锁。
要解决此问题,您可以将代码拆分为新线程,或者更好的是,将其设计为完全消除循环。您的代码非常简单,这可以无环路完成:
答案 1 :(得分:0)
您应该使用OnMouseMove
事件,并且只有在用户点击了开始时才更新编辑框。