0

CEditコントロールにselectall(ctrl-a経由)を実装しようとしています。これを行うには、CEditを継承するクラスを作成し、次のようにWM_KEYDOWNのハンドラーを追加します。

void CEditExtended::OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags )
{   
  if((nChar == 0x41) && (GetKeyState(VK_CONTROL) & 0x8000) != 0))
    SetSel(0, -1);

  CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}

Webを見てみると、これは機能するはずですが、ctrlとaの両方を同時に登録することはありません。

4

3 に答える 3

3

このコードを試してください:

void CEditExtended::PreTranslateMessage(MSG* pMsg)
{
 if(pMsg->message == WM_KEYUP )
    {
        if ( (LOWORD(pMsg->wParam) & VK_CONTROL) == VK_CONTROL )
        {

         /// blah

        }
    }

    return CEdit::PreTranslateMessage(pMsg);
}
于 2011-11-22T10:00:27.003 に答える
2

ウィンドウ内のすべての編集コントロールにCtrl+Aを実装するには、オーバーライドCWnd::PreTranslateMessageしてキーシーケンスをチェックし、フォーカスが編集コントロールにあるかどうかを確認します。その場合は、そのテキストを選択します。

BOOL CMyWindow::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN && pMsg->wParam == 'A' && GetKeyState(VK_CONTROL) < 0) {
        if (auto edit = dynamic_cast<CEdit*>(GetFocus())) {
            edit->SetSel(0, -1, FALSE);
            return TRUE;
        }
    }
    return __super::PreTranslateMessage(pMsg);
}
于 2018-06-15T19:41:24.313 に答える
0

CEditクラスを拡張せずにCTRL+Aを実装する別の方法。

編集コントロールを持つダイアログのPreTranslateMessage()メンバー関数をオーバーライドします。

BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
{
    if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == 'A')
       && GetKeyState(VK_CONTROL) < 0)
    {
        CWnd *pWnd = GetFocus();
        if (pWnd != NULL)
        {
            CString className;

            GetClassName(pWnd->GetSafeHwnd(), className.GetBuffer(80), 80);
            className.ReleaseBuffer();
            if (className.CompareNoCase(_T("edit")) == 0)
            {
                pWnd->SendMessage(EM_SETSEL, 0, -1);
                return TRUE;
            }
        }
    }

    return CDialogEx::PreTranslateMessage(pMsg);
}
于 2015-11-21T06:53:30.797 に答える