【问题标题】:win32 select all on edit ctrl (textbox)win32全选编辑ctrl(文本框)
【发布时间】:2010-09-22 10:49:07
【问题描述】:

我正在使用这些选项创建我的文本框。我可以复制/剪切/粘贴/撤消,但是当我点击全选时,它并没有全选。我可以右键单击并单击 Select AllCTRL + 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);

【问题讨论】:

    标签: c++ user-interface winapi textbox


    【解决方案1】:

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

    下面是一些用于 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 代码。

    【讨论】:

    • 我的说“不包含“selectALL”的定义,并且找不到接受类型参数的扩展方法”
    • 我也收到与上述相同的错误消息。我需要在哪里粘贴这个 sn-p?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      编辑控件使用WM_CHAR 接受字符,而不是 WM_KEYDOWN 等你必须Translate()你的 消息,否则讽刺的是你不会 能够在编辑中编辑文本 控制。

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

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

      【讨论】:

      • 哇,谢谢,我想全选,这样我可以更快地复制文本。该链接向我显示了复制所需文本的 WM_COPY。谢谢!
      【解决方案4】:

      为什么不为 Ctrl+a 添加一个加速键到SelectAll

      【讨论】:

      • 我想我可以,但那是我要编写和学习如何做的更多代码。顺便说一句,我使用了 WM_COPY,这正是我想要的。将文本复制到剪贴板:)
      【解决方案5】:

      Ctrl+A 不是像 Ctrl+CCtrl 这样的内置加速器+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 函数(比较类名字符串)很笨拙,我想指责。

      【讨论】:

      • 此代码来自 MFC 应用程序。我必须重写 PreTranslateMessage 函数才能在 MFC 对话框类中实现这一点。在普通的 win32 消息循环中,您将对在那里收到的每条消息执行相同的任务,就在调用 TranslateMessage 之前。但随后您需要将 GetFocus 和 SetSel 函数转换为它们的 win32-api 原语。很抱歉造成混乱。
      【解决方案6】:

      奇怪的是 Ctrl+A 确实有效(全选),如果你不指定 ES_MULTILINE

      但如果你需要多行,那也无济于事

      MSDN documentation for ES_MULTILINE 似乎没有对此发表任何评论。

      【讨论】:

        【解决方案7】:

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

        根据 MSDN,

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

        所以,

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

        会正常工作。

        【讨论】:

          猜你喜欢
          • 2015-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多