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);
}
}
}
- VS2003 C#:重写键盘响应事件、动态创建控件、创建线程、在线程中使用委托在界面显示数据
- 如何在线程中创建可以响应事件的窗体
- (转)在MFC中动态创建控件以及事件响应
- 在MFC中动态创建控件以及事件响应
- 在MFC中动态创建控件以及事件响应
- 在MFC中动态创建控件以及事件响应
- 在MFC中动态创建控件以及事件响应
- 在MFC中动态创建控件以及事件响应
- 在MFC中动态创建控件以及事件响应
- 在MFC中动态创建控件以及事件响应
- 在MFC中动态创建控件以及事件响应
- 在MFC中动态创建控件以及事件响应
- 使用委托在用户自定义控件中实现事件响应
- 在C++Builder中动态创建控件
- 在Android中使用HandlerThread创建线程
- 在Android中使用HandlerThread创建线程
- 在Android中使用HandlerThread创建线程
- 在Android中使用HandlerThread创建线程
- 禁止右键及右键菜单js
- 从整体到局部-----俯瞰Struts2整体流程(6)
- tomcat的端口更改与添加
- zend 实用小技巧 2
- 我的计划
- VS2003 C#:重写键盘响应事件、动态创建控件、创建线程、在线程中使用委托在界面显示数据
- NSGA-2学习笔记
- meta标签之详解
- 最近老贪玩象棋,误了许多正事
- c构设计理念分析
- c构设计理念分析
- 计算机辅助教学演示用小程序(A sample computer aided instruction applet)
- 在Tomcat中配置与使用数据源
- C/C++ qsort()快速排序的用法