这样的控件怎么实现好?

chinajuanbob 2008-01-23 02:50:16
想在一个控件上放很多图片
想到两个方案,但似乎都有问题:

如果是画图片,那么鼠标OnMove的时候不能快速定位目前在哪个图片上;
如果是用很多控件,每个图片放一个控件上,那么图片整体运动和背景控件刷新时又会是问题,会闪。

怎么实现这个控件呢?

考虑需求,最好能实现第二种方案,即一个control里放n个control
并且图片整体运动或者刷新的时候,所有控件都不闪

谢谢!
...全文
179 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
这个简单啊,网上搜一下就得到答案了.
wzuomin 2008-02-04
  • 打赏
  • 举报
回复
自定义一个控件如:

Public Class PicControl
Inherits PictureBox

Dim oldX, oldY As Integer
Dim txt As String = "pic"
Dim f As New StringFormat

Public Sub New()
InitializeComponent()
f.LineAlignment = StringAlignment.Center
f.Alignment = StringAlignment.Center
Me.BorderStyle = Windows.Forms.BorderStyle.FixedSingle
Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
End Sub

Public Sub SetID(ByVal index As Integer)
txt = "pic" + index.ToString
End Sub

Private Sub Pic_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left Then
oldX = e.X
oldY = e.Y
Else
Dim cd As New OpenFileDialog
cd.Filter = "*.jpg|*.jpg"
If cd.ShowDialog = DialogResult.OK Then
Me.BackgroundImage = Drawing.Image.FromFile(cd.FileName)
End If
End If
End Sub

Private Sub Pic_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim dx As Integer = e.X - oldX
Dim dy As Integer = e.Y - oldY
Me.Location = New Point(Me.Location.X + dx, Me.Location.Y + dy)
End If
End Sub

Private Sub Pic_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint

e.Graphics.DrawString(txt, Font, Brushes.Red, Me.ClientRectangle, f)
End Sub
End Class


然后在窗体中添加控件后运行,看看拖动控件移动效果如何?

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For i As Integer = 0 To 20
Dim ctrl As New PicControl
ctrl.SetID(i)
Me.Controls.Add(ctrl)
Next
End Sub
End Class
chinajuanbob 2008-01-29
  • 打赏
  • 举报
回复
多谢回复!

需求是图片大小和热区可能不是很规整,简单计算不够,如果遍历的话,在一个OnMouseMove里可能完不成(CPU高占用)

你说的局部刷新指什么?单个控件双缓我明白,但是加个父控件就糊涂了
chen_de_sheng 2008-01-26
  • 打赏
  • 举报
回复
如果是画图片,那么鼠标OnMouseMove的时候不能快速定位目前在哪个图片上
为什么不能?
直接循环判断就行了啊

要更快的话可以把控件平均分割成n^2个块(每个块的大小为L*H)
每张图片占一个,
然后如果鼠标在x,y点
通过类似imageArray[x/L,y/H]的形式直接取图片

刷新的话一定要用双缓存,控件有个属性(DoubleCache??)改成true就行了。
还有就是一定要用局部刷新

8,834

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 组件/控件开发
社区管理员
  • 组件/控件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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