7

我正在使用这些选项创建我的文本框。我可以复制/剪切/粘贴/撤消,但是当我点击全选时,它并没有全选。我可以右键单击并单击全选,但CTRL+A不执行任何操作。为什么?

wnd = CreateWindow("EDIT", 0,
    WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL,
    x, y, w, h,
    parentWnd,
    NULL, NULL, NULL);
4

7 回答 7

6

Ctrl+不是像+和+A这样的内置加速器。这就是您看到定义了 WM_CUT、WM_PASTE 和 WM_COPY 消息但没有 WM_SELECTALL 的原因。CtrlCCtrlV

您必须自己实现此功能。我在我的 MFC 应用程序中是这样的:

static BOOL IsEdit( CWnd *pWnd ) 
{
    if ( ! pWnd ) return FALSE ;
    HWND hWnd = pWnd->GetSafeHwnd();
    if (hWnd == NULL)
     return FALSE;

    TCHAR szClassName[6];
    return ::GetClassName(hWnd, szClassName, 6) &&
         _tcsicmp(szClassName, _T("Edit")) == 0;
}

BOOL LogWindowDlg::PreTranslateMessage(MSG* pMsg) 
{
    if(pMsg->message==WM_KEYDOWN)
    {
        if ( pMsg->wParam=='A' && GetKeyState(VK_CONTROL)<0 )
        {
            // User pressed Ctrl-A.  Let's select-all
            CWnd * wnd = GetFocus() ;
            if ( wnd && IsEdit(wnd) )
                ((CEdit *)wnd)->SetSel(0,-1) ;
        }
    }   
    return CDialog::PreTranslateMessage(pMsg);
}

注意,我从这个页面偷了 IsEdit:http: //support.microsoft.com/kb/145616

我指出这一点,部分原因是我想表扬,部分原因是我认为 IsEdit 函数(比较类名字符串)很笨拙,我想指责。

于 2008-11-24T22:23:28.360 回答
4

您可以简单地使用 EM_SETSEL 消息到文本框,

根据 MSDN ,

如果开始为 0,结束为 –1,则选择编辑控件中的所有文本。如果开始为 –1,则取消选择任何当前选择。

所以,

SendMessage(hwndEdit,EM_SETSEL,0,-1);

会正常工作。

于 2013-04-04T23:21:42.737 回答
3

您需要捕获该击键并自己进行选择。

下面是一些用于 RichTextBox 的 C# 代码:

    protected override void OnKeyDown(KeyEventArgs e)
    {
        // Ctrl-A does a Select All in the editor window
        if (e.Control && (e.KeyCode == Keys.A))
        {
            this.SelectAll();
            e.Handled = true;
        }
    }

抱歉,我没有你的 Win32 代码。

于 2008-11-14T23:46:06.433 回答
3

我倾向于使用 MFC(请原谅我)而不是 Win32,所以我无法明确回答这个问题,但我注意到此评论添加到 MS 网站上有关与 Edit 控件(Edit 控件中的一个简单编辑器)交谈的页面中:

编辑控件WM_CHAR用于接受字符,而不是WM_KEYDOWN 等。您必须Translate()发送消息,否则讽刺的是您将无法在编辑控件中编辑文本。

我不知道这是否适用于 BoltBait 的回应,但我怀疑确实如此。

(我在http://msdn.microsoft.com/en-us/library/bb775462(VS.85).aspx找到了这个)

于 2008-11-15T01:25:30.477 回答
3

奇怪的是Ctrl+ ADOES 工作(全选),如果你不指定 ES_MULTILINE

但是,如果您需要多行,那将无济于事

ES_MULTILINE的MSDN 文档似乎对此没有任何说明。

于 2011-12-30T22:42:31.780 回答
0

会不会是别的东西在偷Ctrl+ A?使用 Spy++ 验证它是否到达您的编辑控件。

于 2008-11-14T23:56:11.173 回答
0

为什么不为Ctrl+ ato添加加速器SelectAll

于 2008-11-17T02:52:17.697 回答