Консультация № 65007
01.12.2006, 01:05
0.00 руб.
0 1 1
Прошу помощи.
Как в Visual C++ можно сделать обычное диалоговое окно округлой формы ?
Тоесть диалоговое окно слегка с округлыми (тупыми) углами, примерно как в Windows XP
Приведите пожалуйста кусочек кода этой функции с комментариями

Обсуждение

Неизвестный
01.12.2006, 15:42
общий
это ответ
Здравствуйте, Visualss!
В windows для этого используются регионы.
Можете поискать статью на RSDN.ru про регионы для более кокретной информации, с примерами на WINAPI и MFC.

Суть в том, что для окна нужно установить новый регион.
В windows есть специальные функции, которые создают регион по заданным в них параметрам.
Регионы можно склеивать различными способами. То есть например создать пару регионов слева и справа (центр оставить пустым) и соединить их. После установки такого региона можно будет наблюдать куски окна справа и слева, а в центре ничего не будет. Конечно приминить это для чего-то трудно, но главное возможности, а их много.

Теперь конкретнее разбирем ситуацию вашего случая.
В WINAPI для работы с регионами предназначен хендл HRGN, в MFC класс CRgn.
Список функций для создания регионов в классе CRgn
CombineRgn
CreateEllipticRgn
CreateEllipticRgnIndirect
CreateFromData
CreateFromPath
CreatePolygonRgn
CreatePolyPolygonRgn
CreateRectRgn
CreateRectRgnIndirect
CreateRoundRectRgn << тебе нужна эта функция, она и создает прямоугольник с закгругленными углами.

Вот ее описание:
BOOL CreateRoundRectRgn(int x1,int y1,int x2, int y2, int x3,int y3);
Первые 4 параметры это left,top,right,bottom у прямоугольника, из которого ты создаешь регион.
А вот последние два параметра задают ширину и высоту в пискелях с которой будут закруглятся углы. Экспеременитрую с ними и добьешся нужного результат.
Если они будут равны 0, соотвественно угол будет полностью прямой, то есть 90 градусов, то есть еще проще он не изменится.

Описание других функий см. в MSDN.

Теперь далее, как все это приминить на деле. Для диалога легко. Нужно устанавливать регион в обработчике события WM_SIZE, то есть когда размер окна изменяется.
Пример в приложении.

Если это делать например только при инициализации диалога, то окно будет отображатся не правильно, после изменения размеров окна.
Хотя я бы рекомендовал на всякий случай дублировать код установки региона в OnInitDialog.


Приложение:
void CMyDialog::OnSize(UINT nType, int cx, int cy){ CDialog::OnSize(nType, cx, cy); SetRegion();}BOOL CMyDialog::OnInitDialog(){ CDialog::OnInitDialog(); SetRegion(); return TRUE;}void CMyDialog::SetRegion(){ CRect rc; GetWindowRect(&rc); CRgn rgn; rgn.CreateRoundRectRgn(rc.left, rc.top, rc.right, rc.bottom, 20, 15); // 20 пикселей загругление по ширине // и 15 по высоте SetWindowRgn(rgn,TRUE);}
Форма ответа