下载示例工程 - 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. NO--12模拟服务器端请求之node.js

    最近几天项目上线,工作比较忙,没时间更博了,好在今天有点时间并且同事问道我一个问题,正好一块解决 使用 Vue 写项目肯定会遇到一个问题,如何模拟服务端请求数据,那这就需要用到 node.js 了. ...

  2. strongSwan配置、运行及测试

    版本信息:strongSwan v5.7.2 1.      编译 tar xvf strongswan-5.7.2.tar.gz ./configure --prefix=/usr/ --sysco ...

  3. blob下载出现多余乱码内容

    blob需要单独获取,,不能通过map来获取 jdbcTemplate.query(sqlcontent, new Object[] {id},     new AbstractLobStreamin ...

  4. asp.net简述MVC开发模式

    详情请参考:http://www.runoob.com/aspnet/mvc-intro.html 1.MVC 是三种 ASP.NET 编程模式中的一种.MVC 是一种使用 MVC(Model Vie ...

  5. How to delete deployed process definition in activiti?

    https://community.alfresco.com/thread/219767-how-to-delete-deployed-process

  6. PHP的魔术方法

    PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods) 魔术方法包括: __construct(),类的构造函数 __destruct(),类的析构函数 __call(),在对 ...

  7. Ubuntu18.04 安装后的简单实用设置[未完成]

    1. 安装完成. 2. 更新 sudo apt-get update 3. 修改vi 放置键盘错位的问题 编辑文件/etc/vim/vimrc.tiny 将“compatible”改成“nocompa ...

  8. Elk 进阶部署

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

  9. c++11 基于范围的for循环

    c++11 基于范围的for循环 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> # ...

  10. 解决 No Entity Framework provider found for the ADO.NET provider

    方法很简单,添加下面的dll即可 EntityFramework.SqlServer.dll     疯吻IT