Re: [問題] 多個 EditBox 同步更新

看板C_and_CPP (C/C++)作者 (卡卡獸)時間12年前 (2014/03/08 20:50), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串2/2 (看更多)
抱歉這幾天較忙沒空上來看,然後回覆有點長,所以直接 reply ,見諒。 原推文引用

03/07 09:55,
overflow應該是hex改動->dec更新->hex更新->loop
03/07 09:55

03/07 09:56,
加些flag阻止更新觸發更新?
03/07 09:56
對,原文推指的 OV 是一樓意思,然後我 "原以為" 是不是有方法, 可以在 DoDataExchange 裡面直接判斷 flag,做更新即可, 發現好像不是我所想像。

03/07 10:25,
keyword = event:EN_UPDATE
03/07 10:25

03/07 12:37,
一定會繞路啦~~~ 然後你DDX更新時要有變數判斷 同一樓說法
03/07 12:37

03/07 12:38,
去判斷目前的FOCUS是哪一個BOX 免的重複更新
03/07 12:38
一開始 google 到所說的讓人覺得很簡單,所以想說是不是我哪裡判斷有誤, 看來還是多少會繞路。

03/07 13:32,
EN_SETFOCUS + EN_UPDATE 就完全避開了,也不需要 polling
03/07 13:32

03/07 14:35,
有考慮用 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

03/10 08:51, , 1F
你需要的是另外兩個 keyword: GetFocus, GetDlgCtrlID
03/10 08:51, 1F

03/11 22:49, , 2F
已完成 , 謝謝 h 大 :D
03/11 22:49, 2F
文章代碼(AID): #1J6n8Hd9 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1J6n8Hd9 (C_and_CPP)