当启用通用控件视觉样式支持(InitCommonControls())且使用Windows Classic Theme以外的任何主题时,组框内的按钮将显示为带有黑色正方形边框的边框。

Windows Classic主题以及关闭视觉样式时均显示正常。

我正在使用以下代码:

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。

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

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

最佳答案

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

我猜想您将groupbox用作父项,以便将其他控件轻松放置在其内部。正确的方法是获取组框工作区的位置并将其映射到对话框的工作区。然后,放置在生成的RECT中的所有内容都将出现在组框内。由于组框实际上没有客户区,因此可以使用以下方法进行计算:

// 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控件。他们也并非被设计为父母,并且会表现出类似的行为。

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

10-13 05:22