一些常规形几何形状的绘制和效果填充(三)
?
(續)????????? ???? visualsan@yahoo.cn
下面以實現鐘和旋轉文字為例具體講解CShape的使用方法:
????鐘由表盤,指針和刻度組成。具體繪圖函數在OnPaint()函數里實現,由于刷新較快,而所以繪圖都需要計算得到,故要占一定的CPU使用率,避免cpu過高的方法是把不變的部分如表盤,刻度等繪制成一張背景位圖,在OnPaint函數里載入背景位圖,這樣做可大大減低cpu使用率。另外繞一定圓旋轉一定角度的文字是一個一個字符計算位置和輸出的,顧若輸出過多的字符則cpu的使用率也很高,當然可以用位圖背景的方法來提高效率。效果圖如下:
?
?
1.初始化時繪制時鐘背景位圖
????????????? p.DeleteObject();
?????? ????? ?CDC *pDC=GetDC();
?????? ????? ?CRect rect;
????????????? GetClientRect(&rect);
????????????? CPoint pt;
????????????? pt.x=500;
????????????? pt.y=500;
?????????????
????????????? CBitmap *oldbitmap;
????????????? p.CreateCompatibleBitmap(pDC, rect.Width(),???
??????????????rect.Height());//生成空間的內存位圖
????????????? CDC me;
????????????? me.CreateCompatibleDC(pDC);//生成內存cd
????????????? oldbitmap=me.SelectObject(&p);
????????????? CBrush *oldbrush,b(RGB(120,0,0));
????????????? oldbrush=me.SelectObject(&b);
????????????? CPen *oldpen,pen(0,2,RGB(0*rand()/RAND_MAX,0,255));
????????????? oldpen=me.SelectObject(&pen);
????????????? CShape shap;
????????????? pt.x=400;
????????????? pt.y=300;
?????????? ?? shap.DrawConeGradientCenterToSide
???????????? (&me,pt,200,130,0,360,RGB(0,0,255),RGB(0,0,0));
??????
????????????? shap.DrawConeGradientSideToSide
????????????? (&me,pt,120,0,0,360,RGB(255,255,0),RGB(0,0,0));
??????
?????? ?????? shap.DrawConeGradientSideToSide
????????????? (&me,pt,100,50,45,90,RGB(120,111,200),RGB(0,0,0));
?
????????????? for ( int i=0;i<12*5;i++)
????????????? {
???????????????????? shap.DrawLine_CenterPoint_Len_Angle
???????????????????? (&me,pt,162,175,RGB(120,111,200),i*6,2);
????????????? }
????????????? for (? i=0;i<12;i++)
????????????? {
???????????????????? shap.DrawLine_CenterPoint_Len_Angle
??????????????????? ?(&me,pt,160,180,RGB(0,255,0),i*30,5);
????????????????????
????????????? }
????????????? b.DeleteObject();
????????????? b.CreateSolidBrush(RGB(0,255,0));
????????????? oldbrush=me.SelectObject(&b);
????????????? me.SelectObject(oldbrush);???
????????????? b.DeleteObject();
????????????? b.CreateSolidBrush(RGB(0,0,255));
????????????? oldbrush=me.SelectObject(&b);
????????????? me.SelectObject(oldbrush);
??????????? ? CString str;
????????????? me.SelectObject(oldbrush);
????????????? me.SelectObject(oldpen);
????????????? me.SetROP2(R2_WHITE);
???????????? ?pDC->BitBlt(0, 0, rect.Width(), rect.Height(),
?????????????& me, 0, 0, SRCCOPY);
??? ?????? ?? me.SelectObject(oldbitmap);
????????????? me.DeleteDC();
????????????? pDC->DeleteDC();
2.鐘的實現
??????????? ? CDC *pDC=GetDC();
????????????? CFont *oldfont;
????????????? double? h,m,s;
????????????? FormatTime(m,h,s);
????????????? //從當前時間里獲得時針,分針,秒針的角度h,m和s
????????????? CRect rect;
????????????? GetClientRect(&rect);
????????????? CPoint pt;//時鐘中心
????????????? pt.x=500;
????????????? pt.y=500;
?????????????
????????????? CBitmap bitmap;
????????????? CBitmap *oldbitmap;
????????????? bitmap.CreateCompatibleBitmap(pDC, rect.Width(),
???????????? ?rect.Height());
????????????? //生成空間的內存位圖
????????????? CDC me;
????????????? me.CreateCompatibleDC(pDC);//生成內存cd
????????????? oldbitmap=me.SelectObject(&bitmap);//載入背景位圖
?
????????????? CBrush *oldbrush,b(&p);
????????????? oldbrush=me.SelectObject(&b);
????????????? me.FillRect(rect,&b);//繪制背景
??????
????????????? me.SelectObject(oldbrush);
????????????? CPen *oldpen,pen(0,2,RGB(0,0,255));
????????????? oldpen=me.SelectObject(&pen);
????????????? CShape shap;
????????????? pt.x=400;
????????????? pt.y=300;
????????????? b.DeleteObject();
????????????? b.CreateSolidBrush(RGB(0,255,0));
????????????? oldbrush=me.SelectObject(&b);
????????????? me.SelectObject(oldbrush);
???????????? ?//畫分針,顏色為綠色漸變到黑色
????????????? shap.DrawDiamondGradient(&me,pt,190,40,m,RGB
??????????????(0,255,0),RGB(0,0,0),TOP_MIDDLE_BOTTOM,.8);
????????????? me.SetTextColor(RGB(0,255,0));
????????????? me.SetBkMode(TRANSPARENT);
????????????? CTime t=CTime::GetCurrentTime();
????????????? me.TextOut(370,220,t.Format("%H:%M:%S"));
????????????? //畫時針,?????????
???????????? ?shap.DrawDiamondGradient(&me,pt,120,35,h,RGB
????????????? (120,111,200),
????????????? RGB(0,0,0),TOP_MIDDLE_BOTTOM,.8);
?????????????? //畫秒針,顏色為綠色漸變到黑色
????????????? shap.DrawDiamondGradient(&me,pt,225,20,s,RGB
??????????????(255,0,0),
??????????????RGB(0,0,0),TOP_MIDDLE_BOTTOM,.7);
????????????? me.SelectObject(oldbrush);
??????????? ? //畫螺絲
????????????? shap.DrawPoint(&me,pt,RGB(0,0,255),6);
????????????? shap.DrawPoint(&me,pt,RGB(255,255,255),3);
????????????? static double angg=s;//外圍中文漢字旋轉角度
????????????? angg=angg+0.5;
????????????? shap.SetFontWide(50);//設置文字寬度和高度
????????????? shap.SwtFontHeight(60);
?????????????? /輸出非中文字符?? shap.DrawCircleABCText
??????????????(&me,pt,255,angg,"visualsan@yahoo.cn",RGB
??????????????(0,255,0),10,FONT_CLOCKWISE);
????????????? shap.SetFontWide(30);
????????????? shap.SwtFontHeight(40);
?????????????? //輸出中文字符
????????????? shap.DrawCircleChineseText(&me,pt,300,-angg,
????????????? "南京航空航天大學能源與動力學院",
????????????? RGB(0,0,255),10,FONT_CLOCKWISE);
????????????? me.SelectObject(oldbrush);
????????????? me.SelectObject(oldpen);
????????????? me.SetROP2(R2_WHITE);
??????????????pDC->BitBlt(0, 0, rect.Width(), rect.Height(),
?????????????& me, 0, 0, SRCCOPY);
??? ???? ???? me.SelectObject(oldbitmap);
??? ???? ???? bitmap.DeleteObject();
??? ???? ???? me.DeleteDC();
????????????? pDC->DeleteDC();
?????????????
實現總體效果如下:
總結:
??? CShape類可實現常規的幾何圖形的繪制和效果填充,但是能實現的幾何圖形的種類是有限的,但是可根據類似的原理添加不同的幾何圖形。填充效果也僅限于有限的幾種,前些天看到一個儀表程序的介紹,它所實現的玻璃效果特別好看,但是沒有源碼。我還不知道如何實現玻璃效果,還有待于研究。
在實現各種效果時,對于這些要定時刷新的函數來說,一定不能讓內存泄露,所以我在編寫每一個函數時特別注意。所以每實現一個效果,就一定要檢查一下也沒有內存泄露。到目前還未發現內存有泄露。祝大家學習進步!
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的一些常规形几何形状的绘制和效果填充(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一些常规形几何形状的绘制和效果填充(二)
- 下一篇: 改变 this 指向的 call 和 a