ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4587|回复: 11

[求助] 这是VBA识别地图边界的代码,我就纳了闷了,为什么每次得出的结果都不一样呢?谢谢

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-10-7 20:05 | 显示全部楼层 |阅读模式
本帖最后由 cumulonimbus 于 2012-10-8 13:18 编辑

这是VBA识别地图边界的代码,我就纳了闷了,为什么每次得出的结果都不一样呢?谢谢
根据这个网站的代码改编
http://topic.csdn.net/u/20090511/17/535ba985-8eb3-4d07-8010-a22cec06627c.html
希望有人能够指点迷津。 地图.rar (20.75 KB, 下载次数: 51)

未命名.JPG

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-10-8 12:10 | 显示全部楼层
你这个图片是JPG的,你先在程序中把图片处理成黑白的图片,然后根据黑色取得一个座标数组,最后用取得的座标数组创建一个多边形区域,此区域就为地图中的区域。如果要描边的话,使用区域描边就OK了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-8 13:13 | 显示全部楼层
本帖最后由 cumulonimbus 于 2012-10-8 13:19 编辑
joforn 发表于 2012-10-8 12:10
你这个图片是JPG的,你先在程序中把图片处理成黑白的图片,然后根据黑色取得一个座标数组,最后用取得的座标 ...


大侠,我这个图片就是黑白图片呀,要怎么弄?给个例子
我这个在窗体上按了鼠标,就成这样了,而且每一次都不同
未命名.JPG

TA的精华主题

TA的得分主题

发表于 2012-10-10 18:54 | 显示全部楼层
cumulonimbus 发表于 2012-10-8 13:13
大侠,我这个图片就是黑白图片呀,要怎么弄?给个例子
我这个在窗体上按了鼠标,就成这样了,而且每一 ...

这是文件中的一段 VBA 代码,楼主可以自己去分析吧:
Private Sub UserForm_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
     Dim lColor As Long
     Dim i As Long, j As Long, idx As Long
     Dim m As Long, n As Long, f As Long
     Dim ptMargin() As POINTAPI, ptIdx As Long
      
     'Óñ³¾°Ë¢Ìî³ä¸ÃÇøÓò
     ExtFloodFill m_hMemDC, x, y, GetPixel(m_hMemDC, x, y), FLOODFILLSURFACE
     '»ñµÃÌî³äºóµÄÇøÓòÖÖ×ÓÑÕÉ«
     lColor = GetPixel(m_hMemDC, x, y)
     '±éÀúÄÚ´æλͼ²éѯÌî³äÇøÓòµÄ±ß½ç
     ptIdx = -1
     m = IIf(x - 150 < 0, 0, x - 150)
     n = IIf(y - 120 < 0, 0, y - 120)
     For j = n To y + 120
         f = 0
         For i = m To x + 150
             If GetPixel(m_hMemDC, i, j) = lColor Then
                 If f = 0 Then '&Otilde;&Ograve;&micro;&frac12;×&icirc;×ó&micro;&Auml;±&szlig;&frac12;&ccedil;&micro;&atilde;
                     f = 1
                     ptIdx = ptIdx + 1
                     ReDim Preserve ptMargin(ptIdx)
                     ptMargin(ptIdx).x = i
                     ptMargin(ptIdx).y = j
                 End If
             Else
                 If f = 1 Then '&Otilde;&Ograve;&micro;&frac12;×&icirc;&Oacute;&Ograve;&micro;&Auml;±&szlig;&frac12;&ccedil;&micro;&atilde;
                     f = 0
                     ptIdx = ptIdx + 1
                     ReDim Preserve ptMargin(ptIdx)
                     ptMargin(ptIdx).x = i - 1
                     ptMargin(ptIdx).y = j
                 End If
             End If
         Next
     Next
     '&Egrave;&iexcl;&Iuml;&ucirc;&Igrave;&icirc;&sup3;&auml;
     ExtFloodFill m_hMemDC, x, y, GetPixel(m_hMemDC, x, y), FLOODFILLSURFACE
     '&Ntilde;é&Ouml;¤&frac12;á&sup1;&ucirc;&pound;&not;&Oacute;&Atilde;±&szlig;&frac12;&ccedil;&micro;&atilde;&Ecirc;&yacute;&Atilde;è&raquo;&aelig;±&szlig;&frac12;&ccedil;&Iuml;&szlig;
     For i = 0 To ptIdx
        SetPixelV hdc, ptMargin(i).x, ptMargin(i).y, vbRed
        ' Me.PSet (ptMargin(i).x, ptMargin(i).y), vbRed
     Next
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-10 21:52 | 显示全部楼层
本帖最后由 cumulonimbus 于 2012-10-10 21:54 编辑
地图.rar (69.96 KB, 下载次数: 10) lu_zhao_long 发表于 2012-10-10 18:54
这是文件中的一段 VBA 代码,楼主可以自己去分析吧:
Private Sub UserForm_MouseUp(ByVal Button As In ...


大哥,辛苦啦。{:soso_e163:}
我运行了你的代码,发现你的代码运行的效果与我的代码一模一样,头痛呀,想不通是怎么回事儿。
本来我想代码的效果:每个省点一下省边界内,就会在这个省原边界用红色描绘出红色边界,点完所有的省,就会跑出一幅中国地图。可是做不到,老是移位,并出现色直线。恐怕这是VBA的局限吧

地图.rar

69.96 KB, 下载次数: 34

TA的精华主题

TA的得分主题

发表于 2012-10-10 23:39 | 显示全部楼层
本帖最后由 Moneky 于 2012-10-10 23:53 编辑

可能是代码中的坐标转换问题,将窗体picturealignment属性设置为0,将图片置于左上角后,没有发生偏移现象,但还是有些问题,楼主仔细再看看代码吧
另外,vba中窗体mouse_up事件中的返回的x,y值的单位应该不是楼主所预期的,建议看看winland版主在http://club.excelhome.net/forum.php?mod=viewthread&tid=203573的转换代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-11 10:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Moneky 发表于 2012-10-10 23:39
可能是代码中的坐标转换问题,将窗体picturealignment属性设置为0,将图片置于左上角后,没有发生偏移现象, ...

能帮忙改改么

TA的精华主题

TA的得分主题

发表于 2012-10-11 11:14 | 显示全部楼层
cumulonimbus 发表于 2012-10-11 10:46
能帮忙改改么

看着太繁琐了,自己改改吧

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-11 11:32 | 显示全部楼层
Moneky 发表于 2012-10-11 11:14
看着太繁琐了,自己改改吧

谢谢,我试试

TA的精华主题

TA的得分主题

发表于 2019-8-20 23:05 | 显示全部楼层
你好这个大纲的任何更新  VBA?

非常重要且非常有用
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 09:53 , Processed in 0.042993 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表