可以使用MFC 函数cWnd::SetWindowRgn。该函数将绘画和鼠标消息限定在窗口的一个指定
的区域,实际上使窗口成为指定的不规则形状。
使用AppWizard创建一个基于对的应用程序并使用资源编辑器从主对话资源中删
除所在的缺省控件、标题以及边界。给对话类增加一个CRgn 数据成员,以后要使用该
数据成员建立窗口区域。
BOOL CTest2Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
//Get size of dialog .
CRect rcDialog ;
GetClientRect (rcDialog);
// Create region and assign to window .
m_rgn.CreateEllipticRgn (0,0 , rcDialog.Width() , rcDialog .Height());
//::SetWindowRgn(GetSafeHwnd(),(HRGN)m_rgn,TRUE);
SetWindowRgn((HRGN)m_rgn,TRUE);
return TRUE; // return TRUE unless you set the focus to a control
}
void CTest2Dlg::OnPaint()
{
CPaintDC dc (this) ; // device context for painting .
//draw ellipse with out any border
dc.SelectStockObject(NULL_PEN);
//get the RGB colour components of the sphere color
//COLORREF color= RGB( 0 , 0 , 255);
COLORREF color= RGB( 255 , 255, 255);
BYTE byRed =GetRValue (color);
BYTE byGreen = GetGValue (color);
BYTE byBlue = GetBValue (color);
// get the size of the view window
CRect rect ;
GetClientRect (rect);
// get minimun number of units
int nUnits =min (rect.right , rect.bottom );
//calculate he horiaontal and vertical step size
float fltStepHorz = (float) rect.right /nUnits ;
float fltStepVert = (float) rect.bottom /nUnits ;
int nEllipse = nUnits/3; // calculate how many to draw
int nIndex ; // current ellipse that is being draw
CBrush brush ; // bursh used for ellipse fill color
CBrush *pBrushOld; // previous brush that was selected into dc
//draw ellipse , gradually moving towards upper-right corner
for (nIndex = 0 ; nIndex <= nEllipse ; nIndex ++)
{
//creat solid brush
brush.CreateSolidBrush(RGB ( ( (nIndex *byRed ) /nEllipse ) ,
( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue) /nEllipse ) ) );
//select brush into dc
pBrushOld= dc.SelectObject (&brush);
//draw ellipse
dc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex ,
rect. right -( (int) fltStepHorz * nIndex )+ 1,
rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1) ;
//delete the brush
brush.DeleteObject ( );
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
UINT CTest2Dlg::OnNcHitTest(CPoint point)
{
// TODO: Add your message handler code here and/or call default
UINT nHitTest = CDialog::OnNcHitTest (point) ;
return (nHitTest == HTCLIENT)? HTCAPTION: nHitTest ;
// return CDialog::OnNcHitTest(point);
}