Как создать окно с изменяемым размером с закругленными углами в win32 - PullRequest
1 голос
/ 04 февраля 2010

Я пытаюсь создать окно Win32, которое имеет закругленные углы и изменяет размер как по горизонтали, так и по вертикали. Мой первый подход состоял в том, чтобы создать BITMAP из скругленного прямоугольника и нарисовать его на экране вместе с установкой стиля окон WS_EX_LAYERED и установкой для ключа прозрачности внешнего цвета округленного прямоугольника.

Это работает, но выглядит хорошо, только если окно имеет фиксированный размер. Если я позволю пользователю изменить размер окна и растянуть растровое изображение вместе с ним, закругленные углы тоже будут выглядеть растянутыми. Есть ли способ создать окно с красивыми, гладкими закругленными углами и изменяемого размера в окнах? В конце концов, я также хотел бы добавить тень к окну.

Ответы [ 3 ]

3 голосов
/ 04 февраля 2010

Я бы попытался смешать функции Windows API CreateRoundRectRgn и SetWindowRgn . Очень простой пример можно найти на сайте pInvoke.net.

2 голосов
/ 04 февраля 2010

Вы можете создать окно без какого-либо фрейма, использовать WS_EX_LAYERED для получения прозрачности, затем либо нарисовать окно, включающее ваш пользовательский фрейм "обычно" в WM_PAINT, либо вы создаете закадровое растровое изображение, и используете UpdateLayeredWindow (последний метод более эффективен).

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

Кроме того, вы можете обработать WM_NCHITTEST, чтобы назначить функциональность "title" / "border" / "corner" (т. Е. Перемещать и изменять размер окна) для произвольных областей вашего окна.

1 голос
/ 04 февраля 2010

Вместо того, чтобы рисовать угол с уже существующим растровым изображением, вам нужно / нужно нарисовать эллипс (или любой другой) в правильной форме, а затем скомпоновать его с экраном. Например, вы можете выбрать эллипс, каждый радиус которого составляет 5% от размера окна в этом направлении.

...