gpt4 book ai didi

c - 如何使多行文本框的制表位在 win32api 应用程序中工作

转载 作者:行者123 更新时间:2023-12-05 01:32:41 24 4
gpt4 key购买 nike

我这里有一个用 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 测试,所以所有控件的制表位都不起作用。现在我已经完成了,除了上面的多行文本框之外,每个控件都可以。在其中按 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 中,创建带有工作制表位的多行编辑非常容易(这是文本框的默认行为,无论它是多行)。我曾尝试使用 spy++,以查找窗口样式中是否有任何线索。但是,如果唯一的区别是“Accept Tab”属性,则 2 个文本框的窗口样式是相同的。

现在我找不到其他方法来定位根本原因。有人有线索吗?任何帮助将不胜感激。

最佳答案

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

关于c - 如何使多行文本框的制表位在 win32api 应用程序中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24117221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com