Получение свойств темы строк группового блока

#windows #winapi #groupbox

#Windows #winapi #groupbox

Вопрос:

Моя цель — нарисовать групповое поле, которое не является прямоугольным, а вместо этого имеет срезанные углы. Я имею в виду не просто обрезку углов, а скорее непрерывный замкнутый контур, где углы «с отступом». Я хочу, чтобы это соответствовало цветам / стилю текущей темы.

Я заметил в Windows XP, что в групповом блоке есть серые линии размером в 1 пиксель, но в Windows 7 есть 3D-эффект, создаваемый наличием серой линии рядом с белой линией (белая линия внутри, за исключением нижней части, где она находится под серой линией).

Вы можете получить цвет текстовой метки группового поля, используя что-то вроде этого:

 COLORREF cref;
GetThemeColor(hTheme, BP_GROUPBOX, GBS_NORMAL, TMT_TEXTCOLOR, amp;cref);
  

Итак, я пытаюсь выяснить, как получить цвет (ы) и / или свойства линий, используемых в групповом блоке, а затем (я надеюсь) иметь возможность рисовать нужные мне линии, соответствующие стилю группового блока, отдельно рисуя каждый элемент нужной мне формы. Я не уверен, какие свойства используются для описания линий или будут ли функции line drawRect создавать 3D-эффект подходящим пером. Есть ли способ настроить перо для рисования этих 3D-эффектов (параллельных линий с двумя оттенками)?

Спасибо.

Комментарии:

1. Групповое окно не обращает внимания на тему, они всегда серые и белые, независимо от цвета фона окна. Попробуйте. Недоступно из тематического API. Просто жестко запрограммируйте их.

2. В классической теме Windows они имеют квадратные углы. В Windows XP 7 они округлены. И цвет текстовой метки явно меняется при изменении цвета темы. Я не могу использовать жесткий код, потому что тогда они не будут соответствовать другим групповым блокам в разных темах или версиях Windows.

Ответ №1:

Что я всегда нахожу неожиданным в групповых блоках, так это то, что на самом деле они представляют собой стиль кнопок. (BS_GROUPBOX).

Тематические групповые поля (XP и более поздние версии с выключенным классическим режимом) используют часть темы BP_GROUPBOX в VSCLASS_BUTTON. Для получения и отрисовки можно использовать обычные API-интерфейсы темы. Если вашему групповому полю нужен текст, вы можете использовать DrawThemeText.

Существуют API для рисования нетематических групповых блоков (например, DrawEdge), но я не помню деталей, и маловероятно, что они вам понадобятся.

Как обычно, я укажу, что воспроизвести поведение элементов управления всегда сложнее, чем вы думаете.

Мартин

Комментарии:

1. Спасибо. Вы имеете в виду DrawThemeEdge? Как мне получить правильные параметры uEdge и uFlags для этой функции?

2. Я обнаружил, что DrawThemeBackground с использованием iPartId ==BP_GROUPBOX ==4 и iStateId == GBS_NORMAL ==1 рисует соответствующую границу группового поля. Эта функция принимает прямоугольную форму * и прямоугольную форму отсечения *, поэтому я должен быть в состоянии собрать воедино нужную мне форму.