API 함수를 사용하여 DELPHI에서 "비정형" 양식 구현
사용자의 관심을 끌기 위해 현재 일부 셰어웨어 소프트웨어, 특히 일부 멀티미디어 플레이어 소프트웨어는 프로그램 인터페이스 디자인에 큰 관심을 기울이고 있습니다. 실제로 API 함수를 사용하여 아름답고 대체적인 효과를 얻을 수도 있습니다.
1. 특별한 모양의 형태
형태는 정사각형만 가능한가요? 아니요, 다른 모양도 가능합니다. 이를 위해서는 두 개의 Win32 API 함수를 사용해야 합니다. 먼저 CreateRoundRectRgn() 함수를 사용하여 양식 내에서 타원형 영역을 정의합니다. 여기서 언급되는 영역은 양식의 외부 특성을 정의하기 위해 영역 내부에서 채우기 및 자르기와 같은 작업을 수행할 수 있는 특수 API 개체입니다. 그런 다음 SetWindowRgn() 함수를 호출하여 그릴 수 있습니다. 또한 CombineRgn() 함수를 사용하여 여러 영역을 병합할 수 있습니다. 예를 들어 Delphi 유닛 파일에 다음 코드를 추가합니다.
PROcedure TForm1.FormCreate(Sender: TObject);
var
FRegion1:T핸들;
FRegion2:T핸들;
시작하다
FRegion1:=CreateRoundRectRgn(20,20,200,200,300,300);//타원 영역 구분
FRegion2:=CreateRectRgn(170,170,400,400);//직사각형 영역 구분
CombineRgn(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, //로고 다시 그리기
)
기능: 생성된 영역의 핸들을 현재 폼의 핸들에 매개변수로 전달하고 해당 영역 내에 폼을 그리는 함수입니다.
함수 프로토타입: CombineRgn(
HRGN hrgnDest, //목적지 영역에 연결하기 위한 핸들
HRGN hrgnSrc1, //소스 영역에 연결하는 첫 번째 핸들
HRGN hrgnSrc2, //두 번째 연결 소스 영역의 핸들
int fnCombineMode // 연결 모드
)
기능: 이 기능은 두 영역을 새로운 영역으로 병합합니다. 여기서 연결 모드는 다음 값을 사용할 수 있습니다.
매개변수 값 효과
RGN_AND는 지역 1과 지역 2의 공통 부분이 교차하는 지점에서 새 지역을 생성합니다.
RGN_COPY는 지역 1의 복사본을 새 지역으로 생성합니다.
RGN_DIFF는 영역 1에는 속하지만 영역 2에는 속하지 않는 부품을 새 영역에 연결합니다.
RGN_OR은 영역 1과 영역 2의 모든 부분, 즉 합집합을 연결합니다.
RGN_XOR. Area 1과 Area 2의 모든 부품을 연결하고 공통 부품을 제거합니다.
2. 중공형
이 형태의 특징은 양쪽 끝이 있는 형태인데, 가운데 부분이 파여져 있다는 점이다. 예를 들어 Delphi 유닛 파일에 다음 코드를 추가합니다.
절차 TForm1.FormCreate(Sender: TObject);
var
FRegion3:T핸들;
시작하다
Canvas.Font.Name:='중국어 Xingkai';//글꼴 설정
Canvas.Font.Size:=100;//글꼴 크기 설정
BeginPath(Canvas.Handle); //vanvas에 그려진 윤곽선을 가져옵니다.
TextOut(form1.Canvas.Handle,0,20,'Program Spring and Autumn',8);//"Program Spring and Autumn" 네 단어가 차지하는 영역을 잘라냅니다.
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를 능숙하게 사용하는 방법을 배우는 것은 매우 중요한 기술이며 때로는 예상치 못한 결과를 얻을 수도 있습니다. 위의 기술들은 다른 사람들에게 영감을 주기 위한 것입니다. 다양한 기술을 최대한 활용하고 상상력을 발휘하여 더욱 눈부신 형태를 디자인하고 자신만의 프로그램을 아름답게 만들어 보시기 바랍니다.