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

VB用API函数改进ListView控件的显示效果

HTML文档下载 WORD文档下载 PDF文档下载
VB用API函数改进ListView控件的显示效果
作者:王建兵
一 、ListView 使 用 简 介
---- ListView 控 件 是VB 开 发 者 非 常 喜 爱 的 控 件 之 一。 作 为Windows95 公 共 控 件 组(COMCTL32.OCX) 的 成 员, 它 经 常 与 经 常 与TreeView、ImageList 等 控 件 联 合 使 用。 即 用 TreeView 显 示 一 个 的树 型 结 构, 而 用 ListView 显 示 选 中 的 节 点(Node) 对 象 的 记 录
集。

---- 这 是 笔 者 在 开 发 财 务 软 件 项 目 中 的<< 凭 证 管 理>> 模 块的 一 个 用 户 界 面。 屏 幕 左 边 是 一 个TreeView 控 件, 用 来 显 示会 计 凭 证 的 类 别; 右 边 是 一 个istView, 用 来 显 示 对 应 类 别的 凭 证 目 录; 上 方 是 一 个 菜 单 条 控 件(MenuBar) 和 一 个 工 具条 控 件(ToolBar); 下 方 是 一 个 状 态 栏 控 件(StatusBar), 用 来 显示 凭 证 数 个 当 前 日 期。

---- 大 家 可 以 看 到 图 中 所 示 的 界 面 非 常 类 似 于Window95/98 的资 源 浏 览 器, Windows 的 界 面 风 格 做 为 一 种 标 准 已 为 广 大 用户 所 接 受。 而Windows 操 作 系 统 的 主 要 的 优 点 就 是 为 所 有 的应 用 程 序 提 供 了 公 用 的 界 面。 知 道 如 何 使 用 基 于Windows 的应 用 程 序 的 用 户, 很 容 易 学 会 使 用 其 他 应 用 程 序。

---- 这 种 使 用Windows95 公 共 控 件 组 合 的 方 法 能 够 达 到 与Windows 界 面 的 一 致 性, 所 以 在 目 前VB5.0 应 用 程 序 的 开 发 中经 常 使 用。

二、 填 充 大 量 结 果 集 所 遇 到 的 问 题
---- 在 实 际 应 用 开 发 中, 经 常 用ListView 填 充 一 个 数 据 库 结果 集(Recordset) 的 内 容。 即 先 写 一 段SQL 查 询 语 句, 产 生 一 个结 果 集, 然 后 将 结 果 集 的 每 一 条 记 录 用DO...LOOP 循 环 语 句中 填 到ListView 中。

---- 但 是 当 结 果 集 很 大 时( 例 如 有5000 条 以 上 的 记 录) , 填充 所 需 要 的 时 间 会 很 长。 用 户 不 得 不 等 很 长 时 间 完 成 一个 查 询。 所 以 在 查 询 的 过 程 中 必 须 允 许 用 户 按Escape 键 退出。 具 体 做 法 是 在DO...LOOP 循 环 体 中 加 一 条DoEvents 函 数, 并写 一 段 中 断 退 出 程 序 代 码。

---- DoEvents 函 数 的 功 能 是: 转 让 控 制 权, 以 便 让 操 作 系 统处 理 其 它 的 事 件。 这 样 在 长 时 间 的 查 询 过 程 中, 如 果 用 户按 了Escape 键, 将 退 出 循 环 体, 结 束 查 询 过 程。

---- 但 是 这 样 又 会 引 发 另 外 一 个 问 题: 由 于DoEvents 可 以 让操 作 系 统 响 应 别 的 事 件, 循 环 体 中 填 充 每 一 条ListView 项 目(ListItem) 的 过 程 也 会 显 示 出 来, 所 以 在 填 充 的 过 程 中 屏 幕会 不 停 的 闪 动, 这 种 现 象 当 然 不 能 被 用 户 所 接 受。 如 何 解决 这 个 问 题 呢 ?

三、 解 决 方 案
---- 用Windows API 函 数 可 以 解 决 这 个 问 题。 首 先 对 几 个 用 到的API 函 数 做 一 解 释 和 说 明。

---- 1. GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT)As Long

---- 此 函 数 的 功 能 是 获 得 一 个 指 定 对 象 窗 口(Window) 的 矩 型框 区 域(rectangle)。

---- Hwnd 为 指 定 对 象 或 窗 体 的 句 柄。LpRect 为 返 回 矩 型 框 的结 构( 必 须 定 义 为 结 构 类 型 的 变 量) 。

---- 2. ValidateRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT)As Long

---- 此 函 数 的 功 能 是 使 指 定 的 矩 型 区 域 生 效。 这 样 会 通 知Windows 不 必 对 指 定 的 区 域 进 行 重 画(Redraw)。

---- 3. InvalidateRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT,ByVal bErase As Long) As Long

---- 此 函 数 的 功 能 是 使 指 定 的 矩 型 区 域 无 效。 这 样 会 通 知Windows 要 对 指 定 的 区 域 进 行 重 画。

---- 具 体 实 现 的 步 骤 如 下:

---- 1. 在 填 充 结 果 集 之 前 先 用GetClientRect 函 数 获 得ListView的 显 示 区 域。

---- 2. 在 增 加 完 一 个 显 示 项 目(ListItem) 后 用ValidateRect 函 数置 这 一 区 域 为 有 效。 这 样Windows 就 不 会 显 示 每 一 条ListItem,屏 幕 闪 动 的 现 象 就 会 消 失。

---- 3. 在 填 充 结 果 集 之 后, 用InvalidateRect 函 数 置 这 一 区 域为 无 效。 这 样Windows 就 会 重 画ListView 的 内 容, 结 果 集 被 完 整的 显 示 出 来。

---- 下 面 是 笔 者 在 项 目 开 发 中 的 一 个 程 序 实 例。 程 序 名 为FillListView。 该 程 序 将 填 写 一 个Access 数 据 库(FISCAL.MDB) 的 凭证 表(Table) 的 内 容 到ListView 中。

---- 首 先 进 入VB5.0, 新 建 一 个 窗 体(Form), 名 为Form1。

---- 然 后 在Form 中 增 加 下 列 控 件。


控 件 名 Name

ListView Lvw

Imagelist imlList

Command Button。 Command1


---- 将ImageList 控 件 中 充 填 一 个 名 为“item” 的 图 象 后 与ListView 控 件 关 联。

---- 在<< 工 程>> 菜 单 命 令 条 中 进 入“ 引 用” 对 话 框, 选 择“Microsoft DAO Object Library”

---- 在Form 的 通 用 模 块(Modle) 中 定 义 以 下 变 量。


Private Type RECT ' 用 来 定 义 一 个 区 域 的 坐 标。

Left As Long

Top As Long

Right As Long

Bottom As Long

End Type

'- - - - - -

' Windows API 函 数 的 声 明。

Private Declare Function InvalidateRect Lib "user32"

(ByVal hwnd As Long, lpRect As RECT, ByVal bErase As Long) As Long

Private Declare Function ValidateRect Lib "user32"

(ByVal hwnd As Long, lpRect As RECT) As Long

Private Declare Function GetClientRect Lib "user32"

(ByVal hwnd As Long, lpRect As RECT) As Long



Dim mbSearchCancel As Boolean

' 用 来 定 义 查 询 中 断 的 标 志。

' True 表 示 中 止 查 询;False 表 示 正 在 查 询。


---- 将 该Form 的KeyPreview 属 性 设 为True, 以 控 制 窗 体 接 收 键 盘事 件。

---- 然 后 在Form 的KeyPress 事 件 中 写 下 列 代 码:


If KeyAscii = vbKeyEscape Then

mbSearchCancel = True

' 当 用 户 按Escape 键 时, 置mbSearchCancel 变 量 为True。

End If

' 表 示 结 束 查 询。

在Command Button 的 Click 事 件 中 调 用 填 充 子 程 序:CallFillListView。



子 程 序 的 代 码 为:

Private Sub FillListView()

'

Dim itmX As ListItem ' 定 义 一 个ListView 的 显 示 项 目。

Dim sSQL As String ' 查 询 字 串 变 量 。

'

Dim rc As RECT ' ListView 的 显 示 区 域。

Dim wrkJet As Workspace ' 数 据 库 工 作 空 间。

Dim dbFISCAL As Database ' 数 据 库 对 象。

Dim RS As Recordset ' 数 据 结 果 集。



On Error GoTo ErrFillListView



Screen.MousePointer = vbHourglass

lvw.ListItems.Clear: ' 清 除ListView 的 内 容。

'- - - - - - - -

' 定 义ListView 的 列 头 的 名 称。

With lvw.ColumnHeaders

.Add , , " 凭 证 编 号", 800

.Add , , " 凭 证 日 期", 1000

.Add , , " 凭 证 字 号", 1000

.Add , , " 凭 证 类 别", 800

.Add , , " 首 行 摘 要", 1440

.Add , , " 借 方 金 额 合 计", 1000, lvwColumnRight

End With



'- - - - - - -

' 产 生 查 询 语 句。

sSQL = "select voucher_id,voucher_number,voucher_date,
voucher_type_shortname,"

sSQL=sSQL&"voucher_type_name,voucher_memo,voucher_amount from VOUCHER"

sSQL = sSQL & "order by voucher_number"

' '- - - - - - -

' 打 开 一 个 数 据 库 结 果 集。

Set wrkJet = CreateWorkspace("NewJetWorkspace", "admin", "",
dbUseJet)

Set dbFISCAL = wrkJet.OpenDatabase("FISCAL.mdb")

Set RS=. dbFISCAL .Open sSQL,dbOpenForwardOnly

'- - - - - - - -

' 获 得listview 的 显 示 区 域。

Call GetClientRect(lvw.hwnd, rc)



Do While Not RS.EOF()

DoEvents

If mbSearchCancel Then

' 中 断 退 出

RS.Close: Set RS = Nothing ' 关 闭、 清 除 结 果 集。

mbSearchCancel = False

Screen.MousePointer = vbDefault

'- - - - - -

' 刷 新ListView 的 内 容, 显 示 已 经 查 出 的 记 录 数。

Call InvalidateRect(lvw.hwnd, rc, True)

Exit Sub

End If

'- - - - - - -

' 增 加 一 个 显 示 项 目ListItem。

With lvw.ListItems

Set itmX = .Add(, , "" & RS!voucher_number, "item", "item")

' 凭 证 编 号

itmX.SubItems(1) = Format$("" & RS!voucher_date, "yyyy/mm/dd")

' 凭 证 日 期

itmX.SubItems(2) = "" & RS!voucher_type_shortname & "-" —

' 凭 证 字 号

& "" & RS!voucher_number



itmX.SubItems(3)="" & RS!voucher_type_name

' 凭 证 类 别

itmX.SubItems(4)=""&RS!voucher_memo

' 首 行 摘 要

itmX.SubItems(5)= Format$("" & RS!voucher_amount, "#,###.00")

' 借 方 合 计 金 额

itmX.Tag = "" & RS!voucher_id

End With

'- - - - - -

' 避 免 显 示 区 域 的 闪 动 现 象。

Call ValidateRect(lvw.hwnd, rc)

RS.MoveNext

Loop



'- - - -

'- 刷 新ListView 的 内 容。 显 示 所 有 查 出 的 记 录 数。

Call InvalidateRect(lvw.hwnd, rc, True)

'- - - - -

' 关 闭、 清 除 结 果 集。

RS.Close: Set RS = Nothing

creen.MousePointer = vbDefault

Exit Sub

ErrFillListView:

Screen.MousePointer = vbDefault

MsgBox Err & ":" & Error, vbInformation, Me.Caption

Exit Sub

End Sub

---- 编 写 完 毕 后 按F5 执 行 该 程 序, 用 鼠 标 点 击CommandButton,将 开 始 查 询 并 填 写 凭 证 的 内 容 到ListView 中 去。

---- 关 于ListView 本 文 只 是 描 述 了 它 如 何 填 充 大 量 结 果 集 的方 法, 它 还 有 很 多 特 性(property) 和 方 法(method), 利 用 它 们 可以 达 到 更 完 美 的 显 示 效 果, 有 兴 趣 的 读 者 可 以 进 一 步 研究。 不 管 是 开 发 什 么 样 的 应 用 程 序, 只 有 坚 持 面 向 用 户、方 便 用 户 的 原 则, 这 样 的 软 件 才 具 有 强 大 的 生 命 力。

---- “ 用Visual Studio 开 发 分 布 式Web 应 用” 系 列 文 章( 之 十),读 者 有 何 意 见 或 建 议, 请 发E-mail 至:ms_visualstudio@hotmail.com。 谢 谢 !---- 编 者
VB怎样改变双击鼠标的时间间隔? VB怎样关闭一个正在运行的程序 VB怎样限制鼠标移动 ANI文件格式 -VB资料 AVI文件格式-VB资料 DBF文件转为MDB文件的方法 -VB资料 FLIC动画文件的播放程序设计-VB资料 MS Office 开发工具VBA TextBox 中英文输入方法切换-VB资料 TXT文件的读取-VB资料 VB 如何将dbgrid印出来 VB5.0调用Office97技巧 VB5如何把帮助文件加到设计的程序内? VB编程步步高-打印篇(二) VB编程的好帮手资源文件 VB的OPEN对话框控件图示功能扩充 VB通用数据表格输出程序的设计 VB网格中输入数据 VB应用程序中打印条形码的两种方法 VB与Windows资源管理器互拷文件 VB中DOS文件名与长文件名的转换 VB中的Unicode 和 Ansi 格式 VB中如何实现文本查找功能 VB中自制文件搜索器 Windows 初始化文件的修改 -VB资料 Word 97与WPS97的完美结合 -VB资料 比较两个文件-VB资料 采用递归算法删除带有多级子目录的目录-VB资料 菜单项的动态装入 -VB资料 处理加了密码的MDB文件-VB资料 VB创建临时文件 来新问题了,找代码错误。 数据量特大,如何保证其查询的性能?急!! 如何在OpenGL贴上图片材质? 怎样在ie中内嵌rm 或 media player 播放器 大家在编写JSP时,是在什么软件里编写的? 紧急求教:order by 有关日期时间类型。 数据库冲突问题 请教ComboBox的使用问题 请问怎么定义一个全局的变量,工程中所有的.cpp文件都可以访问? 一个人可以同时爱两个人吗? 怎么自动启动postgres数据库服务? 谁有已破解的IOCOMP的Instrumentation Pack Pro组件包,For C++builder 6.最好是3.0版 修改表里面的内容的命令。 一个数据查询的算法优化问题求助? 我想考中程,但手上只有高程教材资料,看看有用吗???? 调用SQL存储后有参数返回,应该怎么赋值? url中要传送一个变量的值,如何获取,急急!! 两个调试问题: *.inc是什么文件 WCHAR 转成 CString ?? 局域网中DELPHI通过myoledb如何联接其他机器中的mysql?在线等待!! 一个数据查询的算法优化问题求助? ****为什么没人为我解答呀???? 怎样将一幅不是很大的bmp图片放进数据库中 如何使datagrid不出现新增行? 一个数据查询的算法优化问题求助? 刚看了一部影片!很受感动!散分!!!!!!!!!!!!! 化简逻辑函数的方法(一定给分) 控件的隐藏?? 要保存用户留言的日期和时间,在Access2000数据库中用什么数据类型好呢,那insert into又怎么写呢?now()函数得出的值中有空格和冒号,会 为此问题郁闷了好久,望高手们指点!小生在此谢谢了! 请各位大哥教我 求购VB中发传真的控件(在线等) 请问什么是正则表达式?哪位给介绍一下 select控件的隐藏属性?? 显示控件 关于Drag and Drop的问题(请教各位高手) 关于cloudscape与数据库应用程序? 50分! 存储过程的错误处理? 请问正在上海工作的朋友,上海有哪些感觉比较好的软件公司??????????????? 调用SQL存储后有参数返回,应该怎么赋值? 水晶报表连接的问题,1.做了个*.rpt文件路径为d:\xfdk\*.mdb 2.程序中调用时是在app.path\*.mdb 3.为什么在用户用户哪里还要找设计用到 关于窗体退出的问题 ASP中如何获取当前本身的文件的文件名??急!! Solaris与Windows平台下DB2代码页转换问题 关于cloudscape与数据库应用程序? 50分! 关于线程 播放电影死机 下面的东西哪下载? 在ADO中如何插入一条记录? 稀硫酸与氢氧化钡反应中和热等于-57.3kJ/mol吗我资料上说因为生成硫酸钡会使中和热偏大于57.3kJ/mol(此处不含负号),而我试卷上说就等于57.3kJ/mol,到底哪个正确? 向有KHCO3溶液中加入少量Ba(OH)2溶液,则发生的离子方程式是这是与量有关的吗 盛夏的中午,太阳发着光,树上的蝉儿鸣叫着,小草立在路边 按要求写词语,每类三个.与看有关的:与说有关的:描写时间短的: HCl与KHCO3溶液的离子方程式 英语翻译要传达出一种炎热难耐的意境 先打雷还是先闪电?我看好像是先闪电在打雷,但是我们的科学老师要叫我们调查,我先来问问大家. KHSO4 + CH3COOH 反应的离子方程式 什么鱼吃昆虫,还有什么鱼吃水中的小鱼?什么鱼可以用路亚钓?在江里有什么鱼可以用路亚钓? 地暖管冻了怎么办 仙境传说卡片都有那些套卡?比如黑暗之王 迷幻之王卡 就是一套的还有什么卡 组合到一起 加别的属性的? 什么是营养体?高二生物~不要一大段文字~简单说一下就好,谢谢~! 到目前为止一共发生过多少次大冰期 求证回归分析中,残差的和等于零,以及求残差的方差没办法把公式打上来,就是求证 Ei的和为零,以及残差的方差为什么的那个公式,要具体过程, 新西兰奥克兰的邮编 2/2 Delamare Court Mairangi Bay North Shore Auckland ,New Zealand麻烦尽快 为什么先闪电后打雷 按要求写词语(至少写三个)形容气势大的:()()()形容心情高兴的:()()()形容天气炎热的:()()() 月亮是从东南西北哪个方向升起 怎么判断河流是否以下切侵蚀作用为主 或是否以沉积作用为主 按要求写词语.至少三个哦!形容气势大的()()()形容心情好的()()()形容天气热的()()() KHCO3在水中电离的方程式怎么写? 管理层声明书涉及哪些事项?有什么意义? 按要求写词语(每项至少写三个) 谁知道下面那个符号是怎么打出来的这个符号是怎么打出来的. 据研究发现,地球在历史上至少出现过5次主要的冰期.第一次大冰期发生在24亿到21亿年前,被称为? 按要求写词语写三个哟 今晚上的日食是不是兰州是最佳观测点?但是兰州今天一直阴天,怎么办 地球大冰期是什么? 我想知道一些关于汉字的知识 暖气里的水流动能结冰吗?今年没在家里 暖气里面还有水 暖气有个泵 插上电 暖气里面水流动 这样结不了冰吧? 据研究发现,地球上历史上至少出现5次主要的冰期.第一次大冰期被称为 关于汉字的知识谁知道?不要太长! 屋子冷,在暖气水中加入什么可以降低水的结冰点 地球上为什么会 出现冰期,今后还会有吗 天上出现了几块黄色的云.改为比喻句 夸张句!这地方可真吵,小明他爸爸长得好壮,会场真静,草地上的花真多, 塔里木盆池,河流出现断流现象的主要出现在什么季节,且原因 零下200度环境下,什么材质的不锈钢管可以使用304应该是可以的,磷含量和碳含量应该都是要控制的吧.就是不放心,所以想多了解下大家的意见. 求夸张句. 塔里木河下游断流的决定性因素是什么 纯水机不出水了,求助怎样去垢?谢谢 答谢中书书作者描绘怎样的世界,作者的心境是什么? 为什么塔里木河下游断流了30多年? 请把桂花很香.改为夸张句 有一句话不知是什么语言,拜托大神帮忙翻译La rosa que no florece是要翻译成中文的,感谢! 新疆季节性河流是哪个季节断流?为什么?最好是新疆当地有经验的人或是有经验的探险者来回答,最好仔细点,最好列举几条有说服力的河流来证明,那夏天有没有可能冻结呢?你指的只是南疆,这 校园里的桂花可真香啊!改夸张句 英语翻译hotels and motels are among the few places outside pure entertainment enterprise where people go solely to have fun 帮我分析下这句的话 有哪些成分 翻译句子的话 怎么翻好呢 有时候翻译起来感觉很吃力 . 按要求写词语 这桂花实在太香了改为夸张句 英语翻译 我发现了为什么先闪电后打雷 求BA(OH)2加入过量KHCO3的反应方程式及离子方程式 倾斜65度的阳光阅读答案 阳光穿过云层,越过前面大楼的楼顶,闯进了我们的办公室.天终于放晴了,连续阴雨下了十来天,拧一把,每个人的心都能拧出一盆水来.他急匆匆走到我身边,向我请假,回 按要求写词desk的近义词 FeSO4和Ba(OH)2反应生成什么?是Fe(OH)2还是Fe(OH)3?还有反应现象, 妈妈的手紧紧地抱着生病的孩子.缩写句子 中和热的数值是57.3KJ/mol.下列反应物混合产生的热量等于57.3KJ的是A、1mol/L的稀HCl溶液与1mol/L的稀NaOH溶液B、1mol/L的稀H2SO4溶液与1mol/L的稀Ba(OH)2溶液C、1L1mol/L的稀HCl溶液与2L1mol/L的稀NaOH溶液D、1 请问镇流器和环形灯管必须配套吗? 鱼儿再美丶抵不过---- 怎么接,和这句对称誓言再美丶抵不过流言似水 漓江入选全球最美15条河流 成中国唯借“欧锦赛”代理境外赌球网站 浙江一美国脱口秀主持人就“杀光中国人”言论俄媒:法国和荷兰部长将用带语音编码手日本厂家用世界最薄面料 制作出仅8克中方回应澳政府对华为禁令:希望提供公中方对国际原子能机构与伊朗积极互动表俄圣彼得堡将遭强飓风袭击 涅瓦河水位穆兄会领导人将首次在埃及受审 原定于俄媒:法国荷兰政府部长将使用带语音编外交部:中澳应共同努力为彼此企业正常西班牙遭美监控消息被指未引发国内强烈白宫:美国政府或会对美情报机构工作进日本一公司办公室内种160多盆大麻草澳大利亚新政府称将继续禁止华为参与网俄北高加索发生枪战 1名军官和1名武俄北高加索发生枪战 1名军官和1名武格鲁吉亚现总统发表卸职演讲 感谢民众格鲁吉亚现总统发表卸职演讲 感谢民众教授:转基因技术从根本上灭绝人类 是邢台多名农民工遭不明身份人殴打 警方贵州专项治理“圈而不探、占而不采”中非合作助力实现“绿色非洲”愿景安徽某地民兵13年保护放学学生 20中组部与农业部、民政部联合举办乡镇村机场二线高架上撞隔离栏 司机掉落车外金正恩视察机械厂 要求工厂“白手起家中国三艘052D驱逐舰加速舾装 其中第六届北京国际光电展:窥见一斑的激光古代皇帝选妃裸检秘闻美媒:IMF报告显示中国在亚洲影响力土耳其一煤矿发生爆炸并起火 已致15台媒关注台海军陆战队是否裁撤:已无用安溪20多人因纠纷聚酒吧门口 货车撞民进党台北市长初选民调 结果中午出炉中国驻越南大使馆提醒中方人员做好安全俄罗斯利用太空项目反击美国我驻越南使馆提醒当地中资机构和人员注德85岁老妇停车场连撞11车 造成8【纵横谈】判决“每年回家一次”具有标驻越南大使馆提醒在越中资机构和人员注联合国难民署就意大利非法移民船失事表
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘