2013-01-16 43 views
0

我是MFC新手,正在製作一個簡單的程序,它將不斷更新兩個編輯框。編輯框包含鼠標光標的x和y座標。程序只在開始按鈕被點擊時開始抓住光標座標,當點擊停止按鈕時它應該停止。但只要我點擊開始按鈕,整個窗口就會凍結。如何在MFC中連續運行不凍結窗口的函數?

這是我到目前爲止有:

//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()); 


} 
} 

回答

4

您阻止事件循環。你不能做一個需要用戶干預的循環才能在GUI線程中結束 - 你需要在一個單獨的線程中完成。

事實上,你不應該在主線程中執行任何冗長的操作。

基本上,運行循環的線程是負責顯示和更新GUI的線程。因爲此線程現在正在等待GUI更新以退出循環此線程與應該更新GUI的線程相同,所以您有Catch-22或在程序員說話時出現死鎖。

要解決此問題,可以將代碼拆分爲新線程,或者更好地設計它以完全消除循環。您的代碼非常簡單,並且可以循環完成:

  • 單擊開始:設置標誌。
  • 在鼠標移動上:更新x,y座標文本如果標誌被設置。沒有循環!
  • 點擊停止:取消設置標誌。
+0

謝謝!這工作得很好,現在唯一的問題是光標座標只有在光標在撥號盒內時纔會顯示。無論光標在屏幕上的什麼位置,有沒有辦法獲得座標? – xcdemon05

+1

@xcdemon你將不得不使用定時器回調或第二個線程來解決這個問題。 –

0

您應該使用OnMouseMove事件,並且只有當用戶點擊了開始時才更新編輯框。

+0

使用OnMouseMove,只要moise指針位於CmfcpixelDlg窗口內,您就只會獲得移動。 –

+0

@MichaelWalz是的,但這在OP的問題中似乎沒有問題 – Smash