C++ Builder: создаем овальные формы

Сегодня начну серию постов посвященных формам необычного вида.

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

Начну, пожалуй, с того, что существует определенный набор функций API, которые дают возможность изменять вид привычных окон. Разработчиками предусмотрена возможность создания прямоугольной области (CreateRectRgn), правда, у существующих компонентов и так прямоугольная форма. Именно поэтому, куда больший интерес представляют собой функции CreateEllipticRgn (она дает возможность создать область овальной формы) и CreatePlygonRgn (она дает возможность создать область произвольной формы).

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

Например, окно овальной формы может быть получено следующим образом:

1
2
HRGN ellips = CreateEllipticRgn(start_x, start_y, width, height);
SetWindowRgn(Handle, ellips, TRUE);

где параметры start_x и start_y – начальные точки «вырезания» овальной формы, а width и height ширина и высота формы соответственно.

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

Возможность перемещения формы при помощи указателя мыши может быть реализована так:

1
2
3
long SC_DRAGMOVE = 0xF012;
ReleaseCapture();
SendMessage(Handle,WM_SYSCOMMAND,SC_DRAGMOVE,0);

Стандартные же кнопки могут быть заданы следующим образом:

1
2
3
Form1->WindowState=wsMinimized;	// кнопка «свернуть»
Form1->WindowState=wsMaximized;	// кнопка «развернуть» 
Close();			// кнопка «закрыть»

В итоге, имеем вот такую форму.

Овальное окно

Вот и все.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *