我是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
事件,并仅在用户单击开始时更新编辑框