Как вы размещаете суб-элементы управления внутри группового блока? - PullRequest
3 голосов
/ 18 октября 2008

Когда я включаю поддержку визуального стиля общего элемента управления (InitCommonControls ()) и использую любую тему, кроме классической темы Windows, кнопки внутри группового блока отображаются с черной рамкой с квадратными углами.

Тема 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.

Я компилирую под Visual C ++ 2008 Express SP1 с общим манифестом файлом

Снимок экрана http://img.ispankcode.com/black_border_issue.png

Ответы [ 4 ]

4 голосов
/ 17 ноября 2008

Проблема в том, что групповой блок является родительским элементом управления. Предполагается, что у групповых ящиков не должно быть детей, и использование их в качестве родителей приведет к всевозможным ошибкам (включая рисование, навигацию с помощью клавиатуры и распространение сообщений). Просто измените родительский элемент в вызове кнопки 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. Они тоже не предназначены для того, чтобы быть родителями, и будут вести себя схожим образом.

1 голос
/ 18 октября 2008

Просто угадайте, но похоже, что вы наследуете стиль Static Edge или Client Edge от вашей темы. Я создаю большинство своих диалогов из редактора ресурсов и устанавливаю там эти свойства.

В вашем случае вы можете заменить CreateWindow на CreateWindowEx , чтобы установить эти расширенные стили, которые, вероятно, используются по умолчанию в CreateWindow. Специально проверить WS_EX_STATICEDGE, WS_EX_WINDOWEDGE and WS_EX_CLIENTEDGE

Редактировать: я предполагаю, что этого не происходит, потому что ваша кнопка - это элемент управления по умолчанию в диалоговом окне, который также дает черный край.

0 голосов
/ 24 октября 2008

Ааа, да черный фон с переключателями и групповыми полями. Хотя я не уверен, что это сработает для VC ++ 2008, но в то же время решение для тематических приложений VB6 заключалось в том, чтобы сначала поместить элементы управления радио в PictureBox (действительно общий контейнер), а затем добавить это к групповая коробка.

Стоит попробовать!

0 голосов
/ 22 октября 2008

Видимо, групповые блоки не предназначены для группировки элементов управления (будьте родительским hwnd)

Таким образом, чтобы избавиться от черных границ / проблем с рисованием, мне нужно было бы создать подкласс группы и реализовать WM_PAINT и WM_PRINTCLIENT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...