win32选择全部编辑ctrl(文本框)

问题描述 投票:4回答:7

我正在使用这些选项创建我的文本框。我可以复制/剪切/粘贴/撤消,但是当我点击选择A时它不会全部选择。我可以右键单击并单击选择所有但是ctrl a does does do what,为什么?

        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);
user-interface winapi textbox
7个回答
2
投票

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

编辑控件使用WM_CHAR接受字符,而不是WM_KEYDOWN等。您必须翻译()您的消息,否则您将无法编辑编辑控件中的文本。

我不知道这是否适用于BoltBait的回复,但我怀疑是这样。

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


6
投票

Ctrl + A不是像Ctrl + C和Ctrl + V这样的内置加速器。这就是为什么你看到定义WM_CUT,WM_PASTE和WM_COPY消息,但没有WM_SELECTALL。

您必须自己实现此功能。我在我的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函数(比较classname字符串)是愚蠢的,我想要责备。


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代码。


3
投票

奇怪的是,如果你没有指定ES_MULTILINE,Ctrl + A DOES可以工作(如全选)

但是,如果您需要多线,这无济于事

MSDN documentation for ES_MULTILINE似乎没有说明这一点。


2
投票

您可以简单地将EM_SETSEL消息用于文本框,

根据MSDN,

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

所以,

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

会工作得很好。


0
投票

可能是其他东西正在窃取Ctrl + A?使用Spy ++验证它是否到达您的编辑控件。


0
投票

为什么不为Ctrl + a添加加速器到SelectAll

© www.soinside.com 2019 - 2024. All rights reserved.