VC---创建一个不规则形状的窗口

来源:互联网 发布:听歌识谱软件 编辑:程序博客网 时间:2024/05/04 02:14

      可以使用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);
}

原创粉丝点击