Используйте функции API для реализации «нетипичных» форм в DELPHI.
Чтобы привлечь пользователей, некоторые современные условно-бесплатные программы, особенно некоторые программы мультимедийных проигрывателей, уделяют большое внимание дизайну программного интерфейса. Фактически, мы также можем использовать функции API для достижения этих красивых и альтернативных эффектов.
1. Форма специальной формы.
Может ли форма быть только квадратной? Нет, возможны и другие формы. Для этого требуется использование двух функций Win32 API. Сначала используйте функцию CreateRoundRectRgn(), чтобы определить эллиптическую область внутри формы. Упомянутая здесь область является специальным объектом API. Мы можем выполнять такие операции, как заполнение и обрезка внутри области, чтобы определить внешние характеристики формы. Затем вызовите функцию SetWindowRgn() для рисования. Кроме того, вы можете использовать функцию JointRgn() для объединения нескольких областей. Например, добавьте следующий код в файл модуля Delphi:
PROcedure TForm1.FormCreate(Отправитель: TObject);
вар
FRegion1:THandle;
FRegion2:THandle;
начинать
FRegion1:=CreateRoundRectRgn(20,20,200,200,300,300);//Разграничиваем эллиптическую область
FRegion2:=CreateRectRgn(170,170,400,400);//Разграничиваем прямоугольную область
JointRgn(FRegion1,FRegion1,FRegion2,RGN_OR);//Соединяем две области
SetwindowRgn(handle,FRegion1,True);//Рисуем подключенную область
конец;
Функция CreateRoundRectRgn() в программном сегменте используется для создания скругленной прямоугольной области, ее прототип:
HRGN CreateRoundRectRgn(
int nLeftRect,//координата X верхнего левого угла
int nTopRect, // координата Y верхнего левого угла
int nRightRect, // координата X нижнего правого угла
int nBottomRect,//координата Y нижнего правого угла
int nWidthEllipse,//Ширина эллипса, в котором находится закругленный угол
int nHeightEllipse //Высота эллипса, где находится закругленный угол
);
Другая графика, такая как многоугольники, эллипсы и т. д., имеет соответствующие функции API. Их прототипы следующие:
HRGN CreateEllipticRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect)
HRGN CreateEllipticRgnIndirect(CONST RECT *lprc)
HRGN CreatePolygonRgn (CONST POINT *lPPT, int cPoints, int fnPolyFillMode)
HRGN CreatepolypolygonRgn(CONST POINT *lppt,CONST INT *lpPolyCounts,int nCount,int fnPolyFillMode)
HRGN CreateRectRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect)
HRGN CreateRectRgnIndirect(CONST RECT *lprc)
Параметры приведенной выше функции легко понять и используются для указания координат встроенного прямоугольника изображения или точки на прямоугольник. Давайте сосредоточимся на двух других функциях:
Прототип функции: SetWindowRgn(
HWND hWnd, //дескриптор текущей формы
HRGN hRgn, //дескриптор текущего региона
BOOL bRedraw, //Перерисовать логотип
)
Функция: эта функция передает дескриптор созданной области в качестве параметра дескриптору текущей формы и рисует форму внутри области;
Прототип функции: JointRgn(
HRGN hrgnDest, // дескриптор подключения к области назначения
HRGN hrgnSrc1, //Первый дескриптор для подключения к исходной области
HRGN hrgnSrc2, // Дескриптор второй области источника соединения
int fnCombineMode // режим соединения
)
Функция: Эта функция объединяет две области в новую область, где режим соединения может принимать следующие значения:
Эффект значения параметра
RGN_AND создает новый регион из пересечения общих частей региона 1 и региона 2.
RGN_COPY создает копию региона 1 как новый регион.
RGN_DIFF соединяет части, принадлежащие области 1, но не принадлежащие области 2, к новой области.
RGN_OR соединяет все части области 1 и области 2, то есть объединение
РГН_ИСКЛЮЧАЮЩЕЕ ИЛИ. Соедините все части зоны 1 и зоны 2 и удалите общие части.
2. Полая форма
Характерной чертой этой формы является то, что это форма с двумя концами, а часть выкопана посередине. Например, добавьте следующий код в файл модуля Delphi:
процедура TForm1.FormCreate(Отправитель: TObject);
вар
FRegion3:THandle;
начинать
Canvas.Font.Name:='Китайский синкай';//Установить шрифт
Canvas.Font.Size:=100;//Устанавливаем размер шрифта
BeginPath(Canvas.Handle); //Получаем контур, нарисованный на Ванвасе;
TextOut(form1.Canvas.Handle,0,20,'Программа Весна и Осень',8);//Вырезаем область, занимаемую четырьмя словами "Программа Весна и Осень"
EndPath(Canvas.Handle);
FRegion3:=PathToRegion(Canvas.Handle);//Назначаем указанный выше регион форме
SetwindowRgn(Handle,FRegion3,True);//Начало рисования
конец;
Здесь в основном используются три функции API:
Прототип функции: BOOL BeginPath (HDC hdc //дескриптор среды устройства)
Функция: начать получать траекторию пути текущей среды устройства;
Прототип функции: BOOL EndPath(HDC hdc //дескриптор среды устройства)
Функция: прекратить получение и назначить полученную траекторию пути дескриптору текущей среды устройства.
Прототип функции BOOL TextOut(
HDC hdc, // дескриптор контекста устройства
int nXStart, // координата X начальной позиции
int nYStart, // координата Y начальной позиции
LPCTSTR lpString,//Строковый адрес
int cbString //Количество символов, содержащихся в строке (обратите внимание, что один китайский иероглиф занимает два символа)
)
Функция: Нарисуйте заданную строку в указанной позиции.
Резюме: Научиться умело использовать API для программирования — очень важный навык, и иногда он может привести к неожиданным результатам. Вышеупомянутые методы предназначены для того, чтобы вдохновить других. Я надеюсь, что вы сможете в полной мере использовать различные методы и использовать свое воображение, чтобы создавать более великолепные формы и украшать свои собственные программы.