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

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下调试通过。
诺基亚将发布Treasure Tag配件 让你再也不怕丢东西 从三大互联网巨头布局,看移动时代的商业逻辑 亚马逊应用商店:一个开发者走向世界的机会? 企业级App探索:开发者们的正途在哪里? 如何有效地在海外市场推广产品? 网站转化率统计分析及优化方案 从资深设计师那我们能学到什么? 原作者使用Go开发memcached替代版,现已扎寨谷歌多个项目 像证券一样交易云资源,Zimory一年内收入翻两番并获德国证交所青睐 移动SDK崛起:未来会不会整合成一大坨? 关于 VS2010 异常捕获 在线编程教育平台Treehouse推免费iPad应用 微软发布Windows 8.1企业预览版 功能更强劲 如何管理和优化日益增长的代码复杂度? SDCC 2013大会讲师名单议题更新 8月1日前3.8折优惠截止 IBM Rational首席技术官:DevOps是一门哲学 Mozilla联手黑莓推进Web安全技术,推出开源测试平台Minion 苹果如何培养SOHO一族高效工作 再造Ruby:CryENGINE 3.5游戏引擎特性详解 Eclipse基金会涉足物联网,M2M标准是否已获东风? SDN部署前必须考虑的7个事项 【云先锋 40】初创公司DataStax:专注于Cassandra,三年融资8370万美元 内容创作工具的革新:Facebook前CTO推文字处理应用Quip 微软为Android手机推出Office 仅面向Office 365用户开放使用 编程、创业、开源感悟——SDCC 2013讲师云风专访 原生广告:移动推广的热门新宠 隐私之战:金山手机毒霸宣布开放安全检测平台 世界人民的头上有张监控大网——Xkeyscore 美国“监控门”情报收集系统 X-Keyscore 技术揭秘 为啥REST如此重要? 并非PHP Frameworks而是WordPress让PHP更加流行! 还是关于一个session的问题(希望大家都进来看看,讨论讨论) C#在WIN2003上操作Oracle9i错误! 一个据说没办法解决的问题!有兴趣的请进 编写一个非PNP的Driver,是否要检测设备是否存在?如果要检测,应该如何?开发工具:vc+DDK 想学DirectX编程,有没有好书和资料推荐一下 江湖救急,在线等 一个小问题! 一个ComboBox问题! 招聘美工及网页制作 用BDE的程序怎样在没有delphi的机器上运行? 有关datagrid的字段显示顺序问题 我的U盘有问题,想请教下大家;) 怎么转换MP3文件的比特率? 如何屏蔽最小化,最大化,以及关闭按钮 招聘美工及网页制作 C语言和汇编语言联合编译的问题 创建视图时,遇到一个表关联的问题:请教各位兄弟姐妹 请教如何让DBGird的最后一行的结果为上面全部对应记录的和? 求助子段合并的查询语句 Struts Struts 请问没人解答的问题如何处理? 结帖还是删除? 请教 数据库中的表与自由表的转换? 求助,在IE中无法打开word文件!!!急!!!! 高手帮我!!! 在WINDOWS的标准TREEVIEW中点右键如何得到点击的坐标? 如何把oracle中的数据结构导入access中去? 请问odbc方式和OLEDB方式有什么区别? 100询问:修改boot.ini仍无法实现双重启动. websphere的问题(1)? 我是第一次使用域.为什么无法在域控制器里增加用户?help me! 求助:模板的连接问题 strust 请问:哪里有人民邮电出版社的《个体软件工程》下载 ?(有分送) 存储过程执行出错,请帮忙看看!急! 请问:在sybase中的设备大小的设定,有没有一个标准?? include问题,屡试屡败 请问怎么才能用最简单的方法把程序做成服务? 程序设计文档怎么写啊?求教 不好意思,一个简单的问题 websphere的问题(2)? 请问如何实现模式窗口,就是当打开子窗口主窗口不能操作,除非关闭子窗口,如果有这样的网页也行 关于清华出版社出版的“微软.NET程序设计系列”之《ADO.NET程序设计》的问题,大家来讨论一下 如何用程序实现光驱的弹入弹出? 在线等了,各位帮忙了!! 我运行了一个网络管理软件出现乱码?而别的程序都没有乱码? 对话框上面显示视图,怎么办? 一道四级题有一点不明白的地方,谢谢各位高手帮我解决一下困惑。。 websphere的问题? 在一个对话框CDialog类中访问窗体视图类CFormView中的函数发生错误? 有关简繁体转换的问题 用错了基因重组我的雷伊100级固执 被我用错了能恢复吗 一个平行四边形被两条直线分成四个三角形 甲的面积是36平方厘米,乙是60平方厘米,丙是24平方厘米,丁是 如图,甲的 面积是18平方厘米,乙的面积是36平方厘米,丙的面积是 54平方厘米,那么丁的面积是 多少// 怎么写帮教材料证明 这些题怎么写呢?帮我个忙吧!拜托大家了! 珍惜生命的宣传语两条.急需~~~~~~~两条 急需 怎么介绍自己的母校 用比喻句介绍母校快! 介绍母校的作文介绍母校的马上要交了是石梅小学的 开头好一点 作文我做完了,作文不要了,为什么江南四大才子被称为“江南”四大才子?而不叫全国四大才子。是因为他们出生在江南 即将离开母校了,请满怀深情地将你的母校介绍给别人吧!我的母校是_________,是_____,是_________. 化学产物是黄色沉淀一般是什么物质? 新消法:回避\"知假买假\" \"假习近平鼓励企业加强研发不断创新西湖剪影(图)习近平“现身”中南大学 大学生欢呼雀孙杨因无证驾驶被处罚款2000元并行温州被砍男童收到爱心款超35万 家人叙政府称:日内瓦会议旨在让总统下台则16秒26 温州17岁高二女生单手玩斯诺登谴责美英情报机构为“最恶劣的侵韩总统朴槿惠对朝言论引猜测 称可与金宁波轨道交通:逃票将纳入个人信用信息山东车祸追因:半挂为超车强变线,逆向外地老人成都逛超市突发不适 6员工紧台化停厂犹如开启潘多拉魔盒 台媒:将台“立法院”电话遭诈骗利用 “立委”招牌遭蛋洗 华航举报抗议者违反“社维澎湖博弈公投倒数 赌?不赌?两派上街河北加强湿地保护 建设生态环境支撑区中国 拉美商事法律合作研讨会在唐山成首届中国 拉丁美洲沙滩足球锦标赛14中外专家:古村落热需冷思考 保护真实成立城管监督局能扭转城管负面形象吗机战皇剑道通天英雄联盟异界召唤一世巨枭冰神天下宅玛娜远东之虎美女神鉴铁流之奉系军阀茅山掌门重生记唯一军火商阿斯哈图石林旅游黄岗梁旅游热水温泉旅游小七孔风景区旅游基督教东山堂旅游东山少爷公园旅游青龙峡旅游峰林峡旅游红石峡旅游起义门旅游南昌起义纪念馆旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘