關於如何實現編輯框單擊時自動選中全部內容的方法
我們在利用編輯框做輸入時,經常需要修改輸入內容,希望滑鼠單擊時能夠自動選中當前的內容,以便可以直接進入輸入新的內容,而不用先把原來內容刪除掉再輸入新的內容。實現這個功能有兩個方法:
一、利用標準編輯框控制元件的SETFOCUS訊息,做一個訊息函式,在函式內部給編輯框傳送選中文字的訊息EM_SETSEL。具體做法是:
1.給編輯框增加一個控制元件CEdit型別的變數,這樣便於訪問編輯框,設為m_ed,增加變數時Category選擇control,variable選擇CEdit。再在編輯框右鍵單擊,選擇Class Wizard,在Message Maps標籤下,找到編輯框ID,假設是IDC_EDIT1,對應的訊息選擇SETFOCUS,然後Add Function,再Edit Code,在函式體內部加入下面的語句:
m_ed.PostMessage(EM_SETSEL, 0, -1);
此時再執行編譯程式,就會發現在用滑鼠單擊編輯框時,它會自動選擇當前的所有文字,可以直接輸入新的內容。
2.如果不想給編輯框增加控制元件型的變數,通過它的容器,比如對話方塊也完全可以做到,因為對話方塊有一個成員函式GetDlgItem(),根據給定的控制元件ID,也可以找到編輯框。這種情況下,上面的語句可以修改為:
GetDlgItem(IDC_EDIT)->PostMessage(EM_SETSEL, 0, -1);
同樣可以實現自動選中當前內容的功能,只不過省略了一個成員變數而已。
二、由於標準編輯框不接受滑鼠單擊訊息,可以考慮從CEdit類派生一個新類CNewEdit,給這個新類增加一個訊息處理器,讓它能接受滑鼠單擊訊息,在滑鼠單擊訊息的響應函式中給編輯框傳送選擇全部文字的訊息。具體做法是:
在對話方塊上點選右鍵,選擇Class Wizard, 在Member Variable標籤下使用Add Class,選擇New, Class information欄目填入新類的名稱CNewEdit,Base class選擇CEdit,爾後選擇OK。這樣就加入了一個派生於CEdit的新類CNewEdit。回到Class View中,在CNewEdit上單擊右鍵,選擇Add Windows Message Handler...,在新建Windows訊息中找到WM_LBUTTONDOWN,然後Add Handler,再Edit code,在訊息處理函式中加入下列語句:
PostMessage(EM_SETSEL, 0, -1);
這樣,派生的新類CNewEdit就具有了單擊時自動選擇當前內容的功能,從它產生的物件自然也具有這種功能。
再給編輯框增加一個控制元件型別的變數,變數型別選擇CNewEdit,OK就可以了。實際上這個變數僅僅是把編輯框和產生的新類CNewEdit聯絡在一起的鈕帶。
以上兩種實現方法各有利弊,如果只有一個編輯框需要此功能,選用第一種方法比較好。如果有多個編輯框要實現此功能,使用派生新類的方法更簡單一些,不用給每個編輯框增加訊息SETFOCUS的處理函數了。