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

显示窗口的水平和垂直滚动条-VB资料

HTML文档下载 WORD文档下载 PDF文档下载
显示窗口的水平和垂直滚动条-VB资料


由于在外读书,上网都是在网吧,所以回答问题,通常都是三言二语,没有说清楚,不过这一篇可是在寝室的电脑上完成的,当然还有上次回答天水的那篇.我学VB的时候,根本没有交流,那种困难不言而喻.现在能与大家一起谈论VB,是我当初所不敢想象的.好了,言归正传,切入今天的话题----显示窗口的水平和垂直滚动条:
在Delphi中,它的TFORM类可以自动显示水平和垂直滚动条,这不能不让我们这些VB Fan们有些嫉妒,为了实现这个功能,我们不得不自已动手了.
首先从窗口谈起,窗口有许多风格,到API浏览器中可以看到许多以WS_或WS_EX_开头的常量,都是用来指定风格的.要实现水平和垂直滚动条就要修改窗口风格,同时还要响应来自滚动条的消息,才能实现其功能.其实我并不认为直接使用窗口自带的滚动条是一个好方法,使用滚动条控件要灵活的多,你可以在窗口中放入任意多的滚动条控件,但窗口自带的就只能有一个.但使用自带滚动条也有其优点,比如其位置不要用额外的代码进行调整,其它好像就没有了.
在使用方面来说,主要的难点在于其消息的响应,尤其对初学者来说,因为要构造一个子类窗口.其他的min,max值的设置,滚动框的位置的设定,都有对应的API函数来实现.
程序实现:
先在窗口上放两个Lable,两个Botton.

'1.窗口风格的设置
'在窗口声明部分加入
Dim HVisible as Boolean,VVisible as Boolean

Private Sub Form_Load()
Dim OldStyle As Long
Dim hsWidth As Integer
'保存旧风格
OldStyle = SetWindowLong(hWnd, GWL_STYLE, 0)
'设置新风格
Call SetWindowLong(hWnd, GWL_STYLE, OldStyle Or WS_VSCROLL Or WS_HSCROLL)
Command1.Caption = "隐藏垂直滚动条"
Command2.Caption = "隐藏水平滚动条"
Label1 = "垂直滚动条的值"
Label2 = "水平滚动条的值"
'得到水平滚动条的宽度
hsWidth = GetSystemMetrics(SM_CXVHSCROLL)
'改变窗口宽度与高度
Width = Width + hsWidth
Height = Height + hsHeight
VVisible = True
HVisible = True
'怎么样,滚动条显示出来了没有?没有?那么是我眼花了?@_@

'2.滚动范围的设置
yMin = 0: yMax = 100
xMin = 0: xMax = 100
SetScrollRange hWnd, SB_HORZ, xMin, xMax, True
SetScrollRange hWnd, SB_VERT, yMin, yMax, True
'建立子类窗口
SubClass Me
End Sub'End Of Form_Load

'3.滚动条的显示与隐藏
Private Sub Command1_Click()
If VVisible Then
Command1.Caption = "显示垂直滚动条"
ShowScrollBar hWnd, SB_VERT, False
VVisible = False
Else
Command1.Caption = "隐藏垂直滚动条"
ShowScrollBar hWnd, SB_VERT, True
VVisible = True
End If
End Sub

'4.子类窗口的撤消
Private Sub Form_Unload(Cancel As Integer)
UnSubClass Me
End Sub

'从1.窗口风格的设置直到此处都可以直接COPY到窗口代码中

'5.消息响应机制
'添加一个公共模块,在模块中加入以下代码和声明
Public Const SM_CXHSCROLL = 21
Public Const GWL_STYLE = (-16)
Public Const WS_HSCROLL = &H100000
Public Const WS_VSCROLL = &H200000
Public Const SB_BOTH = 3
Public Const SB_HORZ = 0
Public Const SB_VERT = 1
'以下以SB_开头的是用户的滚动请求
Public Const SB_LINEDOWN = 1
Public Const SB_LINELEFT = 0
Public Const SB_LINERIGHT = 1
Public Const SB_LINEUP = 0
Public Const SB_PAGERIGHT = 3
Public Const SB_PAGELEFT = 2
Public Const SB_PAGEDOWN = 3
Public Const SB_PAGEUP = 2
Public Const SB_ENDSCROLL = 8
Public Const SB_THUMBPOSITION = 4
Public Const SB_THUMBTRACK = 5
Public Const GWL_WNDPROC = (-4)
Public Const WM_HSCROLL = &H114
Public Const WM_VSCROLL = &H115
Public Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Declare Function ShowScrollBar Lib "user32" (ByVal hWnd As Long, ByVal wBar As Long, ByVal bShow As Long) As Long
Declare Function SetScrollPos Lib "user32" (ByVal hWnd As Long, ByVal nBar As Long, ByVal nPos As Long, ByVal bRedraw As Long) As Long
Declare Function SetScrollRange Lib "user32" (ByVal hWnd As Long, ByVal nBar As Long, ByVal nMinPos As Long, ByVal nMaxPos As Long, ByVal bRedraw As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public preWndProc As Long
Public xMin As Integer, xMax As Integer
Public yMin As Integer, yMax As Integer
Public xPos As Integer, yPos As Integer

Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
On Error Resume Next
Dim xInc As Integer, yInc As Integer
Select Case uMsg
Case WM_VSCROLL'垂直滚动条消息
Select Case LoWord(wParam)
Case SB_LINEUP, SB_LINEDOWN
If LoWord(wParam) Then
yInc = 1
Else
yInc = -1
End If
Case SB_PAGEUP, SB_PAGEDOWN
If LoWord(wParam) = SB_PAGEUP Then
yInc = -10
Else
yInc = 10
End If

Case SB_THUMBTRACK
yInc = HiWord(wParam) - yPos
End Select
yPos = yPos + yInc
If yPos < yMin Then yPos = yMin
If yPos > yMax Then yPos = yMax
SetScrollPos hWnd, SB_VERT, yPos, True
Form1.Label1 = yPos
Case WM_HSCROLL'垂直水平条消息
Select Case LoWord(wParam)
Case SB_LINELEFT, SB_LINERIGHT
If LoWord(wParam) Then
xInc = 1
Else
xInc = -1
End If
Case SB_PAGELEFT, SB_PAGERIGHT
If LoWord(wParam) = SB_PAGELEFT Then
xInc = -10
Else
xInc = 10
End If
Case SB_THUMBTRACK
xInc = HiWord(wParam) - xPos
End Select
xPos = xPos + xInc
If xPos < xMin Then xPos = xMin
If xPos > xMax Then xPos = xMax
SetScrollPos hWnd, SB_HORZ, xPos, True
Form1.Label2 = xPos
End Select
WindowProc = CallWindowProc(preWndProc, hWnd, uMsg, wParam, lParam)
End Function
Public Sub SubClass(frm As Form)
preWndProc = SetWindowLong(frm.hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnSubClass(frm As Form)
Call SetWindowLong(frm.hWnd, GWL_WNDPROC, preWndProc)
End Sub
'The function below is much useful in API development.
Private Function LoWord(num As Long) As Integer
LoWord = num Mod &H10000
End Function
Private Function HiWord(num As Long) As Integer
HiWord = (num And &HFFFF0000) / &H10000
End Function
说明:
此程序调试比较困难,应注意不要用VB工具栏中的"结束"按钮来结束该程序,只能通过窗口上的"关闭"按钮,而且在程序中不能出错,否则VB就当掉了.

云适配CEO陈本峰:8年磨一剑 Splashtop企业应用:SplashApp让办公移动起来 时空旅行+内付费“植物大战僵尸2”下月18日全球同步发行! 中移动推网络电话Jego 后来者能否居上? 防止数据泄露:BYOD下的管理员5大妙招 咕咚副总裁司建铭谈移动时代的“软硬整合” 未来的物联网结点:可穿戴设备 应用开发的4个技巧,让程序能真正为用户使用 Google早期的10个API:它们现在在哪? 为啥微软开发产品总是慢半拍? Visual Studio 2013 Preview新功能预览 “中国手机游戏四月流水榜”出炉 超半数基于Cocos2d-x引擎 为移动而设计之信息架构篇 难逃厄运:Zynga将关闭Draw Something母公司OMGPOP 直接拿来用!最火的iOS开源项目(一) 是时候抛弃Eclipse转向IntelliJ了 Arrow:轻量级的Python时间日期库 编程语言API,你最青睐哪一款? 推动新输入方式发展:英特尔为感知计算设1亿美元基金 AWS到底有多大?目前看来有158000台服务器 C语言实现树的动态查找 第五届中国云计算大会于北京隆重举行 改变企业移动化:新Google地图API支持用户定制 诺基亚旗舰手机EOS真机图曝光 配备“巨型”摄像头 走进豆瓣:豆瓣的技术架构与团队文化分享 加速Web开发的10款HTML5工具 微软式微?AMD、英特尔等开始疏远Windows 语音技术现状:四千万突破语音产业的技术壁垒? 万维网联盟W3C推荐Web性能API 微软郑子颖:Windows Azure如何支持开源系统和软件? EMC 叶成辉:软件定义数据中心实现统一、开放的管理 停止函数执行 请问如何在鼠标点击xx button 的时候获得 JtextField 中的文本输入--有重分送 我不能关机了!救救我哟~~给你分! tomcat4.0.1无法启动的问题 SoS!俺用fireworks做了一套菜单,但是应用于框架结构中时,只显示菜单所在框架的部分菜单。也就是说菜单显示不完整,如何能够让菜单跨越 刚装了REDHAT 7.2,不知道网络怎么设置 报表打印,望各位指点..... 是不是我这里设错了? 菜鸟有问题,Win2k的定时关机程序 关于天数累加的问题 webbrowser控件问题? 421连续进纸标准,打印问题,难啊,难 有个小问题难住偶了! 请教 bdf 文件的格式 在JPrint中如何设置页面的打印范围(不使用打印机的默认打印范围),找不到例子,那位能够给个实例。。。 开发jsp需要什么环境和安装软件,目前版本为多少? 在PASCAL语言中的"集合"概念,如何转化成C语言表示 怎么回事。formshow 不能写太多sql语句么〉?,怎么不显示?大家快帮看看,急死了 自动累加的问题?(100)我只能给这么多了 哪里可以下载powerbuilder7.0 网页自动累加的问题(100) help 求肋!! 有关SUN WORKSTATION OPENBOOT的问题 请问一下vb6和.NET 请问,如何用flash 做一个网页“访问量统计”计数器? 请问在win98繁体下开发的pb源程序,在简体win98下怎样转过来?急,请帮忙! 手提电脑,没有软驱,现有一外置USB软驱,但是找不到光盘驱动, 谁有用vb开发组件的详细文档资料或教程 关闭窗口的问题!! 欢迎有志向的VB程序员加入到我的团队!!! 大家做Web Service的时候,是使用SqlDataAdapter这类控件 ,还是自己写SQL语句访问,还是自己写数据访问中间件(e.g:dll),那个在生产环境 webbrowser问题 hello 请问我的servlet程序应该放在哪里?我使用tomcat 欢迎有志向的VB程序员加入到我的团队!!! 有没有当网管的兄弟啊,交流一下 在IE设置为缺省的情况下,怎么用ActiveX? 急!急!100分问题求解(不够可加)输入中文到oracle数据库乱码的问题 请教一个小问题:通常自己定义的ID在那里定义好?也放在Resource.h里面吗? pascal求问 请问有谁知道哪里有水晶报表的中文教材? 这个问题我很头疼,大家能否帮帮忙? pascal 哪位大虾告诉我哪里可以下载bc3.1的编译器 怎么样在mts object代码中使用计时器?类似TTimer.onTime哪样 请问如何在对话框中,设定单选的默认值? 在PASCAL语言中的"集合"概念,如何转化成C语言表示 探讨数据库设计的最实际的原则!高手新手都请进!! ActiveSkin 的问题,知道的人来捡分啊!:) VB可以写COM? 高分求教:怎样用DX Show将获得压缩卡的压缩流? 一棵树能做多少张A4复印纸 一道物理磁场题,为什么图像f会超过mg? 哺乳动物有多少种? 为什么人都要活得那么累呢,为什么世界不可以多点宽容, 如图,匀强电场方向水平向右,场强E,丝线长L,上端系于O点,下端系质量为m带电量为+q的小球,已知Eq=mg如图,匀强电场方向水平向右,场强E,丝线长L,上端系于O点,下端系质量为m带电量为+q的 进化世界哺乳动物怎么弄? 决定圆心大小是(?) A直径 B圆心 C半径 为何匀速圆周Eq=mg,请说明,我做计算题碰到的 为什么自行车在行驶过程中受到的是静摩擦力?车轮子明明在动啊? 圆心符号问题,不知道是直径还是半径一个圈,然后在上面一根斜线从右往左,这是直径还是半径的意思? 如果绵羊的只数比山羊的只数多20%,那么,山羊的只数比绵羊的只数少百分之几?有没有在详细一点的我看不懂 某农场有绵羊490只,山羊只数是绵羊的7分之4.山羊有多少只?(写出数量关系式,再用方程计算) ()叫做圆心,()叫做半径,()叫做直径,()叫做圆的周长.准确点 山羊比绵羊多12只,多的只数正好占绵羊的25分之4,绵羊有多少只求助啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!帮忙知道的,告诉我解答方式好吗?快快快快 某农场有绵羊490只,山羊只数是绵羊的7分之4.山羊有多少只?(写出数量关系式,再用方程计算) 急 汽车通过拱形桥 圆周运动对于一辆汽车通过拱形桥最高点时,恰好无压力是v=根号gr(半径),老师说当汽车通过最高点恰好对桥面没压力时,是能够安全通过的最大速度,当时经过计算当汽车以根 人怎么才能做到相互理解 相互宽容 世界上共有多少种水生哺乳动物 汽车通过拱形桥作圆周运动,则以一定速度通过最高点时?为什么? 李爷爷养山羊和绵羊共50只,山羊比棉羊多24只,山羊的只数占羊总数的?棉羊的只数占羊总数的? 苹果的三分之二与利的五分之四正好相等,梨25千克,苹果多少千克 如图16所示,汽车过拱形桥时的运动可以看做匀速圆周运动,质量为1吨的汽车以20m/s的速度过桥,桥面的圆弧半径为500m,g取9.8m/s2,则汽车过桥面顶点时对桥面的压力是A.800N B 如何做到,相互信任,相互理解,相互包容. 毕业很久了,帮人做题,发现全忘啦.载人舱在将要着陆之前,由于空气阻力作用有一段匀速下落过程.若空气阻力与速度的平方成正比,比例系数为k,载人舱的质量为m,则此过程中载人舱速度应为? 一张普通的A4纸的重量是多少?我前几天寄了三张A4纸, 是寄往本市的. 我只贴了8角的邮票, 我总是担心超重被退回来.邮局现在很黑, 到不到就超重. 包括信封, 邮票, 和里面的三张A4张, 加起来会 父母之间怎样才能做到相互理解,相互宽容? 利用频闪照相法可以测量物体间的动摩擦因数.在暗室中,有一正方体小物块在倾角为θ的固定斜面上做初速度为零的匀加速直线运动.若在释放小物块的同时打开照相机的快门利用闪光灯将它 一张A4纸有多厚?多重? 可以宽容待人人怎样做到? 一张A4纸面积多少 汽车在凸拱形桥上由A匀速运动到B,以下正确的是(A在B上方)A牵引力做功与克服摩擦力做的功相等B合外力对汽车做功为0C该过程汽车机械能守恒 买2千克苹果5千克梨比买6千克苹果5千克梨少支付12.4元,买1千克苹果多少元 动物之最:最长寿的哺乳动物? 汽车在圆弧拱形桥上由桥顶A匀速运动到B,下列首说法正确的是A 牵引力和摩擦力做工之和为0B 牵引力和重力做工之和等于汽车克服摩擦力做的工C合外力对汽车做工为0D重力做工的功率保持不 一张A4纸加一个信封大约多重?寄一封省内平信 不知道贴几元邮票 就一张A4大小的纸和信封 最长寿的哺乳动物是?如题 F=Eq(匀强电场)这式子怎么来的 两张明信片加一个信封有多重?准备给国外的朋友寄明信片,邮局说一张的邮资是4.5,一封20g以内的信件是6块钱,所以想一个信封装两张明信片.但是不晓得会不会超重.明信片是同学定制的,信封 1.最长寿的哺乳动物是什么?2.最聪明的哺乳动物是什么?3.跑得最快的动物是什么?4.飞得最快的动物是?5.世界上最长的昆虫是什么?6..世界上最小的鱼是什么? 物理w=fd,适用于什么电场中? 一张照片加两张信纸加一个航空信封有多重还有一张邮票 请问哺乳动物中最长寿的动物是谁 什么情况下用F-f=ma,什么情况下用F=ma? 信封一般什么纸 如何测量一张a4纸的体积 物理:为什么E=F/q适用于一切电场,E=kQ/r^2仅适用于真空中点电荷的电场?后者是前者舍去q得到的,为什...物理:为什么E=F/q适用于一切电场,E=kQ/r^2仅适用于真空中点电荷的电场?后者是前者舍去q 信封用什么纸 一张A4的纸怎样叠体积最大用来装水的 你怎样理解''人与人之间相互沟通''的重要性?谈谈自己的看法. 世界上有哪几种哺乳动物 谁知道在陆地上生活的哺乳动物最大的,最小的最低的与最高的各是什么?```急用```~陆地上生活的哺乳动物,那个最大```那个最小```那个最低`那个最高?`````````急用亚`````各位帮帮我``````! 造句:( ),我不一定( ),我( ).所以人与人之间需要相互倾听,相互理解与沟通. 山羊的只数比绵阳的7倍多12只,山羊比绵阳多120只,求山羊和绵羊各多少只 陆地哺乳动物介绍是特征 怎样理解沟通 自行车匀速前进时所受摩擦力是静摩擦力,这是为何? 直径是圆里最长的线段.对不对 女孩与花的私语中“只要用心交流,你也能听到花的细语”这句话的理解 世界上一共有多少种哺乳动物 一包A4纸多少钱?有几张?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘