说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

VB5实现窗口图像缩放、滚动技巧

HTML文档下载 WORD文档下载 PDF文档下载
VB5实现窗口图像缩放、滚动技巧

洪志全


Visual Basic是Windows平台中最常用的应用软件开发语言,窗口图像缩放、滚动是图像处理、多媒体数据库等应用软件开发中的基本功能。本文将介绍如何用VB 5.0实现地窗口图像缩放和滚动技巧,供读者在各种语言系统开发中参考。
一、获取图像
本文所介绍的图像缩放并没有对真正的图像进行缩放,而是复制一幅窗口图像的真实画面,对这个窗口图像附本进行局部缩放和滚动,获取窗口图像可使用Windows的API函数来实现。具体来说,实现窗口图像缩放、滚动需要用GetDeskTopWindow()函数获取桌面窗口句柄,再通过GetDC()函数转换为描述表句柄,则用BitBlt()函数把桌面图像复制到任意图形容器控件中,桌面图像复制完成后,再用ReleaseDC释放窗口描述表,各API函数的具体使用方法参见本文的
例子程序。本文所用的API函数包含在WIN95/98的GDI32.DLL和USER32.DLL动态链接库中,在使用时可通过VB5.0的TEXT VIEWER复制到所开发的应用程序中。
二、图像缩放
图像缩放显示的基本原理就是把原图像的一部分缩放后再送入窗口的图形容器控件中,在VB中可用内部命令PaintPicture来进行,语法格式为:
PaintPicturePic,DestX,DestY,DestWidth,DestHeight,ScrX,ScrY,ScrWidth,ScrHeight
其中,Pic为图片对象,如图形控件对象等;DestX,DestY 为目标图像起始坐标;
DestWidth,DestHeight 为目标图像幅面尺寸;ScrX,ScrY 为源图像起始坐标;
ScrWidth,ScrHeight 为源图像剪裁尺寸。该命令就是把一个源图像资源任意复制到指定的区域,其功能相当于API函数的BitBlt,但使用更简单,若复制时改变源图像的ScrWidth,ScrHeight或目标图像的DestWidth,DestHeight可使复制后的图像尺寸发生变化,实现窗口图像的缩放显示。若ScrWidth,ScrHeight或DestWidth,DestHeight为负值还可实现窗口图像的水平、垂直反转显示。因此,在把源图像送入目标图形容器控件时,若改变源图像的幅面尺寸,即可实现图像的缩放处理。
三、图像滚动
当载入图像尺寸大于图形控件窗口时,为了便于浏览、选取必须对窗口图像滚动操作。窗口图像滚动可通过水平滚动控件HScroll和垂直滚动控件VScroll来实现,通过控件的改变值HScroll.Value和VScroll.Value来控制PaintPicture命令中的源图像坐标ScrX和ScrY,即可实现窗口图像的滚动操作。
四、图像缩放、滚动实现
本文可对非压缩BMP位图进行缩放、滚动,非压缩BMP位图的宽度和高度在文件开始11H后的8个字节。若读者需要对其它图像格式(如JPG,TIF等)进行缩放操作,可根据本文介绍的方法对找出相应的图像高度和宽度即可,具体实现步骤如下:
1.执行“File>Projects”创建一新项目APPIMG.VBP,在FORM窗口中创建PictureBox、CommandButton、HScroll、VScroll等对象,调整各自位置,并设置各对象的属性如下:Form:Name = AppImage, ScaleMode = 1
PictureBox:Name = ImageWin, Appearance = 1-3D, ScaleMode = 3
CommandButton:Name = ZoomIn, Caption="Zoom In"
CommandButton:Name = ZoomOut, Caption="Zoom Out"
CommandButton:Name = ExitButton, Caption="Exit"
2.双击FORM窗口,并将下面程序输入到Form对象的Load事件中。该程序用于读取图像的宽度和高度,初始化常用参数,载入窗口图像,并将图像复制到FORM窗口的PictureBox图形控件容器中显示。
Private Sub Form_Load()
Dim FileName As String
FileName = "C:\SAMP.BMP"
Open FileName For Binary As #1
Get #1, 19, ImageWidth: Get #1, , ImageHeight 注释:读取位图的宽度和高度
Close #1DW = 15 * ImageWidth - ImageWin.Width 注释:将像点转换为Twip(微点)DH = 15 * ImageHeight - ImageWin.Height
ImageWin.Width = 15 * ImageWidth
ImageWin.Height = 15 * ImageHeight
AppImage.AutoRedraw = True
AppImage.Caption = FileName 注释:改变Form窗标题
HScroll1.SmallChange = 100 注释:设置滚动最小步距
VScroll1.SmallChange = 100
DX = ImageWin.Width: DY = ImageWin.Height 注释:设置复制图像尺寸
SX = ImageWin.Width: SY = ImageWin.Height
AMP = 1 注释:设置缩放比例为1
sWin = GetDesktopWindow() 注释:获取桌面窗口句柄
sDC = GetDC(sWin) 注释:转换为描述表句柄
hd = BitBlt(ImageWin.hdc, 0, 0, Image.Width, Image.Height, sDC, 0, 0, &HCC0020)hd = ReleaseDC(sWin, sDC) 注释:释放窗口描述表
AppImage.ImageWin = LoadPicture(FileName) 注释:载入图像显示
End Sub
3.在General对象的Declaration过程中声明本程序所使用的WIN95 API函数和和过程,以及各事件程序所使用的全局变量等。
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As LongPrivate Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function GetDesktopWindow Lib "user32" () As LongPrivate Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As LongDim sWin, sDC, hd
Dim ImageWidth As Long, ImageHeight As Long
Dim DX, DY, SX, SY, PX, PY, DW, DH, MX, MY, X0, Y0, AMP
4.双击ImageWin对象,并在MouseMove事件和Mouse_down事件中输入下面程序,用于窗口图形的拖动滚动处理。
Private Sub ImageWin_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If (Button And vbLeftButton) > 0 Then 注释:拖动鼠标滚动图像
MX = HScroll1.Value + (X - X0)
MY = VScroll1.Value + (Y - Y0)
If MX > 0 And MX < HScroll1.Max Then HScroll1.Value = MX
If MY > 0 And MY < VScroll1.Max Then VScroll1.Value = MY
End If
End Sub
Private Sub ImageWin_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
X0 = X: Y0 = Y 注释:拖动鼠标初值
End Sub
5.在ZoomIn控件和ZoomOut的Click事件中输入下列程序,对窗口图像进行放大、缩小处理。

Private Sub ZoonIn_Click()
If AMP < 5 Then AMP = 2 * AMP 注释:放大系数小于5,则放大图像
AppImage.ImageWin.PaintPicture ImageWin.Image, 0, 0, AMP * DX, AMP * DY, PX, PY, SX, SY
End Sub
Private Sub ZoomOut_Click()
AppImage.ImageWin.Cls 注释:清除窗口图像
If AMP > 0.25 Then AMP = AMP / 2 注释:放大系数大于0.25,则缩小图像
AppImage.ImageWin.PaintPicture ImageWin.Image, 0, 0, AMP * DX, AMP * DY, PX, PY, SX, SY
End Sub
7.在HScroll控件和VScroll控件的Change事件中输入下面程序,对窗口图像进行滚动处理。

Private Sub HScroll1_Change()
PX = HScroll1.Value * DW / HScroll1.Max 注释:计算水平滚动位置
AppImage.ImageWin.PaintPicture ImageWin.Image, 0, 0, AMP * DX, AMP * DY, PX, PY, SX, SY
End Sub
Private Sub VScroll1_Change()
PY = VScroll1.Value * DH / VScroll1.Max 注释:计算垂直滚动位置
AppImage.ImageWin.PaintPicture ImageWin.Image, 0, 0, AMP * DX, AMP * DY, PX,PY, SX, SY
End Sub
8.在ExitButton控件的Click事件中输入下面程序,用于结束程序、关闭窗口。
Private Sub ExitButton_Click()
End
End Sub

五、应用说明
窗口图像滚动是各种数据查询系统、多媒体图形数据库系统开发中的基本功能之一,本文用Windows API函数实现了窗口图像缩放、滚动,该方法可适用于Visual C++等语言。本文全部程序均在WIN98环境中Visual Basic 5.0下调试通过。
强制和防止窗口重画 -VB资料 巧用“关于”对话框-VB资料 请问在VB中如何关闭别的应用程序窗口 确定屏幕分辨率-VB资料 让VB5支持动画光标 让窗口拒绝接受键盘和鼠标事件 -VB资料 让窗体处于最前面 -VB资料 让窗体居中 -VB资料 让所有的控件都动起来 -VB资料 让最大化和最小化按钮消失-VB资料 任意多边形的窗口-VB资料 如 何将「拒 绝 被 盖 住 的 窗 口 」还 原-VB资料 VB如何创建椭圆形的窗体? VB如何创建无Icon的窗体? VB如何防止Edit框中的Password不被非法获取 VB如何将鼠标显示成动画鼠标? VB如何利用程序拉下 ComboBox? VB如何让窗体右上角的X失效? VB如何使Form的背景图随Form大小改变 VB如何使Text文本框的属性只读? VB如何使窗体右上角的&quot;X&quot;无效? VB如何使窗体最小化并消失 VB如何在VB和Delphi中快速实现立体化窗口显示 VB如何在VB中实现绘图区的大十字光标 VB如何在VB中制作不回显的文本框 VB如何制作浮动式窗口 闪烁的Label-VB资料 设定StatusBar的文字成不同的颜色-VB资料 设计一个可中断循环的按钮-VB资料 设置“执行无用户界面”-VB资料 生成一个透明窗体 -VB资料 GGJJ们谁有电子版《windows核心编程》的完整的第27章啊?偶的那一版这章只有半截 请教一个写入文本的问题,解决200分相送,在线等 如何做到高人一筹 有没有人能具体讲一讲关于大文本处理的过程! 函数返回值问题,给高分 DX抓图,如何保存为Bmp文件? 3个NF 嵌入文件夹窗格怎么使用 创业中的软件公司招人(有兴趣的弟兄进来看看) 数据库中事务的特点及其应用,急,不够再给分500,在线,急。 关于对话框.高分请教 创业中的软件公司招人(有兴趣的弟兄进来看看) 做的网站在IE5.0和IE6.0显示的问题 寻找采用WebSnap 技术的例子? matrxII观后感 关于JSP文件和BEAN的存放 创业中的软件公司招人(有兴趣的弟兄进来看看) c#做的程序可以直接在新安装的win98下(没有.net环境)跑吗?有经验的请留步 c#做的程序可以直接在新安装的win98下(没有.net环境)跑吗?有经验的请留步 存储过程分页有点问题,谁帮我看一下 基础问题!困扰我! 请哥哥姐姐帮忙,把下面的代码转换成VC代码 大家case工具都用到什么程度? 为什么编译的可执行文件在其他计算机无法运行? ACCESS操作问题,高手... 我是刚刚入门,请帮助 怎样把一个已建好的主域服务器更改域名(在线等) 如何得到DataGrid控件里面的某行某列得值? 关于rave报表的问题 weblogic部属程序问题! 组合查询的问题 怎样在改变一个下拉菜单,不刷新页面的情况下,改变另一个菜单的内容??? 有使用BCG库的朋友吗?有些问题不明白,想讨论一下。 sqlmangr.exe文件受到了损坏,应该怎么做恢复[急] 请问,广东的高程报名在什么时候?谢谢! lwangzi(磊子)请关注 win2000下读注册表的怪问题??? 在线等待,急急急 菜鸟百问之一 在VS.NET中无法调试ASP.NET应用程序 从一个表select等好久也没有东西返回,别的表正常,这是为什么呀 大哥大姐: 请问BC与DELPHI有什么区别 ? 问个小问题,权当散分 怎么把终端服务的3389端口号改为自己需要的端口? 怎么样使用实体bean来修改数据库中的记录? 高手请进!!急 如何知道打开子窗体的父窗体是谁 关于XML转换的问题!!请高手进!! *.xfm是什么文件?? 打包难题 help me 来这里问一下, DELPHI与C++ BUILDER 有什么区别 ? 北京时尚-- 海淀vs朝阳 (转) 请问:如何显示通过get来传递过来的带“+”的变量?(显示“+”会丢失) 马晨明的藏戏 庆阳能源怎样才能促进当地居民增收 I like all the subjects,_e_____ English.这里除了可以填especially,能不能填except 或者说表达类似意思I like all the subjects,_e_____ English.这里除了可以填especially,能不能填except 或者except for,或者说表达类似意 求马晨明的藏戏的原文.不是课本上的那个. y=cosx-根号3sinx 判断奇偶性 信息发送模式是什么意思? whose is it hat?可以这样写吗?为什么不能这么写,请举例说明,怎样选择满意回答。 已知点A(2-x,5-x)在第三象限,求x的取值范围 传递信息的息是什么意思 whose hat is it?可不可以写成whose is it hat?如果不能为什么?请举例说明,具体些, 如图,矩形OABC中,O是原点,OA=8,AB=6,则对角线AC,BO的交点H坐标为 小灵通发信息时出现信心发送失败13什么意思 什么明星稀成语 已知点A(x-2,5-x)在第三象限,求x的取值范围 知函数f(x)=x2+x/a(x不等于0,a属于R) (1) 判断f(x)的奇偶性(2)若a小于或等于16,判断函数F(x)在[2,正无穷 成语大全 四字成语什么明星稀 点A(x-1,2-x)在第三象限,x的取值范围是( ) 这句话语法错有什么.如何改正啊?professionals require developing cultural intelligence in order to understand characteristics of different culture and resolve misunderstandings. 成语:( )尘莫及 ( )明星稀 重力加速度是多少? 求三个数最大值,哪里错了#includeint main(){int max(int a,int b,int c);int a,b,c,m;scanf("%d%d%d%",&a,&b,&c);m=max(a,b,c);printf("%d",m);} 下列关于矢量和标量的说法正确的是 工厂对某设备进行检修后,工作效率比原计划提高了4%,因此比原计划提前5天完成了任务,问原计划几天完成任 Stripes 2.a measure of success achieved at the sprawling two-story plant,where both the Stars and Stripes and the Rising Sun fly in front of the factory's glistening white exterior 明星稀的前一个词是什么 成语 我们祖国中国最炎热的地方是哪? c++问题,三个数中求最大值三个数中求最大值,为什么我这里无法通过编译,#includeusing namespace std;int main(){int a,b,c,d;//d为最大数据cin>>a>>b>>c;d=max(a,b,c);cout 关于矢量和标量,下列论述中正确的是?(注明解题原因)选项:A.有方向的物理量一定是矢量B.矢量一定具有方向C.只有大小而没有方向的物理量一定是标量D.标量一定只有大小而没有方向 若A【x-1,2-x】在第2象限,求x取值范围 fastening stripes什么意思 知了怎么捕捉食物 打字员用一天时间打完一份稿件,已知上午完成了五分之三,下午比上午少打12000字,这份稿件一共有多少字? 第五个英标是什么? 为什么孔子认为《韶》乐尽善尽美?《武》乐尽美而不够尽善? 若A点(2+a,a-1)在第四象限,求a的取值范围. horizontal "knock on 甘肃庆阳市以后会有地震吗?汶川地震后会不会对庆阳造成隐患啊. Do not use internal horizontal or vertical 爱情是不是想象中的那样完美?爱我 的 人我 不爱 ,我 爱的 人不 爱我 1爱,从何而来! 判断函数的积偶性:y=根号(1-cosX) +根号(cosX-1) 来领分吧 你门都回答的很好我只能采一个啊 根据谜面写成语赤橙绿蓝紫武大郎请客加起来是五句 Knock on wood. 点(a,3-a),在第二象限,求a的取值范围. 125成语什么意思 俊秀唱过knock on wood吗我也很奇怪觉得没有啊,可是在搜索标签里碰到过不只一次~~ 所以就来问问亲们~~ 计划用10小时打一份稿件,实际只用了8小时.工效提高了( Android开发中Intent的具体用法? 尽善未必尽美的答案是什么 打一文稿计划用10小时完成由于工效提高四分之一实际用()小时打完稿件 android 应用开发中的 Activity ,Intent, 小学人教课标版12册语文课本第1课两小儿辩日中的:两小儿笑曰:“孰为汝多知乎.”其中的“为”字的读音应是“维”还是“喂”.要有原因 9题有语法错吗,有的话请纠正 平行四边形有几条对角线? 人教语文六年级上册15课选做题 关于时钟的名言 平行四边形两条对角线的平方和=? 有没有人教版? 有偏旁相同的字组成的词 OM为角平分线,求证OA/OB=AM/BM 有了闲林水库这只“碗” 杭州饮水防洪安徽宁国网友募捐遭民政局叫停:我们压药店奶粉自动售卖机故障 消费者抱怨无穿“新制服”配IC卡 每一杯西湖龙井上海自贸区揭牌满月巡礼 开启新一轮改美智库报告称朝鲜为发射大型导弹扩建卫杨洁篪会见伊朗伊斯兰议会议长拉里贾尼6名少女统一着装离家出走 称无人理解滨江一学校体育馆“一馆两用” 学生市媒体称上海自贸区资本项目开放或实行“13岁儿子黑网吧内打游戏 母亲连找四安徽病重孕妇遭多家医院拒收 为省钱只美数千民众参加枕头大战 欲破吉尼斯世加油站职员遭抢劫 胸前手机挡子弹救其有研究称所有哺乳动物遵循21秒排尿定埃及武打冠军因支持前总统穆尔西 金牌世上真有“摇钱树”:桉树能测地下黄金美国安局铁杆盟友临阵“倒戈” 称反对外媒称俄罗斯在G20峰会监控各国元首埃及再次审理穆兄会领导人美国百年交响名团将首次访华白云区16个政府官微通通“无法回复评公务员被举报吃3年空饷 单位:已责令法院已判决胜诉 祖屋依然没收回房企再融资放缓,华丽家族自减2亿募资为啥外国歌手称霸福布斯榜?90后小两口半年两度卖儿百年老茶遇上4岁茶人 茶文化逆袭商业广东连锁50强数字背后的故事这将是压倒萨科齐的最后一根稻草23个镇区已购买法律服务小吃店占道经营股指稳步上涨,题材股行情爆发新品尝鲜“吃货福利”年中大促7月,来深圳吃海鲜!有一种扑救叫霍华德世界上最先进的马戏舞台长什么样?2014年早报·聚冠夏令营本周六正式语文课清甜多汁没有渣的翠玉梨你吃过吗?美海军终于有了四星女上将
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘