下载示例工程 - 8 Kb

介绍

在这篇教程中,我将使用.NET架构创建一个简单的时钟控制示例,这个控制是一个显示当前时间的时钟,
我将指导读者实现秒针并显示钟点数。
文章加亮处是创建这个控制的关键点,读者可以参考其中的代码。创建一个控制的最快的方法是从这里拷
贝一个控制示例代码:

..Program FilesNGWSSDKSamplesQuickStartwinformssamplesCsWritingControlshelloworldcontrol

将目录拷贝到 MyControl目录

..Program FilesNGWSSDKSamplesQuickStartwinformssamplesCsWritingControlsMyControl

将目录下的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来测试。

现在我们可以开始编写我们的控制.

  1. 我们需要添加一些即将使用的 namespaces, namespace包含了我们在控制中所涉及到的类 :

    using System.ComponentModel;// Needed for control support
    
    using System.Timers; // Needed to support timer
    
    using System.Runtime.InteropServices;// Needed for StructLayout attribute 
    
  2. 下一步是包含一些允许调用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);
    
  3. 现在我们申明一些在对象运行期间将被使用的成员变量。
    private Colorm_colorHands;private Colorm_colorFace;
    
    private boolm_bActivateClock;
    
    private System.Timers.Timer m_timer;
    

    这里要注意的是,要在声明任何变量之前引入关键字,而不是像C++那样可以跟变量一起定义。

  4. 定义构造函数.

    Java类似,方法可以在内部编写,将来虽然需要经常修改,但修改变得简单易行了。

    public MyControl(){
    
     m_colorHands = Color.White;
    
     m_colorFace = Color.Blue;
    
     SetStyle(ControlStyles.Opaque, false);
    
     SetStyle(ControlStyles.ResizeRedraw, true);
    
    }
  5. 下一步是定义一些属性,这里包含了一个新的功能:属性标记,他将为其它子系统提供运行时库信息。
    [
    
    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函数。

  6. 重载基类函数
    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

在C#中使用.NET SDK创建控制的更多相关文章

  1. ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下

    ADO.NET   一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data  → DataTable, ...

  2. 痞子衡嵌入式:嵌入式MCU中通用的三重中断控制设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是嵌入式MCU中通用的三重中断控制设计. 我们知道在 MCU 裸机中程序代码之所以能完成多任务并行实时处理功能,其实主要是靠中断来调度的, ...

  3. vue+el-element中根据文件名动态创建dialog的方法

    背景 在项目中使用对话框的通常做法是把对话框封装成组件,在使用的地方引入,然后添加到template,使用visible.sync控制对话框的显示/隐藏,监听confirm事件处理用户点击确定.如下: ...

  4. Spring中常见的bean创建异常

    Spring中常见的bean创建异常 1. 概述     本次我们将讨论在spring中BeanFactory创建bean实例时经常遇到的异常 org.springframework.beans.fa ...

  5. MAPINFO中利用GridMaker工具创建栅格图层

    在工作中需要使用栅格地图,以往都是由研发人员来创建,今天偶然发现Mapinfo中有GridMaker这样一个工具,结合网络搜索自己试了一下,居然做成功了,这里把步骤记录下来,方便以后查看. 1.首先在 ...

  6. access中根据一个表创建另一个

    access中根据一个表创建另一个 SELECT * INTO newTableFROM zD_qlr; SELECT * into mdFROM zd IN 'E:\fz\高阳\大姚\fz\bz\b ...

  7. 从ACM中删除一个已经创建的Library

    从ACM中删除一个已经创建的Library,无法通过界面操作,须要手工从DB中删除.须要删除的表记录有: RECENTUPDATE 找到字段Name等于该libraryName的那条记录删除掉 del ...

  8. 彻底抛弃PeopleEditor,SharePoint中利用Jquery Chosen创建新的人员选择器

    彻底抛弃PeopleEditor,SharePoint中利用Jquery Chosen创建新的人员选择器 基于SharePoint平台开发时,人员选择器使用频率是非常高的,但是原生的人员选择器使用太麻 ...

  9. Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:

    Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...

随机推荐

  1. QUIC和TCP

    作者:henrystark henrystark@126.com Blog: http://henrystark.blog.chinaunix.net/ 日期:20140626 本文遵循CC协议:署名 ...

  2. DES的加密与解密算法(Python实现)

    DES的加密与解密算法(Python实现) 密码学实验:实现了DES的简单的加密和解密算法,DES算法的相关资料网上很多,这里不再赘述,仅仅贴出源代码给大家分享,源码中包含很多汉字注释,相信大家都是可 ...

  3. 20181204-2 Final发布

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2476 小组介绍 组长:付佳 组员:张俊余 李文涛 孙赛佳 田良 于洋 段 ...

  4. 《Linux内核分析》第一周——计算机是如何工作的?

    杨舒雯 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 课程内容 1.诺曼依体系 ...

  5. 使用SSH过程中遇到的几个问题及解决方案

    一.HTTP Status 500 - org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: B ...

  6. 小学四则运算APP 第一个冲刺阶段 第五天

    团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 第一次冲刺阶段时间:11.17~11.27 本次发布的是实现练习功能的成功 代码: public class CalculatorActi ...

  7. k8s kubectl edit 方式修改 nodeport 的端口

    0. 买了一本 每天五分钟玩转 k8s 还有 刚才转帖的blog 里面有一个 kubectl edit 的语法能够在线更改端口号 ,之前一直没弄明白. 刚才做了下实验.发现很好用 这里记录一下. 1. ...

  8. 关于“代码规范”,“Review”和“Check list”(续)

    在前两天的    关于“代码规范”,“Review”和“Check list”    一文中,我给自己列出了Check list,如下: 1.代码能够工作么?它有没有实现预期的功能,逻辑是否正确等. ...

  9. Elk 进阶部署

    虚拟机两台: 192.168.1.42 192.168.1.46 系统环境保持一致: cat /etc/redhat-release uname -a elk准备环境保持一致: elasticsear ...

  10. 【转】为什么 MQTT 是最适合物联网的网络协议

    初识 MQTT 为什么 MQTT 是最适合物联网的网络协议 Michael Yuan2017 年 6 月 14 日发布 WeiboGoogle+用电子邮件发送本页面 0 物联网 (IoT) 设备必须连 ...