我在这里用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测试,因此所有控件都是'制表符胜不了。现在我已经完成了,除了上面的多行文本框外,每个控件都可以。事实上,当按下标签时没有任何反应。没有焦点移动,没有标签字符插入(之后将丢弃只读样式)。
其他文本框都是单行文本框,如下所示:
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 ++来查找窗口样式是否有任何线索。但是,2个文本框'如果唯一的区别是"接受标签"窗口样式是缩进的。属性。
Rightnow我找不到另一种找到根本原因的方法。有人有线索吗?任何帮助将不胜感激。
答案 0 :(得分:5)
IsDialogMessage
的行为受控制如何响应WM_GETDLGCODE
的影响。作为documented,对于多行编辑控件,默认窗口过程返回以下内容:
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;
}