void CDistortDlg::OnPaint() { CPaintDC dc(this); if (IsIconic()) { // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { //add by myself--------------------------------------------------- dc.SelectStockObject(NULL_PEN);//绘制不带边的椭圆
//获得客户区的尺寸 CRect rect; GetClientRect(rect);
CBrush *pBrushOld; CBrush brushNew;
//定义画刷,在此你可以更改颜色 brushNew.CreateSolidBrush(RGB(204,255,66)); //选取画刷作为画图设备 pBrushOld=dc.SelectObject(&brushNew); //绘制椭圆 dc.Ellipse(rect); //还原画刷,并释放 dc.SelectObject(pBrushOld); brushNew.DeleteObject(); } }
//下面编写实现窗体任意托动的函数
HCURSOR CDistortDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; }
UINT CDistortDlg::OnNcHitTest(CPoint point) { UINT nHitTest=CDialog::OnNcHitTest(point); return(nHitTest==HTCLIENT)?HTCAPTION:nHitTest; }
//下面编写定时器实数
//若想结果n次变化后正好便为圆形,则设此值为 1.035 #define MULTI 1.1
void CDistortDlg::OnTimer(UINT nIDEvent) { static nCount=0;//窗体变化次数,每次增1 static bOrder=1;//表示变大或变小 static double dMulti=1;//窗体的变化倍数
CRect rectWnd; CPoint ptMiddle,ptTopLeft,ptBtmRight;
//确定窗体区域中心 ptMiddle=m_rectWnd.CenterPoint();
//分情况处理各种定时事件 switch(nIDEvent) { case EVENT_REDRAW: nCount++; if(bOrder==1) {//表示变大 dMulti*=MULTI; } else {//表示变小 dMulti/=MULTI; }
//确定窗体的矩形大小 ptTopLeft.x=(long)(ptMiddle.x-m_rectWnd.Width()/(2*dMulti)); ptTopLeft.y=(long)(ptMiddle.y-m_rectWnd.Height()/2); ptBtmRight.x=(long)(ptMiddle.x+m_rectWnd.Width()/(2*dMulti)); ptBtmRight.y=(long)(ptMiddle.y+m_rectWnd.Height()/2); rectWnd.SetRect(ptTopLeft,ptBtmRight);
//释放对象 m_rgn.Detach();
//创建椭圆区域 m_rgn.CreateEllipticRgn(ptTopLeft.x,ptTopLeft.y,ptBtmRight.x,ptBtmRight.y);
SetWindowRgn((HRGN)m_rgn,TRUE);
if(nCount==10)//设置变化次数,此为10次 { nCount=0; bOrder=(bOrder==1)?-1:1;//10次之后反向变化 } break; } CDialog::OnTimer(nIDEvent); }
|