我在这里用c编写了一个win32api应用程序。主窗口中的所有控件都是手动创建的,如下所示:
hEditSource = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", NULL,
WS_VISIBLE | WS_CHILD | WS_TABSTOP | ES_MULTILINE | ES_READONLY,
someLeft, someTop, someWidth, someHeight,
hWndMain, NULL, hInst, NULL);
最初,我没有在主消息循环中应用IsDialogMessage测试,因此所有控件的制表位都无法使用。现在我完成了,除了上面的多行文本框之外,每个控件都可以。确实,当按Tab键时,什么也不会发生。没有焦点移动,没有制表符插入(此后将丢弃只读样式)。
其他文本框都是单行的,如下所示:
editSearch = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", NULL,
WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL | WS_TABSTOP,
someLeft, someTop, someWidth, someHeight,
hWndMain, NULL, hInst, NULL);
似乎与多个线条样式相关的是原因。但是在C#winform中,使用有效的制表位可以轻松创建多行编辑(这是文本框的默认行为,无论它是多行)。我尝试使用spy ++,以查找窗口样式中是否有任何线索。但是,如果唯一的不同是“ Accept Tab”属性,则两个文本框的窗口样式相同。
现在,我找不到找到根本原因的另一种方法。有人有线索吗?任何帮助将不胜感激。
IsDialogMessage
控件的响应方式会影响的行为WM_GETDLGCODE
。作为记载,对于多行编辑控件以下是默认窗口过程返回:
DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTARROWS | DLGC_WANTALLKEYS
包括DLGC_WANTALLKEYS
停止IsDialogMessage
响应TAB并将焦点移至下一个控件。因此,您将需要对多行编辑控件进行子类化并删除该标志。子类化的窗口过程可能如下所示:
LRESULT CALLBACK MultiLineEditWndProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
LRESULT res = CallWindowProc(wpOld, hWnd, message, wParam, lParam);
switch (message)
{
case WM_GETDLGCODE:
res &= ~DLGC_WANTALLKEYS;
}
return res;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句