如何让PictureBox图形里面的热区相应鼠标悬停事件?

wyyxl2002 2009-10-15 10:49:20
我使用了一个PictureBox显示一副图,在图上用drawImage的方式画了一些图标,这些图标不是Control,而是用GDI画的,现在我实现,在图标上响应一下鼠标悬停事件,就是鼠标移动到图标上,就显示一下图标信息。
难点是:这些图标不是控件,没有鼠标悬停事件,而且不能用toolTip显示信息。
不知道说清楚了没有?

...全文
273 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyyxl2002 2009-10-19
  • 打赏
  • 举报
回复
谢谢,wartim,真是个好办法
wyyxl2002 2009-10-16
  • 打赏
  • 举报
回复
To wartim:
你的意思是将图标放到一个个小的pictureBox里面,然后用pictureBox的悬停事件,但是由于图标太多,还会对图标做一些拖动,点击操作,如果用pictureBox的话速度就会很慢
wartim 2009-10-16
  • 打赏
  • 举报
回复
PB.Region = new Region(GP);

让picturebox的形状和路径匹配,那点某个图形就都是在进入MouseHover了
wartim 2009-10-16
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace WindowsApplication89
{
public partial class Form1 : Form
{
Rectangle[] Rectangles = new Rectangle[]{
new Rectangle(0,0,10,10),new Rectangle(10,10,10,10),new Rectangle(20,20,10,10),
new Rectangle(60,40,10,10),new Rectangle(100,100,10,10),new Rectangle(200,20,10,10),
new Rectangle(0,80,10,10),new Rectangle(80,90,10,10),new Rectangle(220,120,10,10),
new Rectangle(10,110,10,10),new Rectangle(70,20,10,10),new Rectangle(20,20,10,10),
new Rectangle(50,300,10,10),new Rectangle(500,10,10,10),new Rectangle(470,80,10,10)};

ToolTip TT = new ToolTip();

public Form1()
{
InitializeComponent();

this.Size = new Size(600, 600);

PictureBox PB = new PictureBox();
PB.Parent = this;
PB.Dock = DockStyle.Fill;
PB.MouseHover += new EventHandler(PB_MouseHover);

GraphicsPath GP = new GraphicsPath();
GP.AddRectangles(Rectangles); // 这里构建好路径

PB.Region = new Region(GP);

Bitmap Bmp = new Bitmap(this.Size.Width, this.Size.Width);
using (Graphics G = Graphics.FromImage(Bmp))
G.FillRectangles(Brushes.Red, Rectangles);
PB.Image = Bmp;
}

void PB_MouseHover(object sender, EventArgs e)
{
TT.RemoveAll();

for (int i = 0; i < Rectangles.Length; i++)
if (Rectangles[i].Contains(((PictureBox)sender).PointToClient(Control.MousePosition)))
{
TT.SetToolTip((PictureBox)sender, "第" + (i + 1).ToString() + "个图形");
}
}
}
}
byte377 2009-10-16
  • 打赏
  • 举报
回复
JF
wyyxl2002 2009-10-16
  • 打赏
  • 举报
回复
就是没有规律的,随便放的
wartim 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wyyxl2002 的回复:]
To wartim:
  你的意思是将图标放到一个个小的pictureBox里面,然后用pictureBox的悬停事件,但是由于图标太多,还会对图标做一些拖动,点击操作,如果用pictureBox的话速度就会很慢
[/Quote]

你先仔细看看我写的代码,从头至尾只有一个picturebox,只是把这个picturebox变成不规则形状
足球中国 2009-10-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zgke 的回复:]
MouseMove事件里调用时间控件的Timer.Enabled来解决...
[/Quote]
这个不错了。或者timer都不用。直接进来就显示。把楼上的代码复制一下就可以了。
wyyxl2002 2009-10-15
  • 打赏
  • 举报
回复
图标还要响应pictureBox的点击事件,而且一张图上图标很多,大概有几百个,在MouseMove事件写的话,每动一下就要去遍历图标位置效率就很低
zgke 2009-10-15
  • 打赏
  • 举报
回复
MouseMove事件里调用时间控件的Timer.Enabled来解决...
dylike 2009-10-15
  • 打赏
  • 举报
回复
完全可以的.方法很多种.常用的是:
1 图标色彩点矩阵检查法
2 区域坐标检查法
wyyxl2002 2009-10-15
  • 打赏
  • 举报
回复
但是MouseHover 事件要鼠标从pictureBox外部移动到内部并悬停时才发生,我想要的是在pictureBox内部移动
zgke 2009-10-15
  • 打赏
  • 举报
回复
PictureBox.MouseHover 事件里解决..

private void pictureBox1_MouseHover(object sender, EventArgs e)
{
PictureBox _PictureBox = (PictureBox)sender;
Point _MousePoint = _PictureBox.PointToClient(Cursor.Position);

Region _Region = new Region(); //你要显示的区域
if (_Region.IsVisible(_MousePoint))
{
//显示toolTip
}

}
littlegang 2009-10-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wyyxl2002 的回复:]
图标还要响应pictureBox的点击事件,而且一张图上图标很多,大概有几百个,在MouseMove事件写的话,每动一下就要去遍历图标位置效率就很低
[/Quote]

图标应该是有规律排放的吧,那就不需要遍历,只要按照x、y折算一下

如果是没有规律乱放的,那就没办法了,只能遍历
wyyxl2002 2009-10-15
  • 打赏
  • 举报
回复
自己顶一下,急啊
C#串口介绍以及简单串口通信程序设计实现 源代码和串口程序介绍连接:https://www.cnblogs.com/JiYF/p/6618696.html 本站积分太贵,自己变得。。直接到连接地址下载代码 周末,没事干,写个简单的串口通信工具,也算是本周末曾来过,废话不多,直接到主题 串口介绍   串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。(至于再详细,自己百度) 串口应用:   工业领域使用较多,比如:数据采集,设备控制等等,好多都是用串口通信来实现!你要是细心的话,你会发现,目前家用国网智能电能表就具备RS485通信总线(串行总线的一种)与RS232可以相互转化(当然一般,非专业的谁也不会闲的蛋疼,趴电表上瞎看,最多也就看看走了多少度电) RS232 DB9介绍: 1.示意图 2.针脚介绍: 载波检测(DCD) 接受数据(RXD) 发出数据(TXD) 数据终端准备好(DTR) 信号地线(SG) 数据准备好(DSR) 请求发送(RTS) 清除发送(CTS) 振铃指示(RI) 3.实物图: 以下是我购买XX公司的一个usb转串口线:这个头就是一个公头,另一端是一个usb口 笨小孩串口工具运行图: 1.开启程序 2.发送一行字符串HelloBenXH,直接将针脚的发送和接收链接起来就可以测试了(针脚2 接受数据(RXD) 和3 发出数据(TXD))直接链接, C#代码实现:采用SerialPort 1.实例化一个SerialPort [csharp] view plain copy 在CODE上查看代码片派生到我的代码片 private SerialPort ComDevice = new SerialPort(); 2.初始化参数绑定接收数据事件 [csharp] view plain copy 在CODE上查看代码片派生到我的代码片 public void init() { btnSend.Enabled = false; cbbComList.Items.AddRange(SerialPort.GetPortNames()); if (cbbComList.Items.Count > 0) { cbbComList.SelectedIndex = 0; } cbbBaudRate.SelectedIndex = 5; cbbDataBits.SelectedIndex = 0; cbbParity.SelectedIndex = 0; cbbStopBits.SelectedIndex = 0; pictureBox1.BackgroundImage = Properties.Resources.red; ComDevice.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived);//绑定事件 }

110,526

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧