1.GDI+圖形庫簡介
1.1概述
GDI+是Microsoft的新.NET Framework類庫用於圖形編程,因為它是.NET Framework的一部分,所以也是面對對象的。
1.2設備環境和對象
在GDI+中識別輸出設備的方式是使用設備環境DC對象,該對象存儲特定設備的信息並能把GDI+API函數調用轉換為要發送給該設備的指令,還可以查詢設備環境對象,確定對應的設備有什麼功能,這樣才能據此調整輸出結果。
在GDI+中設備環境包裝在.NET基類System.Drawing.Graphics中,大多數繪圖工作都是調用Graphics的對象完成的。
2.如何利用GDI+繪制時鐘表
2.1時鐘表的各控件屬性的設置
用C#中各控件制作一個指針式的時鐘放在桌面上顯示的界面。包括1個PictureBox控件、1個Timer控件、1個NotifyIcon控件及StatusStrip控件。
2.2各控件的屬性設置
Timer控件的Interval屬性值設置為1000,Enable屬性值設置為True;窗體的StartPosition屬性設置為CenterScreen,這個屬性使得鐘表在屏幕上中中央顯示。
2.3功能實現代碼
為實現該時鐘表功能,需要設計並輸入相應對象相應事件或過程的程序代碼。方法是:在設計狀態,雙擊相應控件,或雙擊控件的某一事件,並輸入相應的C#程序代碼。
2.4通用聲明及時鐘表設計方法
在程序中需要有一批變量或常量的定義,可事先在通用聲明中完成,代碼如下:
const int s_pinlen = 100;//秒針長度
const int m_pinlen = 75; //分針長度
const int h_pinlen = 75; //時針長度
PointF center = new PointF(s_pinlen +3, s_pinlen +3);//中心點位置
SolidBrush sb = new SolidBrush(Color.Black);//時鐘圓心的刷子
除上述變量聲明外,時鐘表功能編寫子方法,方法名為:AngleToPos和myClock,
方法AngleToPos是根據角度和百分比計算出一個點的坐標函數,代碼如下:
PointF AngleToPos(int angle, float percent)
{
PointF pos = new PointF();
double radian = angle * Math.PI / 180;
pos.Y = center.Y - s_pinlen * percent * (float)Math.Sin(radian);
pos.X = center.X + s_pinlen * percent * (float)Math.Cos(radian);
return pos;
}
方法myClock主要是繪制時鐘表的中心位置、秒針、分針及時針的結束位置。代碼如下:
Pen pDisk=new Pen(Color.Orange,3);//時鐘背景的筆
Pen pScale = new Pen(Color.Coral);//刻度的筆
Graphics myGraphics = pictureBox1.CreateGraphics();
myGraphics.Clear(Color.White);
Pen myPen = new Pen(Color.Black,2);
Point CPoint = new Point(s_pinlen , s_pinlen);
Point SPoint = new Point((int)(CPoint.X + (Math.Sin(6 * s * Math.PI / 180)) * s_pinlen), (int)(CPoint.Y - (Math.Cos(6 * s * Math.PI / 180)) * s_pinlen));
Point MPoint = new Point((int)(CPoint.X + (Math.Sin(6 * m * Math.PI / 180)) * m_pinlen), (int)(CPoint.Y - (Math.Cos(6 * m * Math.PI / 180)) * m_pinlen));
Point HPoint = new Point((int)(CPoint.X + (Math.Sin(((30 * h) + (m / 2)) * Math.PI / 180)) * h_pinlen), (int)(CPoint.Y - (Math.Cos(((30 * h) + (m / 2)) * Math.PI / 180)) * h_pinlen));
myGraphics.FillEllipse(sb, center.X -8, center.Y - 7, 14, 14);
myGraphics.DrawLine(myPen, CPoint, SPoint);
myPen = new Pen(Color.Blue , 4);
myGraphics.DrawLine(myPen, CPoint, MPoint);
myPen = new Pen(Color.Green , 6);
myGraphics.DrawLine(myPen, CPoint, HPoint);
myGraphics.DrawEllipse(pDisk, 1, 1, s_pinlen * 2, s_pinlen*2);//畫刻度
for (int i = 0; i < 360; i += 6)
{
Pen tempPen = (i % 30 == 0) ? pDisk : pScale;
PointF qidian = AngleToPos(i, 0.87f);
PointF zhongdian= AngleToPos(i, 1.0f);
myGraphics.DrawLine(tempPen, qingdian, zhongdian);
}
2.5 Timer的Tick事件中的代碼
計時器控件代碼部分完成的功能是整個時鐘表的核心,其代碼如下:
int h=DateTime.Now.Hour;
int m = DateTime.Now.Minute;
int s = DateTime.Now.Second;
myClock(h, m, s);//調用畫時鐘表的方法
toolStripStatusLabel1.Text = "當前時間:" + DateTime.Now.ToLongTimeString();
3.結語
編寫圖形代碼是計算機編程領域中比較復雜的工作之一,利於C#中GDI+動態地生成時鐘表,編寫程序的設計與實現是以數學科學的設計為基礎,以合理的設計思想為指導,以必要的程序設計語言為工具,基本上滿足了用戶的需要的時鐘表。
參考文獻:
[1]梁冰,呂雙.C#程序開發范例寶典(第2版).明日科技.人民郵電出版社,2009.10.
[2]陳廣.C#程序設計基礎教程與實訓.北京大學出版社,2008.2.
[3]劉莆迎.C#程序設計教程.電子工業出版社,2008.6.