在C#中使用.NET SDK创建控制
2024-07-10 13:00:22
供稿:网友
在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