在這篇教程中,我將使用.NET架構創建一個簡單的時鐘控制示例,這個控制是一個顯示當前時間的時鐘,
我將指導讀者實現秒針並顯示鐘點數。
文章加亮處是創建這個控制的關鍵點,讀者可以參考其中的代碼。創建一個控制的最快的方法是從這裡拷
貝一個控制示例代碼:
..Program FilesNGWSSDKSamplesQuickStartwinformssamplesCsWritingControlshelloworldcontrol
將目錄拷貝到 MyControl目錄
..Program FilesNGWSSDKSamplesQuickStartwinformssamplesCsWritingControlsMyControl
將目錄下的Hellowordlcontrol文件重命名為myControl.
將下列文件中的helloworldcontrol改為myControl:
打開控制台窗口輸入 NMAKE ALL. 將建立下列兩個文件:
現在基本的框架代碼已經建立好了,我們可以通過運行mycontrol.exe來測試。
現在我們可以開始編寫我們的控制.
我們需要添加一些即將使用的 namespaces, namespace包含了我們在控制中所涉及到的類 :
using System.ComponentModel;// Needed for control support using System.Timers; // Needed to support timer using System.Runtime.InteropServices;// Needed for StructLayout attribute
// Definition of WINAPI SYSTEMTIME structure [StructLayout(LayoutKind.Sequential)] public class SystemTime { public ushort wYear; public ushort wMonth; public ushort wDayOfWeek; public ushort wDay; public ushort wHour; public ushort wMinute; public ushort wSecond; public ushort wMilliseconds; } // Definition of WINAPI GetLocalTime function[DllImport("Kernel32.dll")] public static extern void GetLocalTime(SystemTime st);
private Colorm_colorHands;private Colorm_colorFace; private boolm_bActivateClock; private System.Timers.Timer m_timer;
這裡要注意的是,要在聲明任何變量之前引入關鍵字,而不是像C++那樣可以跟變量一起定義。
跟Java類似,方法可以在內部編寫,將來雖然需要經常修改,但修改變得簡單易行了。
public MyControl(){ m_colorHands = Color.White; m_colorFace = Color.Blue; SetStyle(ControlStyles.Opaque, false); SetStyle(ControlStyles.ResizeRedraw, true); }
[ Category("Clock"), Description("Hands color for Clock"), DefaultValue(0xFFFFFF), ] public Color HandsColor { get { return m_colorHands; } set { m_colorHands = value; Invalidate(); Update(); } }
括弧[ ]中的代碼定義了特定的屬性, get 和 set 函數對於對象外面也是可用的,
要想修改時鐘指針的顏色,你可以這樣做:
someobj.HandColor = Color.Red;
此句隱含調用了set函數。
protected override void OnPaint(PaintEventArgs pe) { // Let base class draw its stuff first base.OnPaint(pe); // Draw code here... }
請注意用來重載基類函數的關鍵字 override
這段代碼調用了基類函數 OnPaint
(base.OnPaint(pe);
)
在代碼中其它有價值的地方是:對象建立在堆上,且不需要象C++中進行delete操作. NWGS 中的垃圾
收集功能將會對用NEW分配的對象進行回收。
例如:
{ // ... Some code SolidBrush brush = new SolidBrush(Color.White) // Scope ends... no delete operator needed for brush }C#的另一個特性時在調用函數時更改變量的取值。
請看如下代碼:
CalculatePoint(ptStart, out ptEnd,(st.wHour*5)+(st.wMinute/12), false, rc);
請注意 out 參數,這樣定義當進入函數後變量將被更改。
我們可以這樣定義:
protected void CalculatePoint(Point pStart, out Point pEnd, int nPos, bool bFlag, Rectangle rc)
Mycontrol.exe 已經建好了,另一種測試控制的方法是運行 WinDes.exe, 然後建立一個新的 C# Win32Form,
選擇Library 菜單下Edit/Add 並且選擇 mycontrol.dll