我这里有一个用c写的win32 api应用程序。主窗口中的所有控件都是手动创建的,如下所示:
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 stop都不起作用。现在我已经完成了,除了上面的多行文本框外,每个控件都很好。事实上,在其中按tab时没有任何React。没有焦点移动,没有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中,创建一个多行编辑与工作tab-stop是很容易的(这是一个文本框的默认行为,无论它是多行)。我试着使用spy++,看看是否有任何线索在窗口样式。然而,如果唯一的区别是“Accept Tab”属性,2个文本框的窗口样式是相同的。
现在我找不到另一种方法来定位根本原因。有人有线索吗?任何帮助都将不胜感激。
1条答案
按热度按时间zpf6vheq1#
IsDialogMessage
的行为受控件如何响应WM_GETDLGCODE
的影响。与documented一样,对于多行编辑控件,默认窗口过程返回以下内容:字符串
包含
DLGC_WANTALLKEYS
会阻止IsDialogMessage
响应TAB并将焦点移动到下一个控件。因此,您需要将多行编辑控件子类化并删除该标志。子类化的窗口过程可能如下所示:型