GDI+에서 Round Rectangle 그리기.


void GetRoundedRect(GraphicsPath* pPath, RectF baseRect, float radius){
 if( radius<=0.0F ){ 
 pPath->AddRectangle(baseRect); 
 pPath->CloseFigure(); 
 return;
 }
 if( radius>=(min(baseRect.Width, baseRect.Height))/2.0){
 GetCapsule(pPath, baseRect); 
 return;
 }
 float diameter = radius * 2.0F; 
 RectF arc ( baseRect.X, baseRect.Y, diameter, diameter); 
 pPath->AddArc( arc, 180, 90 ); 
 arc.X = baseRect.GetRight() -diameter; 
 pPath->AddArc( arc, 270, 90 ); 
 arc.Y = baseRect.GetBottom() -diameter; 
 pPath->AddArc( arc, 0, 90 ); 
 arc.X = baseRect.GetLeft();
 pPath->AddArc( arc, 90, 90 ); 
 pPath->CloseFigure(); 
}

void GetCapsule(GraphicsPath* pPath, RectF baseRect){ 
 float diameter; 
 
 TRY{ 
 if( baseRect.Width > baseRect.Height){ 
 diameter = baseRect.Height; 
 RectF arc( baseRect.X, baseRect.Y, diameter, diameter); 
 pPath->AddArc( arc, 90, 180); 
 arc.X = baseRect.GetRight()-diameter; 
 pPath->AddArc( arc, 270, 180); 
 }else if( baseRect.Width < baseRect.Height ){ 
 diameter = baseRect.Width;
 
 RectF arc( baseRect.X, baseRect.Y, diameter, diameter ); 
 pPath->AddArc( arc, 180, 180 ); 
 arc.Y = baseRect.GetBottom() -diameter; 
 pPath->AddArc( arc, 0, 180 ); 
 }else{ 
 pPath->AddEllipse( baseRect ); 
 }
 }CATCH(CException, ex){
 pPath->AddEllipse( baseRect ); 
 }
 END_CATCH
 pPath->CloseFigure(); 
}
사용 예)
RectF PaintRect(WndRect.Width()/2-200, WndRect.Height()/2-100, 400, 200);

LinearGradientBrush BackBrush(PaintRect , Color(255,255,255), Color(57,109,194), LinearGradientModeVertical);
Pen BackPen (Color(57,109,194), 3);

GraphicsPath RoundPath;
GetRoundedRect(&RoundPath, PaintRect, 10);

pMemG->FillPath(&BackBrush, &RoundPath);
pMemG->DrawPath(&BackPen, &RoundPath);

자료 참고: codeproject.com

"프로그래밍 / Visual C" 분류의 다른 글

[MFC] HttpOpenRequest 이용시 0xC0000005: 0xcccccccc 오류 (0)2014/03/04
[MFC] modal dialog(모달 대화상자) 숨긴채로 시작하기 (0)2014/03/04
[MFC] 프로세스 파일 경로 (0)2013/09/24
[MFC] OpenSSL Visual Studio 2008에서 컴파일 및 설치 하기 (0)2009/05/11
[MFC] Visual Studio 2008에서 zlib 1.2.3 컴파일 (0)2009/04/21
IE8설치후 VS2008 스크립트 오류 문제 (4)2009/03/31
데이크스트라 알고리즘(Dijkstra algorithm) (2)2008/12/29
Microsoft Office 2007 연동 (1)2008/06/04
VC macro __FUNCTION__ UNICODE에서 사용하기 (0)2008/03/14
MulDiv (0)2007/12/12


Powered by Textcube