【问题标题】:Win32 GUI: tab-sequence for edit controlsWin32 GUI:编辑控件的选项卡序列
【发布时间】:2010-02-09 22:41:45
【问题描述】:

我有一个包含 10 个子编辑控件的窗口。我想通过按 Tab 键从一个编辑控件移动到另一个 - 我该怎么做?

我的意思是,即使我可以知道我是否按下了 tab 键,我如何找到下一个要关注的编辑控件?我希望我不必自己跟踪编辑控件,因为我已经将它们添加到父窗口中。

PS:“下一步”是指我创建编辑控件的顺序...

编辑:我在 Win32 上使用纯 C。

编辑 2:示例



#include 

#define NAME "test"

LRESULT CALLBACK WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    HWND edit1, edit2;
    switch (msg)
    {
        case WM_CREATE:
            edit1 = CreateWindow("edit", "", WS_CHILD|WS_VISIBLE, 0, 0, 200, 50, hWnd, NULL, NULL, NULL);
            edit2 = CreateWindow("edit", "", WS_CHILD|WS_VISIBLE, 250, 0, 200, 50, hWnd, NULL, NULL, NULL);
            return 0;

        case WM_CLOSE:
            DestroyWindow(hWnd);
            return 0;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASS wc;
    wc.style = 0;
    wc.lpfnWndProc = WinProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
    wc.lpszMenuName = NAME;
    wc.lpszClassName = NAME;
    RegisterClass(&wc);

    HWND win;
    win = CreateWindow(NAME, "test", WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, NULL, NULL, hInstance, NULL);

    ShowWindow(win, nCmdShow);
    UpdateWindow(win);

    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;

}

【问题讨论】:

  • 从原始 C Windows 编程的角度来看 - 选项卡顺序与它们添加到窗口的顺序不同(z 顺序)吗?您是否尝试将光标放在一个并按 Tab 键?
  • 是的,我做到了,它仍然在同一个控件中。
  • 如果您使用的是对话框,那么这可能会有所帮助 - stackoverflow.com/questions/50236/…
  • 不,我不知道。这只是一个简单的主窗口。
  • 你能显示一些代码吗?

标签: user-interface winapi


【解决方案1】:

对话框管理器为您做了很多这样的事情,所以如果您没有充分的理由创建自己的窗口类,您可以考虑改为创建一个对话框。

如果您仍然想自己滚动,则必须拦截 WM_CHAR 并寻找 VK_TAB 和 VK_SHIFT | VK_TAB。对话框管理器使用称为“z-order”的东西作为 Tab 键顺序 (http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#zorder)。

FWIW,我的建议是不要低估您在尝试像这样在 Windows 中重新创建现有设施时所承担的负担。对于您知道的每一种行为,通常至少有很多您不知道的行为。例如,您的应用程序将如何在基于笔的设备上运行?可访问性扩展呢?屏幕阅读器是否能够正确处理它?所有这些东西都已经融入到对话管理器中。

我不确定我是否跟随...我想 对话框只是一个浮动窗口 高于“常规”(?)之一。是吗 应用程序可能使用 只是一个对话框,而不是适当的 创建窗口()?

对话框可以是主应用程序窗口的模态或非模态子窗口,但它们也可以是主应用程序窗口。这通常称为基于对话框的应用程序。

如果你想要一个基于对话框的应用程序(即,一个以对话框为主窗口的应用程序),你可以这样做:

int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow )
{
    MSG msg;
    HWND hDlg = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
    if (hDlg != NULL)
    {
        ShowWindow(hDlg, SW_SHOWNORMAL);

        while (GetMessage(&msg, NULL, 0, 0)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return 0;
}

完整示例可能太长,无法在此处列出,但如果您使用 Google 搜索 CreateDialog,您应该会找到一些示例。

...有没有可能 在对话框中添加其他窗口? 即使使用自定义窗口程序? (换句话说,在对话中,我不是 仅限于默认值 控件,例如编辑和静态?)

是的,您可以在对话框中创建自定义控件。在 .rc 文件的 DIALOG 部分中,您可以包含以下内容:

CONTROL "",IDC_MYCUSTOM,"MyCtrlClassName",WS_TABSTOP,10,20,30,40

您还可以创建一个新控件并将其动态添加到对话框中(我将让您以 Google 为例)。

另外,如果我想自己动手,如何 我要找出下一个控件是什么? 我真的不认为会有 比基本桌面更多的用例

如果您想在对话框中按 Tab 键顺序循环控制控件,请使用 GetNextDlgTabItem():http://msdn.microsoft.com/en-us/library/ms645495%28VS.85%29.aspx

如果您自己滚动,那么您可能需要类似EnumChildWindows() 函数:http://msdn.microsoft.com/en-us/library/ms633494%28VS.85%29.aspx

这也可能有用:http://msdn.microsoft.com/en-us/library/bb775501%28VS.85%29.aspx

【讨论】:

  • 我不确定我是否遵循...我认为对话框只是“常规”(?)窗口上方的浮动窗口。应用程序是否可能只使用一个对话框,而不是正确的 CreateWindow()?是否可以在对话框中添加其他窗口?即使使用自定义窗口程序? (换句话说,在对话框中,我是否不仅限于默认控件,例如编辑和静态?)
  • 另外,如果我想自己动手,我如何找出下一个控件是什么?我真的认为不会有比基本桌面更多的用例......
【解决方案2】:

这种处理可以很容易地添加到应用程序中:- 在消息循环中添加对 IsDialogMessage() 的调用 - 所有控件都必须具有 WS_TABSTOP 样式。

父窗口可能必须属于对话框类,因为对话框窗口类存储状态,允许它(例如)在激活丢失和恢复时将焦点恢复到正确的控件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 2011-06-15
    • 2022-07-08
    相关资源
    最近更新 更多