如何在win32api应用程序中使多行文本框的制表符停止工作

我有一个用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 ++来查找窗口样式是否有任何线索。 但是,如果唯一的区别是“Accept Tab”属性,则2个文本框的窗口样式是不同的。

Rightnow我找不到另一种方法来找到根本原因。 有人有线索吗? 任何帮助将不胜感激。

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; }