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

时间:2014-06-09 09:22:55

标签: c winapi tabs

我在这里用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我找不到另一种找到根本原因的方法。有人有线索吗?任何帮助将不胜感激。

1 个答案:

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