标题:picture控件里的图像如何放大以及其他问题
只看楼主
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:325
专家分:114
注 册:2010-2-17
结帖率:69.81%
已结贴  问题点数:20 回复次数:3 
picture控件里的图像如何放大以及其他问题
附件为我编写的一个小程序,点击运行按钮就可以得到结果。
目前遇到了两个问题,
1、想增加一个按钮,命名放大,点一下,picture控件里的图像以原始图为基准,2倍、3倍.......的放大(最大5倍即可),如同附件中的两张图片一样(放大那张图片是放大3倍的)。放大的同时,picture控件里面或者外面出现横滚动条和竖滚动条,可以拖动放大的图像左右上下的移动。请问这个功能如何实现?

2、看过我的程序就可以知道,picture里的每一个色块都是根据TXT文件里的每一行数据生成,如何在我点击某个色块时,TEXT框中就显示相应的那一行数据?在图像放大时,点击某个色块,TEXT框中也相应的显示那一行数据。请问这个功能如何实现?

麻烦哪位大神帮忙告知,或者直接在我的源码上直接修改,再传上来,让我好好学习一下,多谢!!

图.rar (109.24 KB)

搜索更多相关主题的帖子: picture 控件 图像 放大 点击 
2018-11-27 23:39
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:20 
稍微看了一下,你这个程序认步认为需要重写,按你这样的写法,无法达到你的目的。因为你的数据使用完后就丢弃了。

有些代码没看懂,解释一下。

            If CByte("&H" + Mid(temp, 12, 1)) >= 1 And CByte("&H" + Mid(temp, 12, 1)) <= 9 Then
                    Clor = Shape1(CByte("&H" + Mid(temp, 12, 1)) - 1).FillColor
                End If
            If CByte("&H" + Mid(temp, 12, 1)) >= 10 And CByte("&H" + Mid(temp, 12, 1)) <= 35 Then
                    Clor = Shape1(CByte("&H" + Mid(temp, 12, 1)) - 1).FillColor
                End If
            If CByte("&H" + Mid(temp, 12, 1)) >= 36 And CByte("&H" + Mid(temp, 12, 1)) <= 61 Then
                    Clor = Shape1(CByte("&H" + Mid(temp, 12, 1)) - 1).FillColor
                End If

取一个字节,然后按16进制数据解析,最大就是 &HF 也就是 15 ,那第二段判断,第三段判断怎么回事???
然后取颜色,都是一样的命令,那么你这个判断有什么意义??

----------------------
S As String
这个S
            DRect ii, jj, Clor, S
传入了这个函数进行绘图,你这里是使用打印方式进行绘图,你的S在哪里赋的值,没找到。

============================================================================
针对目前程序的优化建议:
1、颜色表,放到数组里,不应该只放控件。
    '颜色表定义为全局变量
    Dim 颜色表(63) As Long


程序代码:
颜色表(0) = RGB(0, 255, 0)              '这个函数是返回立即数,所以你这里写 65280 也可以的。
颜色表(1) = RGB(255, 0, 0)
颜色表(2) = RGB(0, 0, 255)
颜色表(3) = RGB(200, 0, 0)
颜色表(4) = RGB(200, 0, 200)
颜色表(5) = RGB(150, 50, 255)
颜色表(6) = RGB(200, 100, 255)
颜色表(7) = RGB(255, 0, 200)
颜色表(8) = RGB(200, 100, 0)
颜色表(9) = RGB(200, 0, 50)
颜色表(10) = RGB(100, 100, 100)
颜色表(11) = RGB(100, 255, 50)
颜色表(12) = RGB(255, 50, 200)
颜色表(13) = RGB(0, 200, 0)
颜色表(14) = RGB(0, 255, 150)
颜色表(15) = RGB(100, 150, 50)
颜色表(16) = RGB(100, 50, 150)
颜色表(17) = RGB(100, 50, 255)
颜色表(18) = RGB(0, 200, 200)
颜色表(19) = RGB(50, 0, 200)
颜色表(20) = RGB(150, 100, 150)
颜色表(21) = RGB(50, 50, 50)
颜色表(22) = RGB(200, 100, 200)
颜色表(23) = RGB(100, 150, 200)
颜色表(24) = RGB(50, 50, 150)
颜色表(25) = RGB(255, 0, 50)
颜色表(26) = RGB(50, 150, 255)
颜色表(27) = RGB(0, 200, 50)
颜色表(28) = RGB(100, 50, 0)
颜色表(29) = RGB(150, 255, 50)
颜色表(30) = RGB(200, 200, 100)
颜色表(31) = RGB(50, 0, 0)
颜色表(32) = RGB(150, 100, 255)
颜色表(33) = RGB(50, 100, 200)
颜色表(34) = RGB(50, 50, 255)
颜色表(35) = RGB(100, 100, 50)
颜色表(36) = RGB(255, 100, 100)
颜色表(37) = RGB(0, 255, 100)
颜色表(38) = RGB(50, 50, 100)
颜色表(39) = RGB(50, 255, 150)
颜色表(40) = RGB(50, 200, 200)
颜色表(41) = RGB(200, 255, 0)
颜色表(42) = RGB(255, 100, 200)
颜色表(43) = RGB(0, 50, 100)
颜色表(44) = RGB(150, 0, 100)
颜色表(45) = RGB(255, 150, 50)
颜色表(46) = RGB(0, 50, 50)
颜色表(47) = RGB(100, 0, 0)
颜色表(48) = RGB(150, 200, 100)
颜色表(49) = RGB(100, 200, 100)
颜色表(50) = RGB(50, 150, 0)
颜色表(51) = RGB(50, 255, 0)
颜色表(52) = RGB(200, 255, 100)
颜色表(53) = RGB(255, 50, 0)
颜色表(54) = RGB(0, 255, 200)
颜色表(55) = RGB(0, 150, 50)
颜色表(56) = RGB(100, 255, 150)
颜色表(57) = RGB(100, 150, 255)
颜色表(58) = RGB(255, 255, 50)
颜色表(59) = RGB(200, 50, 100)
颜色表(60) = RGB(0, 255, 50)
颜色表(61) = RGB(50, 255, 100)
颜色表(62) = RGB(200, 0, 100)
颜色表(63) = RGB(50, 150, 50)

Dim i As Long
For i = 0 To 63
    Shape1(i).BackColor = 颜色表(i)
    Shape1(i).FillStyle = vbshapesolid
    Shape1(i).FillColor = 颜色表(i)
Next i


2、判断时,不要总临时计算。对同一个变量多次判断,可以使用多分支选择。
程序代码:
        '增加了二个变量,i 和 j ,在循环体外面定义一下就可以,变量类型,建议long ,也可以 byte 
            i = CByte("&H" & Mid(temp, 12, 1))
            Select Case i
                Case 0
                    j = CByte("&H" & Mid(temp, 5, 1))
                    If j = 0 Then
                        Clor = vbBlue
                    ElseIf j = 8 Then
                        Clor = vbYellow
                    Else
                        '没有例外情况???
                    End If
                Case Is <= 9             '1-9       以下三组分支,必须严格按判断数字大小的顺序来写
                    Clor = 颜色表(i - 1)
                Case Is <= 35            '10-35     颜色表也是与上面的相同???????
                    Clor = 颜色表(i - 1)
                Case Is <= 61           '36-61      ?????
                    Clor = 颜色表(i - 1)
                Case Else
                    '没有例外???颜色表 61 62 63 干嘛的?
            End Select

------------
    wd = 164
    ht = 242
这二个值,建议定义为 全局常量 。



授人于鱼,不如授人于渔
早已停用QQ了
2018-11-28 11:38
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
1、想增加一个按钮,命名放大,点一下,picture控件里的图像以原始图为基准,2倍、3倍.......的放大(最大5倍即可),如同附件中的两张图片一样(放大那张图片是放大3倍的)。放大的同时,picture控件里面或者外面出现横滚动条和竖滚动条,可以拖动放大的图像左右上下的移动。请问这个功能如何实现?

三个 picture 控件,
    一个绘图,不显示在窗体上,可以放到窗体外面去。开自动重绘。
    一个显示,不能自动重绘,因为放大后可能就超限制了。
    一个为窗口,放滚动条和显示控件。
绘图流程:
在绘图控件上绘图,然后根据显示比例,复制到显示控件上。
显示比例改变量,重定义 显示控件大小,然后重新按新的比例从绘图控件上复制图像到显示控件上。
显示控件刷新事件里,根据显示比例,复制到显示控件上。

比例设置:适合窗体大小,50%、原始大小,200%,300%,400%,500% 。
其中 适合窗体大小需要临时计算比例。

------------------------
2、看过我的程序就可以知道,picture里的每一个色块都是根据TXT文件里的每一行数据生成,如何在我点击某个色块时,TEXT框中就显示相应的那一行数据?在图像放大时,点击某个色块,TEXT框中也相应的显示那一行数据。请问这个功能如何实现?
首先,数据读出来后,需要定义一个数组把整个数据都保存着。
其次,鼠标按键释放事件中,这个事件中有 鼠标坐标
检测鼠标按键是不是指定的键,然后根据鼠标 X ,Y,按你格子大小,计算 对应的数据下标是多少。
根据这个下标去数组中找对应的元素,然后显示到 TEXT框了。

大概了流程就在,具体代码你自己琢磨,必竟都8年的老程序员了。

授人于鱼,不如授人于渔
早已停用QQ了
2018-11-28 11:50
cunfu2018
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2018-12-12
得分:0 
刚好碰到同样的问题,学习了,谢谢!
2018-12-12 10:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-491624-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019618 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved