gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:00:07 25 4
gpt4 key购买 nike

当我启用通用控件视觉样式支持 (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/

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