多线程中用ContextMenuStrip单击鼠标左键时显示信息 鼠标左键单击失灵

摘要:有时我们的.bmp位图上有不同颜色的节点,我们想点击一个点后能显示该点的信息,那么我们首先要获得该点的颜色值判断是不是点击到了点的位置,而不是空白的位置。
Color pixelColor=bmp.GetPixel(bmpPoint.X,bmpPoint.Y);其中bmpPoint.X和bmpPoint.Y是鼠标点击处的点的坐标,获取它的方式为PointpictureBoxPoint=pictureBox1.PointToClient(Control.MousePosition);
如果点击的是有色点处则用ContextMenuStrip显示响应信息if(pixelColor.ToArgb().Equals(Color.Blue.ToArgb())||pixelColor.ToArgb().Equals(Color.Green.ToArgb())){ if(e.Button==MouseButton.Left)//鼠标左击时显示 { contextMenuStripLeftClick.Show(System.Windows.Forms.Cursor.Position.X,System.Windows.Forms.Cursor.Position.Y); }}下面是在测试多线程画图时用到的测试代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;
namespace TestThread{ public partial classForm1 : Form { public delegate void UpdateTxt(string info);//为打印声明代理 UpdateTxt updateTxt; public delegate void UpdateBox(stringinfo); UpdateBox updateBox; string contextMenuStripID = ""; public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgse) { updateTxt= new UpdateTxt(UpdateTxtMethod); updateBox= new UpdateBox(UpdateBoxMethod); Threadtimer = new Thread(new ThreadStart(delegate { PrintTime(); })); timer.IsBackground = true; Threaddrawpicture = new Thread(new ThreadStart(delegate{ DrawPicture(); })); drawpicture.IsBackground = true; timer.Start(); drawpicture.Start(); //Control.CheckForIllegalCrossThreadCalls = false;//跨线程访问控件不安全的做法,通过代理实现 } public void UpdateTxtMethod(string info) { lblTime.Text = info; } public void UpdateBoxMethod(string info) { rtbDataReceived.AppendText(info); rtbDataReceived.ScrollToCaret(); } private void PrintTime() { while(true) { this.BeginInvoke(updateTxt,DateTime.Now.ToString()); Thread.Sleep(1000); } } public string bitMapFileName=@"D:test.bmp"; public int rx=15, ry=15; public void GenerateNewMeter(int x, int y) { Brushmybrush = new SolidBrush(Color.Blue); Bitmap bmp= new Bitmap(356,431); Graphics g= Graphics.FromImage(bmp); g.FillEllipse(mybrush, x+5 , y+5 , 20, 20);
bmp.Save(bitMapFileName); pictureBox1.Load(bitMapFileName); Application.DoEvents(); } int i=0; private void DrawPicture() { while(true) { for (i = 0; i < 100; ++i) { if (i==2||i==4||i==6||i==10) { GenerateNewMeter(rx,ry); rx += 20; ry += 20; } else { this.BeginInvoke(updateBox,"This is"+i.ToString()+"rn"); Thread.Sleep(1000); } } Console.ReadLine(); } }
多线程中用ContextMenuStrip单击鼠标左键时显示信息 鼠标左键单击失灵
private voidcontextMenuStripLeftClick_Opening(object sender,CancelEventArgse) {
ToolStripMenuItemID.Text += contextMenuStripID; ToolStripMenuItemIP.Text += "0201001"; ToolStripMenuItemVersionG1.Text += "00000000"; ToolStripMenuItemVersionG2.Text+= "00000001"; }
private void pictureBox1_MouseClick(objectsender, MouseEventArgs e) { PointpictureBoxPoint =pictureBox1.PointToClient(Control.MousePosition); if(pictureBox1.Image != null) { Bitmap bmp = newBitmap(pictureBox1.Image);
double xRadio =((double)bmp.Width) / ((double)pictureBox1.Width); //计算加载在pictureBox上的bmp的比例 double yRadio =((double)bmp.Height) / ((double)pictureBox1.Height); Point bmpPoint = newPoint(); bmpPoint.X =Convert.ToInt32(pictureBoxPoint.X*xRadio); bmpPoint.Y =Convert.ToInt32(pictureBoxPoint.Y*yRadio); contextMenuStripID ="FCFC"; Color piexlColor =bmp.GetPixel(bmpPoint.X,bmpPoint.Y);
if(piexlColor.ToArgb().Equals(Color.Blue.ToArgb())) { if (e.Button==MouseButtons.Right) contextMenuStripLeftClick.Show(System.Windows.Forms.Cursor.Position.X,System.Windows.Forms.Cursor.Position.Y); } } } }}

  

爱华网本文地址 » http://www.aihuau.com/a/25101011/43502.html

更多阅读

多线程的使用(Delphi) delphi多线程实例

TThread在Classes单元中声明,直接从TObject继承下来的,因为,它不是组件.TThread是个抽象类,所以不能创建TThread的实例,而只能创建其派生类的实例.利用TThread类来编写多线程应用程序的一般步骤如下:[步骤一]从TThread类派生出一个

linux 下多线程编程 linux下的多线程编程

共13章:第一章 线程基础multithreading可以被翻译成多线程控制。与传统的UNIX不同,一个传统的UNIX进程包含一个单线程,而多线程(MT)则把一个进程分成很多可执行线程,每一个线程都独立运行。阅读本章可以让你理解:Defining Multithreading T

php进程后台调用(多线程/进程) php 多进程与多线程

php进程后台调用http://blog.iyi.cn/start/2006/11/php_6.html这两天在研究php模拟多线程的问题,碰到一个问题就是无论exec、popen、还是proc_open都会造成等待,也就是阻塞式的调用,而我想要得是无阻塞的调用,让程序在后台执行就可以解

Linux下Qt多线程编程 linux下的多线程编程

作者:武汉华嵌技术部以下和大家分享Linux平台下Qt两种多线程编程的方式:1、使用Linux平台下的线程函数。以下是给出的代码片段://此处为连接信号和槽,通过Qt界面中两按钮来控制两个槽函数connect(pthred1start, SIGNAL(clicked()), this

声明:《多线程中用ContextMenuStrip单击鼠标左键时显示信息 鼠标左键单击失灵》为网友痞子绅士分享!如侵犯到您的合法权益请联系我们删除