Сегодня начну серию постов посвященных формам необычного вида.
Внешним видом любой формы управляют несколько свойств. Наиболее важным, естественно, является дескриптор окна (Handle
). В данной заметке я хочу рассказать о том, как получить нестандартную овальную форму окна (вместо привычной прямоугольной, естественно).
Начну, пожалуй, с того, что существует определенный набор функций API, которые дают возможность изменять вид привычных окон. Разработчиками предусмотрена возможность создания прямоугольной области (CreateRectRgn
), правда, у существующих компонентов и так прямоугольная форма. Именно поэтому, куда больший интерес представляют собой функции CreateEllipticRgn
(она дает возможность создать область овальной формы) и CreatePlygonRgn
(она дает возможность создать область произвольной формы).
Для того чтоб задействовать данные функции, призванные изменить внешний вид формы, необходимо сначала задать область, а после передать ее в функцию SetWindowRgn
. В таком случае вид окна будет изменен в соответствии с переданной областью.
Например, окно овальной формы может быть получено следующим образом:
HRGN ellips = CreateEllipticRgn(start_x, start_y, width, height);
SetWindowRgn(Handle, ellips, TRUE);
где параметры start_x
и start_y
– начальные точки «вырезания» овальной формы, а width
и height
ширина и высота формы соответственно.
Единственный момент: следует помнить о том, что окна, имеющие необычную форму, лишаются своих заголовков, а также стандартных кнопок управления их размерами.
Возможность перемещения формы при помощи указателя мыши может быть реализована так:
long SC_DRAGMOVE = 0xF012;
ReleaseCapture();
SendMessage(Handle,WM_SYSCOMMAND,SC_DRAGMOVE,0);
Стандартные же кнопки могут быть заданы следующим образом:
Form1->WindowState=wsMinimized; // кнопка «свернуть»
Form1->WindowState=wsMaximized; // кнопка «развернуть»
Close(); // кнопка «закрыть»
В итоге, имеем вот такую форму.
Вот и все.