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

显示窗口的水平和垂直滚动条-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就当掉了.

Appflood SDK:连接中国与海外App流量交互平台 Apache Subversion 1.7.9正式发布! 微软IE浏览器5大动向 加速吸引开发者 开源的简繁转换库OpenCC支持Node.js 继Opera之后,Adobe表示将支持Google Blink 提高大型软件项目质量的一些实用型技术分享 谷歌推出Mirror API,开发者可为Google Glass开发应用 无需999,也不要499,99美元Linux超级计算机带回家 微软反击AWS:推出EC2并大幅降价,“价格战”正酣 Operation InVersion:拯救了LinkedIn的大修项目 五步走战略——Avocado在最初几周内迅速扩大30倍 NoSQL产品测评:Cassandra、MongoDB、Couchbase和Aerospike 谷歌眼镜开箱评测:比想象更精致 Pinterest谈实战经验:如何在两年内实现零到数百亿的月访问 初创公司Instart Logic:专为电子出版商和网站站长解决“痛点” 未来即卖芯片又卖服务!Intel收购软件厂商Mashery 继MSN之后,微软又开始整合Skype与Lync服务 阿里将推AMOS智能机 斥资10亿鼓励开发App AMPLab开发重构的Hadoop版本Tachyon:吞吐量要比HDFS高300多倍 一名理科生的创业路 十大界面原型与布局工具 Google产品经理Kenneth Norton:如何与工程师共事 如何创建自适应系统来增强用户体验 Jolla下月展示首款Sailfish手机 将重点发展中国区 海外1GB大容量游戏,国内渠道如何分发? 真正的能源大户是WiFi网络 数据中心只是“伪军” CloudFlare创始人传奇人生:7岁编程,法学博士,获哈佛商学院最高荣誉 2013云计算深入实践 jQuery 2.0发布 不再支持IE 6/7/8 Google再发力,更新Dart M4! 【多图】鼠标、光驱等13个即将消失的PC技术 奇怪的问题!!!!! 请问什么是contentPane? 用Delphi作网页用IE浏览不行 求助:AfxBeginThread的编译问题! 用C裸写聊天软件,谁能? 菜鸟问题:如何安装和配置ASP.NET开发和运行环境? 快来呀,破解QQ密码,高分相送! 有需要域名和空间的吗?我这里有。 我的服务器CPU占有100%,如何解决?!!加急!!!!!! 请问谁在csdn上订购过书啊?需要多少时间才能拿到啊!!!! 小问题:关于AfxBeginThread的参数调用问题 请教高手:关于在ACCESS中的两个数据库之间复制表结构问题 请问谁在csdn上订购过书啊?需要多少时间才能拿到啊!!!! 问题求解 现实一点,各位,我和别人赌了巴西不能赢中国队净3球以上,大家如何看? datagrid连接adodc access转化为mssql时出现的一些问题??? 工作流运行时出现了问题!很奇怪! 一个注册表的问题? 关于STL的弱问题 很少有人问的问题 请教学习路线,散分 一个困扰我很久的难题?(高手帮忙啊) 告诉帮我解决文件关联问题!! 请问如何添加备注字段,用sql server建表,有一备注字段为text类型。。。。。。。。。。。 函數啊﹐怎么么搞的?氣死人了。一百求救。 关于数据库的问题 生命游戏问题!!!!那位大哥指点迷津 VB做的免费软件,大家随便下载!给我提点建议也行! RichEdit问题,急!!! 关于IF语句。我是新手我理解不了请高手帮我,谢谢 请问oricle 有没有像sql server 2000 的企业管理器一样的工具? 关于richedit的问题! 誰能告訴我﹐我給他發又發(88分求找) asp.net就没有什么不足吗? 问题:高级程序员的《数据结构》该怎么复习?请有经验的人给指个明路,多谢! 如何将中文文件存入数据库?是文件,不是表单,谢谢!! 怎样才能得到CDialogBar的控件(如Button)的消息及消息处理 子数据窗口中为什麽filter条件不起作用?急急!!在线等!!!! 菜鸟来了! 怎么把Demo_Adhoc分到两台机上运行 数据库更新 how to 用 insert into 把一个.zip文件保存进数据库?? 请大家推荐一个CD机吧!!!! 急,NOTES与SQL SERVER的问题 asp实例 我的Access库文件原来大小是6.78M,我清空所有记录和减少很多记录时,为什么大小没改变? 关于delphi动态加载控件,在线 代人提问:请问.dcu文件是干什么的?如何才能生成该类型文件。 怎么响应Enabled属性 asp.net做网页,运行后,<asp;....></asp:...>字段仍然存在?? ABCD是含有同一种元素的不同化合物,焰色反应都呈黄色,A——E相互转化关系如下:(1)B+C→D+H20 (2)B→D+E+H20 (3)C+E→D+H2O (4)A+E→D+O2 (5)A+H20→C+O2则:A为______ B为_______ C为_______D为_______ 谁知道熔化是什么热?吸热还是放热? 离心泵的输送介质改变后对泵的性能如何变化 已知A是一种常见的正盐.A、B、C、D、E均为化合物,且均含有一种相同的元素.Y是常见的气体单质,A既能与盐酸反应产生气体,又能与氢氧化钠反应产生气体.在一定条件下,A能实现如下图所示的转 放热就是变热,吸热就是变冷吗?如果不是请讲明为什么.急,明天就考了,还是弄不太明白.我有点笨,讲明白点.如果我懂了一定还加分! A和B可以相互转化,B在沸水中生成C,在空气中氧化成D,D有臭鸡蛋味.那么ABCD分别是什么? 为什么燕子往南飞 请问一个高压水泵电动机的转速,流量和流速的相关计算公式是什么? A和B可以互相转化,B在沸水中生成C,C在空气中氧化成为D,D有臭鸡蛋味,请问ABCD分别是什么?我要正确答案d是硫化氢那种的,不要鸡蛋系列的那个答案额,能把化学方程式写上么? 两种气态烃组成的混合气体0.1摩尔,完全燃烧得0.15摩尔二氧化碳和3.6克水,A:一定有乙烯B:一定没有乙烯C:一定有甲烷D:一定没有乙烷 已知管内空气的流速,求所用空气泵的功率,其计算公式是什么? 酒店用液相煤气瓶内液态气体的温度是多少?天气寒冷液相煤气瓶出口压力很低?是什么原因? 下列肥料中,可跟草木灰混合施用的是( A (NH4)2SO4B NH4ClC KNO3D Ca(H2PO4)2 什么是液相负荷? 新买的PE液相的压力老是往下降,是怎么回事 偏铝酸根能在强酸强碱溶液中大量存在吗?为什么? 锅炉燃烧火焰以什么颜色为标准 碘与水反应生成的碘化氢加不加上标 偏铝酸根与少量强酸反应的离子方程式 草木灰的水溶液能与哪种化肥混合施用?(选择)A CO(NH2)2B NH4ClC NH4NO3D (NH4)2SO4 高效液相色谱 压力不稳定怎么解决 将某温度下的氯化钠的不饱和溶液恒温蒸发掉一部分水,可变成饱和溶液 这句话是对的还是错的? 除去KNO3固体中混有的少量NaSO4所进行的实验操作依次为___,蒸发___结晶,___蒸发,干燥..... 氢气与气态碘反应生成的碘化氢是气态还是液态? 将偏铝酸根滴入强酸的分步反应式 酸雨对下列设施的腐蚀作用较强的是( ).A.铝制窗框B.木质围栏 岛津液相泵压力不稳定!LC-10AVP 疑难杂症!急……仪器是测奶制品中的三聚氰胺!在用药典方法配制的流动相(柠檬酸+辛烷磺酸钠:乙腈=9:1)时,泵压力上下波动有4MPa,用10%甲醇水做流动相时压 电煤属于哪个煤种? 欲除去氯化钠固体中混有的少量硝酸钾固体,所进行的实验操作依次是( )蒸发 结晶() 欲除去氯化钠溶液中混有的硫酸钠,依次加入的溶液为( ) A由B转化而来,B在沸水中生成C,C在空气中氧化成D,D是有臭鸡蛋味的.请问ABCD各是什么物质? 电煤属于什么煤? 和消石灰.草木灰等碱性物质混合使用,会降低肥效的是:A.碳酸钾 b.硫酸铵 c.尿素 d.磷酸二氢钙 在80克SO2和O2的混合气体中,经分析知经分析得知硫元素的质量分数为40%,求此混合物中氧气所占的质量分数? ABCD四种含CL单质或化合物,A能生成C A能生成D AB能生成 B能生成D D能生成C(DC条件光照),请问ABCD是什么 酸雨对下列物质腐蚀作用最小的是A汉白玉石雕B铜质雕塑C铝合金门窗D水泥制品 二氧化硫中硫元素的质量分数为多少?用S%=S/SO2*100% 这个公式算 单质 氧化物 化合物之间的逻辑关系 为什么含氨根的氮肥不能和熟石灰、草木灰等碱性物质混合啊? 已知NO2和SO2的混合物,N元素的质量分数为28%,则混合气体中硫元素的质量分数为()A 4% B 33% C 40% D 66% 会的 ABCD分别代表一种物质,AB为化合物,CD为单质,D是空气中的重要部分,AB的化学方程式? 凡是含有 按根离子 的氮肥在使用时不能与熟石灰、草木灰等碱性物质混合物,其原因是A.混合后生成不溶性物质,降低肥效B.混合后氮肥要潮解C.混合物会增加土壤酸性D.混合后会放出氨 硝酸铁与碘化氢的反应两者量不同离子方程式怎么写 溶解中的吸热何放热是怎样判断的 A由B转化而来,B在沸水中生成C,C在空气中氧化成D,D有臭鸡蛋的味道,请问:ABCD是什么 铁和碘化氢反应方程式. 燕子几月往南飞,请问是几月呢 A和B可以相互转化,B在沸水中生成C,C在空气中可以氧化成D,D有臭鸡蛋气味、问ABCD各是什么?不要鸡生鸡蛋熟鸡蛋臭鸡蛋.要正经的! 氯气与碘化氢是放热还是吸热 燕子为啥要往南飞虽然悬赏分不多,但希望大家能够参与 每秒燃烧10Kg煤,煤中硫元素质量分数1%,假设全转化为SO2,计算每天产生的SO2物质的量是多少? 碘化氢和氯气的化学反应模型 为什么燕子往南飞 A和B可以互相转化,B在沸水可以生成C,C在空气中可以氧化成D,D有臭鸡蛋味道?请问ABCD各为什么物质?我查了有臭鸡蛋味道的通常指的是H2S, 为什么弱电解质如醋酸的物质的量浓度(C)等于c(醋酸根)和c(醋酸分子)的和而不包含c(氢离子)?/ 除去NaNO3固体中混有的少量KNO3固体,所进行的实验操作依次为:溶解,蒸发,结晶,过滤.(这道题的答案我看不懂) 既然都已经析出晶体了,还过滤什么东西?那杂质是哪一步去掉的? 一般哪里有炼铁炼钢用的喷吹煤 离心泵水泵进水管充满度、流速;出水管充满度、流速一般取多少?离心泵流量6m3/h,扬程36m. 建筑物中的哪些金属受酸雨的破坏较小?为什么? 好吧! A和B 可以互相转换,B在沸水中生成C,C与空气反应生成D D有臭鸡蛋气味,问 ABCD分别是什么? 液压传动中管径突然变小,流速与压力如何变化
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘