그림과 같이 윈도우 모서리를 둥글게 만들고 싶다면
다이얼로그를 생성하고
#define DIALOG_WIDTH 500
#define DIALOG_HEIGHT 360
#define DIALOG_COMPENSATION_WIDTH 7
#define DIALOG_COMPENSATION_HEIGHT 8
OnInitDialog함수에서 아래를 적용해서 사용하면 된다.
필자가 아래에 사용한 define은 윈도우 크기를 변경시키고 그리고 border frame을 없앤 경우였기 때문에 보상해주는 값으로 정의했다. 보통 border가 있다면 GetClientRect나 GetRect를 이용해서 윈도우의 크기를 얻을 수 있다.
INT nSize = 15; // Window curvature size
INT nCoordinateX = 3; // X start point
INT nCoordinateY = 3; // Y start point
CRgn rgnTopLeft, rgnTmp1, rgnWindow;
// Window
VERIFY(rgnWindow.CreateRectRgn(nCoordinateX, nCoordinateY, DIALOG_WIDTH - DIALOG_COMPENSATION_WIDTH, DIALOG_HEIGHT - DIALOG_COMPENSATION_HEIGHT));
// Set top-left corner region
VERIFY(rgnTopLeft.CreateEllipticRgn(nCoordinateX, nCoordinateY, nSize+5, nSize+5));
VERIFY(rgnTmp1.CreateRectRgn(nCoordinateX, nCoordinateY, (INT)nSize/2+3, (INT)nSize/2+3));
rgnTopLeft.CombineRgn(&rgnTmp1, &rgnTopLeft, RGN_DIFF);
// Crop top-left corner region
rgnWindow.CombineRgn(&rgnWindow, &rgnTopLeft, RGN_DIFF);
// Set top-right corner region
CRgn rgnTopRight, rgnTmp2;
VERIFY(rgnTopRight.CreateEllipticRgn(DIALOG_WIDTH-DIALOG_COMPENSATION_WIDTH-nSize, nCoordinateY, DIALOG_WIDTH-DIALOG_COMPENSATION_WIDTH, nSize));
VERIFY(rgnTmp2.CreateRectRgn(DIALOG_WIDTH-DIALOG_COMPENSATION_WIDTH-(INT)(nSize/2), nCoordinateY,
DIALOG_WIDTH-DIALOG_COMPENSATION_WIDTH, (INT)(nSize/2)+3)); // rect width +3
rgnTopRight.CombineRgn(&rgnTmp2, &rgnTopRight, RGN_DIFF);
// Crop top-right corner region
rgnWindow.CombineRgn(&rgnWindow, &rgnTopRight, RGN_DIFF);
// Set bottom-left corner region
CRgn rgnBottomLeft, rgnTmp3;
VERIFY(rgnBottomLeft.CreateEllipticRgn(nCoordinateX, DIALOG_HEIGHT- DIALOG_COMPENSATION_HEIGHT-nSize - 5,
nSize, DIALOG_HEIGHT- DIALOG_COMPENSATION_HEIGHT)); // elliptical rect width - 5
VERIFY(rgnTmp3.CreateRectRgn(nCoordinateX, DIALOG_HEIGHT- DIALOG_COMPENSATION_HEIGHT-(INT)(nSize/2),
(INT)(nSize/2) + 3, DIALOG_HEIGHT- DIALOG_COMPENSATION_HEIGHT)); // rect width +3
rgnBottomLeft.CombineRgn(&rgnTmp3, &rgnBottomLeft, RGN_DIFF);
// Set bottom-left corner region
rgnWindow.CombineRgn(&rgnWindow, &rgnBottomLeft, RGN_DIFF);
// Set bottom-right corner region
CRgn rgnBottomRight, rgnTmp4;
VERIFY(rgnBottomRight.CreateEllipticRgn(DIALOG_WIDTH-DIALOG_COMPENSATION_WIDTH-nSize, DIALOG_HEIGHT- DIALOG_COMPENSATION_HEIGHT-nSize,
DIALOG_WIDTH-DIALOG_COMPENSATION_WIDTH, DIALOG_HEIGHT- DIALOG_COMPENSATION_HEIGHT));
VERIFY(rgnTmp4.CreateRectRgn(DIALOG_WIDTH-DIALOG_COMPENSATION_WIDTH-(INT)(nSize/2), DIALOG_HEIGHT- DIALOG_COMPENSATION_HEIGHT-(INT)(nSize/2),
DIALOG_WIDTH-DIALOG_COMPENSATION_WIDTH, DIALOG_HEIGHT- DIALOG_COMPENSATION_HEIGHT));
rgnBottomRight.CombineRgn(&rgnTmp4, &rgnBottomRight, RGN_DIFF);
// Set bottom-right corner region
rgnWindow.CombineRgn(&rgnWindow, &rgnBottomRight, RGN_DIFF);
// Set window style
SetWindowRgn(rgnWindow,TRUE);
'C & C++ > MFC 컨트롤' 카테고리의 다른 글
[Radio] 라디오 버튼 체크해제 방법 (0) | 2011.04.25 |
---|---|
[Slider] 슬라이더 컨트롤 (0) | 2011.04.25 |
프린트 인쇄 미리보기 (0) | 2011.04.25 |
API 를 이용하여 컨트롤 만들기 (0) | 2011.04.25 |
[Tree] 트리 컨트롤러 (0) | 2011.04.25 |
댓글