c - 如何将子控件放置在组框内?

标签 c user-interface winapi

当我启用通用控件视觉样式支持 (InitCommonControls()) 并且我使用 Windows 经典主题之外的任何主题时,组框内的按钮显示为带有方角的黑色边框。

Windows 经典主题显示正常,当我关闭视觉样式时也是如此。

我正在使用以下代码:

group_box = CreateWindow(TEXT("BUTTON"), TEXT("BS_GROUPBOX"), 
    WS_CHILD | WS_VISIBLE | BS_GROUPBOX | WS_GROUP,
    10, 10, 200, 300,
    hwnd, NULL, hInstance, 0);

push_button = CreateWindow(TEXT("BUTTON"), TEXT("BS_PUSHBUTTON"),
    WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
    40, 40, 100, 22,
    group_box, NULL, hInstance, 0);

编辑:问题也出现在单选按钮上

编辑:我没有使用任何对话框/资源,只使用 CreateWindow/Ex。

我在 Visual C++ 2008 Express SP1 下编译,使用通用 manifest文件

Screenshot http://img.ispankcode.com/black_border_issue.png

最佳答案

问题是将 groupbox 作为控件的父级。 Groupboxes 不应该有任何子级,将它们用作父级会导致各种错误(包括绘画、键盘导航和消息传播)。只需更改按钮的 CreateWindow 调用中的父级 group_box hwnd (即对话框)。

我猜您使用 groupbox 作为父项,以便在其中轻松放置其他控件。正确的做法是获取 groupbox 客户区的位置,并将其映射到对话框的客户区。放置在生成的 RECT 中的所有内容都将出现在 groupbox 中。由于 groupboxes 实际上没有客户区,它可以用这样的方式计算:

// Calculate the client area of a dialog that corresponds to the perceived
// client area of a groupbox control. An extra padding in dialog units can
// be specified (preferably in multiples of 4).
//
RECT getClientAreaInGroupBox(HWND dlg, int id, int padding = 0) {
    HWND group = GetDlgItem(dlg, id);
    RECT rc;
    GetWindowRect(group, &rc);
    MapWindowPoints(0, dlg, (POINT*)&rc, 2);

    // Note that the top DUs should be 9 to completely avoid overlapping the
    // groupbox label, but 8 is used instead for better alignment on a 4x4
    // design grid.
    RECT border = { 4, 8, 4, 4 };
    OffsetRect(&border, padding, padding);
    MapDialogRect(dlg, &border);

    rc.left += border.left;
    rc.right -= border.right;
    rc.top += border.top;
    rc.bottom -= border.bottom;
    return rc;
}

请注意,这同样适用于 Tab 控件。他们也不是为成为 parent 而设计的,并且会表现出类似的行为。

关于c - 如何将子控件放置在组框内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/214553/

相关文章:

c - 如何在同一个变量中停止 while 循环进入

C:损坏的迭代器发送 D-BUS 信号

python - 屏幕截图程序-透明截图区域

c++ - 使用 C++ 在 Chrome 中获取事件选项卡 URL

c - 如何使用 OpenGL 按特定顺序绘制贴花?

c - C 中 malloc 的内存泄漏问题

c++ - Win32 : why does my PRINTDLG (or PRINTDLGEX) have gray background?

java - 为什么我的框架没有调整大小?

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

.net - vb 2008 WriteProcessMemory() 返回 0