RT。
背景就是想寫一個仿真機器人運動平臺,為了實作機器人運動,打算通過定時器每隔200ms左右讓機器人運動一段距離。
//開始運動
void CRobotsDlg::OnBnClickedStart()
{
// TODO: 在此添加控制元件通知處理程式代碼
SetTimer(1,200,NULL);
//MessageBox(TEXT("111"));
}
void CRobotsDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加訊息處理程式代碼和/或呼叫默認值
switch (nIDEvent)
{
case 1:
MoveRobots();
break;
}
CDialogEx::OnTimer(nIDEvent);
}
然后訊息回應也添加了。debug的時候,斷點設定在SetTimer和MessageBox那邊都沒問題,但設定在switch這里就到不了了。
uj5u.com熱心網友回復:
沒有遇到過,程式沒有問題,是不是其他影響的uj5u.com熱心網友回復:
在switch之前加些代碼看看,能進ontimer這個函式沒,如果不能進可能ontimer函式添加不正確uj5u.com熱心網友回復:
switch (*nIDEvent)uj5u.com熱心網友回復:
樓主確定添加ON_WM_TIMER()了么?uj5u.com熱心網友回復:
switch前的代碼也沒反應,應該是進入不了OnTimer函式
uj5u.com熱心網友回復:
添加了啊=。=
uj5u.com熱心網友回復:
蛤?什么意思啊
uj5u.com熱心網友回復:
UINT_PTR nIDEventnIDEvent的型別既然是指向UINT的指標,那么*nIDEvent是取nIDEvent所指的UINT值。
提醒:訊息映射加了嗎?
BEGIN_MESSAGE_MAP(CRobotsDlg, CDialog)
//{{AFX_MSG_MAP(CRobotsDlg)
...
ON_WM_TIMER()
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
uj5u.com熱心網友回復:
void CRobotsDlg::OnTimer(UINT_PTR nIDEvent)應改為
void CRobotsDlg::OnTimer(UINT nIDEvent)
switch (nIDEvent)
uj5u.com熱心網友回復:
特別又重新添加了一遍,ON_WM_TIMER()確定添加了(⊙﹏⊙)
UINT_PTR改了也沒用,關鍵還是進入不了OnTimer
uj5u.com熱心網友回復:
“:關鍵還是進入不了OnTimer:”WM_TIME 訊息 優先度 很低,程式 是不是 有 很多訊息 要處理 ?
uj5u.com熱心網友回復:
BEGIN_MESSAGE_MAP(CRobotsDlg, CDialogEx)//{{AFX_MSG_MAP(CRobotsDlg)
...
ON_WM_TIMER()
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
uj5u.com熱心網友回復:
代碼一點問題都沒有。UINT_PTR 和UINT ,也不是重點。自動添加的函式,不用刻意去改動。除非先生成代碼,后來又升級版本,否則不用理這個。
懷疑你的系統設定有問題。比如某些流氓軟體劫持或屏蔽了定時器,再有一個就是你的訊息太多,而定時器訊息的級別不夠,但一般不會的。
uj5u.com熱心網友回復:
檢查SetTimer回傳值看是否設定成功,如果不成功呼叫GetLastError.uj5u.com熱心網友回復:
修改SetTimer(1,200,NULL);里面的iduj5u.com熱心網友回復:
好像的確有好多訊息=。=就是要不停的在picture control上畫圓再擦去。。。有處理辦法么。。
uj5u.com熱心網友回復:
改id沒用啊親w
uj5u.com熱心網友回復:
"就是要不停的在picture control上畫圓再擦去"怎么做到的 ?
uj5u.com熱心網友回復:
就是先畫個圓,再獲取背景色,用等大的圓覆寫。。
uj5u.com熱心網友回復:
“要不停的” 怎么做到的 ?uj5u.com熱心網友回復:
直接放回圈里。。
uj5u.com熱心網友回復:
在 回圈里 加一句void DoEvents()
{
MSG msg;
// Process existing messages in the application's message queue.
// When the queue is empty, do clean up and return.
while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{// has msg
if (!AfxGetThread()->PumpMessage()) break;
}
}
否則訊息被 阻塞
uj5u.com熱心網友回復:
設定時間長一點,而且1這個不太好,下斷點除錯一下uj5u.com熱心網友回復:
vs 有時候故障,可以重啟試試uj5u.com熱心網友回復:
樓主解決了嗎?我也遇到了這個問題,求教uj5u.com熱心網友回復:
應該就是你的這個東西導致的timer訊息不回應. 你去掉這部分代碼再看看吧. 如果去掉后可以.那么你就需要修改這部分實作了. 使用執行緒來實作耗時操作, 不要用看似NB的訊息回圈.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/156041.html
標籤:基礎類
上一篇:MFC中的webBrowser.Navigate,用它打開一個ppt或者word檔案
下一篇:MFC 如何判斷按鈕點擊次數
