VS2003 C#:重写键盘响应事件、动态创建控件、创建线程、在线程中使用委托在界面显示数据

来源:互联网 发布:女士淘宝 编辑:程序博客网 时间:2024/06/05 10:58

主界面:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
  {
   const int WM_KEYDOWN = 256; //消息响应的问题可以参考其他win32编程的文章
   const int WM_SYSKEYDOWN  = 260; 

   if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
   {
    if (keyData == (Keys.Control | Keys.A))
    {
     if (shutterInfo.isReceiveShutterStart)
     {
      FrmRunInfoShow dlgRunInfo = new FrmRunInfoShow();
      dlgRunInfo.Show();
      ShowRuntimeEvent(FrmMain.ICONWARNING,"警告:写参数调试版本不允许动态显示!");
     }
     else
     {
      ShowRuntimeEvent(FrmMain.ICONWARNING,"警告:视频检测线程未启动时不允许启动调试!");
     }
    }
   }
   
   return base.ProcessCmdKey (ref msg, keyData); //调用系统处理
  } 

显示调试信息的界面:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Threading;

namespace Vids_Main
{
 /// <summary>
 /// FrmRunInfoShow 的摘要说明。
 /// </summary>
 public class FrmRunInfoShow : System.Windows.Forms.Form
 {
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;
  
  /// <summary>
  /// 预定义常数 动态生成的LABEL控件数量
  /// </summary>
  private const int DYNAMIC_CREATE_LABEL_NUMBER = 32;
  /// <summary>
  /// 动态生成的控件控制变量
  /// </summary>
  private Label[]   dynamicLabelArray;
  /// <summary>
  /// 动态获取运行时参数信息并显示的线程
  /// </summary>
  Thread  threadShowRunInfo;
  /// <summary>
  /// 是否退出的线程的标志变量
  /// </summary>
  bool    exitThread;
  
  /// <summary>
  /// 线程界面显示数据的委托
  /// </summary>
  delegate void ShowRunInfoDelegate(int[] result);
  /// <summary>
  /// 关闭本界面和线程的委托
  /// </summary>
  delegate void CloseFromDelegate();

  public FrmRunInfoShow()
  {
   //
   // Windows 窗体设计器支持所必需的
   //
   InitializeComponent();

   //
   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
   //
  }

  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if(components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }

  #region Windows 窗体设计器生成的代码
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {
   System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(FrmRunInfoShow));
   //
   // FrmRunInfoShow
   //
   this.AutoScaleBaseSize = new System.Drawing.Size(7, 17);
   this.ClientSize = new System.Drawing.Size(568, 177);
   this.Font = new System.Drawing.Font("Arial", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
   this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
   this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
   this.KeyPreview = true;
   this.MaximizeBox = false;
   this.Name = "FrmRunInfoShow";
   this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
   this.Text = "VTPR运行时信息";
   this.TopMost = true;
   this.Closing += new System.ComponentModel.CancelEventHandler(this.FrmRunInfoShow_Closing);
   this.Load += new System.EventHandler(this.FrmRunInfoShow_Load);

  }
  #endregion

  private void FrmRunInfoShow_Load(object sender, System.EventArgs e)
  {
   int dynamicLocationY = 12;      //动态控件的起始Y坐标位置
   const int LineObjectNumber = 7; //每行的控件数量
   
   dynamicLabelArray = new Label[DYNAMIC_CREATE_LABEL_NUMBER];

   for (int i=0; i<DYNAMIC_CREATE_LABEL_NUMBER; i++)
   {
    if ((i % LineObjectNumber == 0) && (i != 0))
    {
     dynamicLocationY = dynamicLocationY + 21 + 12;
    }
    dynamicLabelArray[i] = new Label();
    dynamicLabelArray[i].Size = new System.Drawing.Size(60, 21);
    dynamicLabelArray[i].Location = new Point(12+ (i % LineObjectNumber) * 80,dynamicLocationY);
    dynamicLabelArray[i].BorderStyle = BorderStyle.Fixed3D;
    dynamicLabelArray[i].Text = "";
    dynamicLabelArray[i].BackColor = Color.White;
    dynamicLabelArray[i].ForeColor = Color.Black; //Color.FromArgb(192, 0, 0); //Color.Red;  
    this.Controls.Add(dynamicLabelArray[i]);
   }
   
   exitThread = false; //是否退出线程的标识,默认不退出线程

   threadShowRunInfo = new Thread(new ThreadStart(VTPRShowRunInfo));
   threadShowRunInfo.Name  = "VTPR Show RunInfo";
   threadShowRunInfo.Start(); //启动获取运行时参数信息并显示的线程
 
   Communication.IsThreadGetRunInfoWork = true; //设置线程状态为工作
  }
  
  /// <summary>
  /// 线程函数 获取运行时参数信息并显示的线程
  /// </summary>
  private void VTPRShowRunInfo()
  {
   int loopCount = 0;
   int[] runInfoBuffer;
   bool needCloseMe = false;
 
   runInfoBuffer = new int[DYNAMIC_CREATE_LABEL_NUMBER];

   for (int i=0; i<DYNAMIC_CREATE_LABEL_NUMBER; i++)
   {
    runInfoBuffer[i] = 0; //
   }

   //
   //EventHandler eh = new EventHandler(ShowRunInfo);
   ShowRunInfoDelegate showRunInfo = new ShowRunInfoDelegate(NowShowRunInfo);
   CloseFromDelegate closeMe = new CloseFromDelegate(NowCloseForm);
 
   while(!exitThread)
   {
    if (Communication.NeedExitGetRunInfo)
    {
     needCloseMe = true;
     break;
    }
    Thread.Sleep(50);
    loopCount++;
    if (loopCount == 20)
    {
     loopCount = 0;
     //具体取运行时信息操作
     Communication.VTPRGetRunInfo(0,runInfoBuffer);
//     for (int i=0; i<DYNAMIC_CREATE_LABEL_NUMBER; i++)
//     {
//      runInfoBuffer[i] = DateTime.Now.Second;
//     }
     this.Invoke(showRunInfo, new object[]{runInfoBuffer});
    }
   }

   if (needCloseMe)
   {
    this.Invoke(closeMe);  
   }
  }
  
  /// <summary>
  /// 根据传入参数显示动态信息到界面
  /// </summary>
  /// <param name="result">需要显示的数据缓存</param>
  void NowShowRunInfo(int[] result)
  { 
   for (int i=0; i<result.Length; i++)
   {
    dynamicLabelArray[i].Text  = result[i].ToString(); //
   }
  }
  
  /// <summary>
  /// 关闭本界面
  /// </summary>
  void NowCloseForm()
  {
   this.Close();
  }

  private void FrmRunInfoShow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
  {
   exitThread = true;      //设置退出线程标志 退出线程
   Application.DoEvents(); //等待线程退出
   Thread.Sleep(100);      //等待线程退出
   Application.DoEvents(); //等待线程退出

   Communication.IsThreadGetRunInfoWork = false; //设置线程状态为关闭
  }
 
  protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
  {
   // TODO:  添加 FrmRunInfoShow.ProcessCmdKey 实现
   const int WM_KEYDOWN = 256; //消息响应的问题可以参考其他win32编程的文章
   const int WM_SYSKEYDOWN  = 260; 

   // TODO:  添加 FrmMain.ProcessCmdKey 实现
   if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
   {
    if (keyData == (Keys.Control | Keys.C)) //支持快捷键 CTRL + C 关闭本界面
    {
     this.Close();
    }
   }

   return base.ProcessCmdKey (ref msg, keyData);
  }
 }
}

原创粉丝点击