→ 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