Edit Control響應全選(Ctrl+A)

來源:互聯網
上載者:User

MFC中的Edit控制項用於輸入資料,當輸入的資料為大段數位時候,全選功能就顯得很重要了,可偏偏在MFC中Edit控制項就不 支援全選,Ctrl+A不行,雙擊也不行。Ctrl+C和Ctrl+V都是預設支援的,因此為了使用方便,我們只能自己讓Edit去支援Ctrl+A全選 功能了。

實現的方式也比較簡單,自己處理訊息就是。Ctrl+A是一個組合訊息,在檢測到A或者a按鍵按下的時候,判斷Ctrl鍵的狀態,如果Ctrl鍵有效則說明使用者按下了Ctrl+A按鍵,這時候我們將Edit中內容設定為全選即可。


在類定義中添加:

BOOL PreTranslateMessage(MSG* pMsg);

實現如下:

<span style="color:#444444;">BOOL C***Dlg::PreTranslateMessage(MSG* pMsg){if (pMsg->message == WM_KEYDOWN){BOOL bCtrl = ::GetKeyState(VK_CONTROL) & 0x80;//BOOL bShift = ::GetKeyState(VK_SHIFT) & 0x80;//BOOL bAlt = ::GetKeyState(VK_MENU) & 0x80;switch (pMsg->wParam){case 'a':case 'A':if (bCtrl){</span><span style="color:#ff0000;">m_ctrLog.SetSel(0, -1); //或 SendDlgItemMessage(IDC_Log, EM_SETSEL, 0, -1);</span><span style="color:#444444;">}break;}}return CWnd::PreTranslateMessage(pMsg);}</span>

或:

BOOL C***Dlg::PreTranslateMessage(MSG* pMsg){if(pMsg->message == WM_KEYDOWN){BOOL b = GetKeyState(VK_CONTROL) & 0×80;if(b && (pMsg->wParam==’a'||pMsg->wParam==’A')){<span style="color:#ff0000;">SetSel(0,-1);//或 SendDlgItemMessage(IDC_Log, EM_SETSEL, 0, -1);</span>return TRUE;}}return CWnd::PreTranslateMessage(pMsg);}

備忘:

為了避免對使用的Edit一個個的進行處理,可以通過從CEdit類派生一個新類CEditEx類讓Edit支援Ctrl+A全選功能。


另外:

Ctrl + A 實現迴圈 全選/取消全選,雖然取消全選很簡單,一句話SetSel(-1),但痛點在於如何判斷取消全選的條件,代碼如下:

對於一個編輯框,實現它的全選和取消全選(前提:該編輯框獲得焦點)

建立一個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)與實際的全選狀態不一致。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.