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