在C#中使用.NET SDK建立控制
最後更新:2017-02-28
來源:互聯網
上載者:User
建立|控制 在C#中使用.NET SDK建立控制
作者: Norm Almond
下載樣本工程 - 8 Kb
介紹
在這篇教程中,我將使用.NET架構建立一個簡單的時鐘控制樣本,這個控制是一個顯示目前時間的時鐘,
我將指導讀者實現秒針並顯示鐘點數。
文章加亮處是建立這個控制的關鍵點,讀者可以參考其中的代碼。建立一個控制的最快的方法是從這裡拷
貝一個控制範例程式碼:
..\Program Files\NGWSSDK\Samples\QuickStart\winforms\samples\Cs\WritingControls\helloworldcontrol
將目錄拷貝到 MyControl目錄
..\Program Files\NGWSSDK\Samples\QuickStart\winforms\samples\Cs\WritingControls\MyControl
將目錄下的Hellowordlcontrol檔案重新命名為myControl.
Helloworldcontrol.cs -> mycontrol.cs
Helloworldcontrol.src -> mycontrol.src
將下列檔案中的helloworldcontrol改為myControl:
Hostapp.cs
Makefile
開啟控制台視窗輸入 NMAKE ALL. 將建立下列兩個檔案:
MyControl.exe – The application that hosts the control
MyControl.DLL – The actual control.
現在基本的架構代碼已經建立好了,我們可以通過運行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
下一步是包含一些允許調用WINDOWS作業系統功能的C#擴充特性,我無法找到一個類似
獲得系統時間的函數,所以我作了如下定義:
// 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