對於一個編輯框,實現它的全選和取消全選(前提:該編輯框獲得焦點)
建立一個dialog based MFC application, 命名為“d1”,介面如下:
為對話方塊類添加一個成員變數:bool m_bSelectAll;用於控制全選狀態。另外重載對話方塊類的PreTranslateMessage事件,添加如下代碼:
BOOL CD1Dlg::PreTranslateMessage(MSG* pMsg) {if((GetAsyncKeyState(VK_CONTROL) & 0x8000) && (GetAsyncKeyState('A') & 0x8000) && pMsg->hwnd == m_pEdit->m_hWnd){if(m_bSelectAll){m_pEdit->SetSel(-1);// 取消全選}else{m_pEdit->SetSel(0, -1);// 全選}m_bSelectAll = !m_bSelectAll;return TRUE;}return CDialog::PreTranslateMessage(pMsg);}
這樣,當編輯框獲得焦點時,如果再按下Ctrl+A,編輯框的內容就會被“全選”或“取消全選”。
但是上面以m_bSelectAll來作為判斷是否“已經處於全選”狀態有個問題,那就是當全選時,使用者點擊編輯框而取消了全選,但這時,m_bSelectAll卻還處於全選狀態,也就是說這個標誌(m_bSelectAll)與實際的全選狀態不一致。所以採用了另外的方法來驗證是否處於全選狀態(就是選中內容的長度與編輯框內容長度是否一致),代碼如下:
BOOL CD1Dlg::PreTranslateMessage(MSG* pMsg) {if(pMsg->hwnd == m_pEdit->m_hWnd && (GetAsyncKeyState(VK_CONTROL) & 0x8000) && (GetAsyncKeyState(_T('A')) & 0x8000)){CString txt;int start, end;m_pEdit->GetWindowText(txt);m_pEdit->GetSel(start, end);if(txt.GetLength() == end - start)// 處於全選狀態{m_pEdit->SetSel(-1);// 取消全選}else{m_pEdit->SetSel(0, -1);// 全選}return TRUE;}return CDialog::PreTranslateMessage(pMsg);}
說明:GetAsyncKeyState()只檢查一個鍵是否被按下,而不區分大小寫!