图形处理问题

hnwl0507 2008-09-17 08:54:43
最近在用VB.NET做一个网络监控的东西,但遇到个问题,比如说在一张楼房层的平面图上要表示出这层楼的一些被监控点,我刚开始采用自制控件的形式来表示,这是可以的,但是当楼层的被监控点过多时系统加载控件太多运行起加载控件速度就太慢了,所以我想采用另一种方式来实现,我想到了用drawImage来进行画点的方式,可是出现个问题就是你选择不同的楼层时要画来对应的点来,并且楼层被监控点的数量是不确定,只能通过动态的。这样就出现了画来的点只是当你选择楼层时它只是相应的一闪而过不会永久的保存在平面图上。
sql1 = "select CaiYangType,CaiYangCoding,KongJianX,KongJianY from CaiYangValue where —GongChengName='" & ParentNodeText & "' and BuWeiName='" & NodeText & "'"
Call FillDataSet2Table(sql, sql1)
Dim g As Graphics
Dim LEDString As String = ""
g = PBGongChengImage.CreateGraphics
Dim font As New Font("宋体", 14, FontStyle.Regular, GraphicsUnit.Pixel, 1)
For i As Integer = 0 To DSet.Tables("B").Rows.Count - 1
g.DrawImage(PBLED.Image, DSet.Tables("B").Rows(i).Item(2), DSet.Tables("B").Rows(i).Item(3), 15, 15)
Select Case DSet.Tables("B").Rows(i).Item(0)
Case "感烟探测器"
LEDString = "Y" & DSet.Tables("B").Rows(i).Item(1)
Case "感温探测器"
LEDString = "W" & DSet.Tables("B").Rows(i).Item(1)
Case "气体探测器"
LEDString = "Q" & DSet.Tables("B").Rows(i).Item(1)
Case "手动报警按钮"
LEDString = "S" & DSet.Tables("B").Rows(i).Item(1)
Case "声光报警器"
LEDString = "G" & DSet.Tables("B").Rows(i).Item(1)
End Select
g.DrawString(LEDString, font, Brushes.Orange, DSet.Tables("B").Rows(i).Item(2) - 5, DSet.Tables("B").Rows(i).Item(2) + 15)
Next
PBGongChengImage与PBLED为picturebox控件 PBGongChengImage是用来显示楼层平面图的 不能用将被监控点的先画在平面图上,然后再保存整张图(有被监控点的图)
不知哪位高手能否指一二,或许还有什么更好的办法不?
...全文
73 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hnwl0507 2008-09-18
  • 打赏
  • 举报
回复
我采用了双倍缓冲但还是一样的闪。同时我也采用了PictureBox的BackGroundImage载入一个平面图,再在PictureBox的Image上绘制监测点,可以使用内存缓冲,或是先画到内存中的bmp上,再将bmp贴入图片框的方法减少闪烁,此法行不通。
我的代码为:map = Image.FromFile(Application.StartupPath & "\picture\" & path)
Dim Bmap As New Bitmap(map.Width, map.Height)
gmap = Graphics.FromImage(Bmap)
gmap.DrawImage(map, 0, 0, map.Width, map.Height)
PBGongChengImage.CreateGraphics.DrawImage(Bmap, 0, 0, map.Width, map.Height)
gmap.Dispose()
Bmap.Dispose()
此代码写入后同时会出现闪的情况
Forrest23 2008-09-18
  • 打赏
  • 举报
回复
帮顶
cauhorse 2008-09-18
  • 打赏
  • 举报
回复
在容器里,如PictureBox里绘制某一楼层的平面图,在更新楼层平面图前Clear掉原有的楼层平面图。
PictureBox会自动重绘当前静态图像里的内容。如果确实需要将平面图与监测点分开画的话,可以用
PictureBox的BackGroundImage载入一个平面图,再在PictureBox的Image上绘制监测点。可以使用
内存缓冲,或是先画到内存中的bmp上,再将bmp贴入图片框的方法减少闪烁。
要不就在OnPaint事件里编写你的绘图事件,每次窗体试图刷新时,就重绘一次某一层的平面图与监测点。
wjq 2008-09-17
  • 打赏
  • 举报
回复
你每次重晖平面图的时候也要一起画点. 最好把画点的代码加到画平面图的代码段里去.
如果刷新太平凡,可能画面会闪,可以用双倍缓冲

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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