看板 C_and_CPP 關於我們 聯絡資訊
抱歉這幾天較忙沒空上來看,然後回覆有點長,所以直接 reply ,見諒。 原推文引用
azureblaze:overflow應該是hex改動->dec更新->hex更新->loop03/07 09:55
azureblaze:加些flag阻止更新觸發更新?03/07 09:56
對,原文推指的 OV 是一樓意思,然後我 "原以為" 是不是有方法, 可以在 DoDataExchange 裡面直接判斷 flag,做更新即可, 發現好像不是我所想像。
hichcock:keyword = event:EN_UPDATE03/07 10:25
damody:一定會繞路啦~~~ 然後你DDX更新時要有變數判斷 同一樓說法03/07 12:37
damody:去判斷目前的FOCUS是哪一個BOX 免的重複更新03/07 12:38
一開始 google 到所說的讓人覺得很簡單,所以想說是不是我哪裡判斷有誤, 看來還是多少會繞路。
hichcock:EN_SETFOCUS + EN_UPDATE 就完全避開了,也不需要 polling03/07 13:32
worldlet:有考慮用 SetWindowText() 嗎 ?03/07 14:35
後來我有先實作另一種功能還不錯的,鑑於 Code 沒在身邊講原理。 主原理即如 hichcock 所述,我在 data member 裡多了三個變數, bool m_bActiveOct, m_bActiveDec, m_bActiveHex ; 在 EN_SETFOUCUS 時更新這三支變數,然後在 EN_CHANGE 時 (這裡用 EN_CHANGE 和 EN_UPDATE 應該沒什麼差別吧?) 看 flag 做更新, Code 大致如下 -------- void CMyDlg::OctSetFocus() { m_bActiveOct = true; m_bActiveDec = false; m_bActiveHex = false; } void CMyDlg::OctChange() { if(m_bActiveOct) { char szBuf[256] ; GetWindowText(IDC_OCT, m_strOct); if( 1 == sscanf(m_strOct.GetBuffer() , "%o", &m_uVal) { sprintf(szBuf, "%x", m_uVal) ; SetWindowText(IDC_HEX, szBuf); sprintf(szBuf, "%u", m_uVal) ; SetWindowText(IDC_DEC, szBuf); } else { SetWindowText(IDC_HEX, "error"); SetWindowText(IDC_DEC, "error"); } } } ------------ 問題變成:這樣如果再多一個二進位、四進位、32 進位 UI (這是引例,未來可能會擴充),這種設計模式不就變得很尷尬? 到時要再新增修改的東西不少?是否有改善空間? 目前想到的改善空間其實蠻有限的, 把 EN_SETFOCUS 全都引到同一 function 更新 flag, 但不見得比較方便 XD 還是其實這是省不掉的部份? 謝謝各位不吝賜教,感激不盡。 -- ~ 這輩子與神手無緣 我只好當神獸了 ~ 卡卡獸 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.74.188
hichcock:你需要的是另外兩個 keyword: GetFocus, GetDlgCtrlID 03/10 08:51
EdisonX:已完成 , 謝謝 h 大 :D 03/11 22:49