我正在使用这些选项创建我的文本框。我可以复制/剪切/粘贴/撤消,但是当我点击选择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);
答案 0 :(得分: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字符串)是愚蠢的,我想要责备。
答案 1 :(得分: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代码。
答案 2 :(得分:3)
奇怪的是 Ctrl + A DOES工作(全选),如果你没有指定ES_MULTILINE
但如果您需要多线
,这无济于事MSDN documentation for ES_MULTILINE似乎没有说明这一点。
答案 3 :(得分:2)
我倾向于使用MFC(原谅我)而不是win32所以我无法明确地回答这个问题,但我注意到这个评论被添加到MS网站上的一个页面上,该页面与Edit控件(编辑控件中的一个简单编辑器)交谈:
编辑控件使用WM_CHAR 接受字符,而不是WM_KEYDOWN 等你必须翻译()你的 消息或讽刺的是你不会 能够编辑编辑中的文本 控制。
我不知道这是否适用于BoltBait的回复,但我怀疑是这样。
(我在http://msdn.microsoft.com/en-us/library/bb775462(VS.85).aspx发现了这个)
答案 4 :(得分:2)
您只需将EM_SETSEL消息用于文本框
即可根据MSDN,
如果开始为0且结束为-1,则选择编辑控件中的所有文本。如果开始为-1,则取消选择任何当前选择。
所以,
SendMessage(hwndEdit,EM_SETSEL,0,-1);
工作正常。
答案 5 :(得分:0)
可能是其他东西正在窃取 Ctrl + A ?使用Spy ++验证它是否到达您的编辑控件。
答案 6 :(得分:0)
为什么不为 Ctrl + a 添加加速器到SelectAll
?