C语言 win32api应用程序中多行文本框制表位的实现

qoefvg9y  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(91)

我这里有一个用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个文本框的窗口样式是相同的。
现在我找不到另一种方法来定位根本原因。有人有线索吗?任何帮助都将不胜感激。

zpf6vheq

zpf6vheq1#

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

相关问题