Auto Complete (Cont.)

Posted: 一月 12, 2008 in 技術相關
標籤:,

My Auto Complete

上一篇靈感 發現其實 之前提到缺乏的 “Simulate Table" & “KeyBoard Action" 部分

可以藉由該方式完成 於是週末又開始著手修改 Auto Complete 的小程式 …

其中 Simulate Table 是利用將 CListCtrl 的 “Column header" & “border" 拿掉

再加上下面這行來模擬的

GetDlgItem(Resource_ID)->EnableWindow(SW_HIDE/SW_SHOW);

至於 Keyboard Action 部分就是透過上面一篇所提到之

PreTranslateMessage(MSG* pMsg);

藉由改寫該 function 來實現的…

要抓取的 Keyboard Aaction包括有 DOWN(VK_DOWN)、UP(VK_UP)、ENTER(VK_RETURN) [reference]

除了研究 Auto Complete 的 BEHAVIOR 外 上面這些部分 還不算困難的部分….

讓我最頭痛的地方是 如何在 “按鍵 DOWN" 按下後 CListCtrl的 Selection & Focus 問題

後來在求救 Google 大神後找到 CListCtrl 的這個 Class Membe::SetItemState

  • Set Focus & Selection

m_Hide.SetItemState(idx, LVNI_SELECTED | LVIS_FOCUSED, LVNI_SELECTED | LVIS_FOCUSED);

  • Cancel Focus & Selection

m_Hide.SetItemState(idx, 0, LVNI_SELECTED | LVIS_FOCUSED);

透過上面兩個 Method 可以設定 List 欄位的選取與否 !

但實作後又碰到一個問題 就是雖然選取了欄位 (ps: focus -> 虛線選取)

但不會出現滑鼠點下後 那種欄位反白的效果….

這點又花了 我滿久的時間去找答案 最後還是在 Google 大神的幫助下找到原來在

SetItemState 後只需要再將 List 給 ->SetFocus() 即可 !

因此現在這版本 再輸入字串時 如果有符合資料者 Simulate Table 會自動顯示出來

按鍵 UP/DOWN 可以進入 Simulate Table 去選取符合之資料….

按下 ENTER 鍵後 會關閉 Simulate Table 並將選取值傳回 CEditCtrl 中 ….

尚未解決的問題還有

  1. 我不知道 ->SetFocus() 回 CEditCtrl 後 要如何將游標移至輸入字串之最後 @@"
  2. MouseOver 選取問題 …

這還要在花點時間研究一下~

Anyway 一樣小程式分享於下

Compiler 平台一樣是 Visual C++ 6.0

找資料時摸到一些不錯的網站 分享如下

20080322 

尚未解決問題一其實一樣的觀念透過與視窗 component 對話 sendmessage 即可

先抓到 EditBox 的 handle 在送一個 VK_END 鍵給他, 如下所示

:: SendMessage(hName, WM_KEYDOWN, VK_END, 0);

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s