listview配合picture做到隔行颜色不同的疑惑

来自外太空的你 2014-08-19 09:03:44


调用代码

Public Sub ListView_HColor(ByRef mListView As ListView, query As Form, lvcount As Long)

query.Picture1.ScaleMode = vbTwips
query.Picture1.BorderStyle = vbBSNone
query.Picture1.AutoRedraw = True
query.Picture1.Font = mListView.Font
iFontHeight = query.Picture1.TextHeight("b") + Screen.TwipsPerPixelY
iBarHeight = (iFontHeight * 1)
query.Picture1.Width = mListView.Width
'======
query.Picture1.Height = iBarHeight * 2
query.Picture1.ScaleMode = vbUser
query.Picture1.ScaleHeight = 2
query.Picture1.ScaleWidth = 1
'draw the actual bars
'query.Picture1.Line (0, 0)-(1, 1), &HC0FFFF, BF 'white bars - modify vbWhite To change bar color
'query.Picture1.Line (0, 1)-(1, 2), 16777152, BF 'light green bars - modify RGB(x,x,x) To change bar color

For i = 1 To lvcount
If i / 2 = Int(i / 2) Then
query.Picture1.Line (0, i - 1)-(1, i), &HC0FFFF, BF
Else
query.Picture1.Line (0, i - 1)-(1, i), 16777152, BF
End If

Next


'======
'put it in the listview control, tiled
mListView.PictureAlignment = lvwTile
mListView.Picture = query.Picture1.Image
End Sub



求解释,谢谢诶
...全文
812 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2014-08-25
  • 打赏
  • 举报
回复
以后提问请务必注明:
不许推测和验证,要直接给答案。
谢谢!
Tiger_Zhao 2014-08-22
  • 打赏
  • 举报
回复
回帖者给出找错的方案。
调试是提问者自己的工作!
你又没给工资,凭什么要别人代你做事?
  • 打赏
  • 举报
回复
引用 15 楼 Tiger_Zhao 的回复:
[quote=引用 10 楼 u010526292 的回复:] [quote=引用 9 楼 Tiger_Zhao 的回复:] 不要看!用数据说话!
你直接看第6行,那行黄色的,那么窄,看的出么,用什么数据说话[/quote] 用画图量一下截图中第1行和第21行之间的坐标差,除20,和iBarHeight是否一致。 11楼给出了正确求行高的方式。[/quote] 请你去调试下在说好么。。。
Tiger_Zhao 2014-08-22
  • 打赏
  • 举报
回复
引用 10 楼 u010526292 的回复:
[quote=引用 9 楼 Tiger_Zhao 的回复:] 不要看!用数据说话!
你直接看第6行,那行黄色的,那么窄,看的出么,用什么数据说话[/quote] 用画图量一下截图中第1行和第21行之间的坐标差,除20,和iBarHeight是否一致。 11楼给出了正确求行高的方式。
  • 打赏
  • 举报
回复
引用 17 楼 Tiger_Zhao 的回复:
回帖者给出找错的方案。 调试是提问者自己的工作! 你又没给工资,凭什么要别人代你做事?
第一你并没有给我任何有意义的建议。 第二你也没有找出问题所在。 第三如果可以请你见我发帖,请你忽略! 第四你连现成的代码都不愿调试,你怎么知道问题所在?你怎么知道给别人的是正确的建议? 请你以后考虑清楚在发言谢谢
Carlven2012 2014-08-22
  • 打赏
  • 举报
回复
不好意思,最后那一句改漏了一个ListView1.Picture = .Image ------》 ListView1.Picture = Picture1.Image, 完整的函数如下:

Public Sub SetListViewBgColor(lv As ListView, bgPic As PictureBox)
Dim i As Integer
Dim itmX As ListItem

Me.ScaleMode = vbTwips
bgPic.ScaleMode = vbTwips
With lv
.View = lvwReport
.FullRowSelect = True
.Font.Name = "Tahoma"
.ColumnHeaders.Add , , "This is Just a Simple Example"
.ColumnHeaders(1).Width = 4800
End With


With bgPic
.ScaleMode = vbTwips
.AutoRedraw = True
.BorderStyle = 0
'.Visible = False '这儿设置把PictureBox隐藏
.Font = lv.Font


.Width = lv.Width
Set itmX = lv.ListItems.Add() 'itmX.Text=//////////
.Height = itmX.Height * 2
Set itmX = Nothing
lv.ListItems.Clear

'用pictureBox画两条不一样颜色的长条拼一起,好用作ListView的背景图。
bgPic.Line (0, 0)-(.Width, .Height / 2), vbWhite, BF
bgPic.Line (0, .Height / 2)-(.Width, .Height), RGB(227, 241, 226), BF

lv.PictureAlignment = lvwTile
lv.Picture = .Image
End With
End Sub


Private Sub Form_Load()
SetListViewBgColor ListView1, Picture1
End Sub


效果图如下:
  • 打赏
  • 举报
回复
引用 12 楼 Carlven2012 的回复:
然后没用循环,用的下面这个,画了两条,然后将这两条平铺到ListView1中即可实现隔行色彩。 'Draw the actual bars Picture1.Line (0, 0)-(.Width, .Height / 2), vbWhite, BF Picture1.Line (0, .Height / 2)-(.Width, .Height), RGB(227, 241, 226), BF ListView1.PictureAlignment = lvwTile ListView1.Picture = .Image
没用试过了,关键的问题出现在哪里? 我觉得是 请仔细看我上传的图的第六行,看到那一行的黄色行高很短很短,这就是原因, 而且注意观察,下面每个相同的行数都会出现这一行很短的行,这才是原因 为什么这个会出现呢?
Tiger_Zhao 2014-08-21
  • 打赏
  • 举报
回复
用 ListView 的截图算一下行高是多少?和iBarHeight是否一致?
Carlven2012 2014-08-21
  • 打赏
  • 举报
回复
然后没用循环,用的下面这个,画了两条,然后将这两条平铺到ListView1中即可实现隔行色彩。 'Draw the actual bars Picture1.Line (0, 0)-(.Width, .Height / 2), vbWhite, BF Picture1.Line (0, .Height / 2)-(.Width, .Height), RGB(227, 241, 226), BF ListView1.PictureAlignment = lvwTile ListView1.Picture = .Image
Carlven2012 2014-08-21
  • 打赏
  • 举报
回复
引用 10 楼 u010526292 的回复:
[quote=引用 9 楼 Tiger_Zhao 的回复:] 不要看!用数据说话!
你直接看第6行,那行黄色的,那么窄,看的出么,用什么数据说话 你也可以调用下上面的代码,看看问题到底出在那里[/quote] 我用的是下面这个取得的行高: With Picture1 .Width = ListView1.Width .Height = ListView1.ListItems(1).Height * 2 ‘注意这里,别用你那个TextHeight,取得的行高越往后面越不准确。 End With
  • 打赏
  • 举报
回复
引用 9 楼 Tiger_Zhao 的回复:
不要看!用数据说话!
你直接看第6行,那行黄色的,那么窄,看的出么,用什么数据说话 你也可以调用下上面的代码,看看问题到底出在那里
Tiger_Zhao 2014-08-21
  • 打赏
  • 举报
回复
不要看!用数据说话!
  • 打赏
  • 举报
回复
引用 7 楼 Tiger_Zhao 的回复:
用 ListView 的截图算一下行高是多少?和iBarHeight是否一致?
奇怪的是前面几个格子正常的,你看到后面就不正常了。。。
threenewbee 2014-08-20
  • 打赏
  • 举报
回复
尝试微调iBarHeight = (iFontHeight * 1),找到一个合理的值看看。
Tiger_Zhao 2014-08-20
  • 打赏
  • 举报
回复
A)
query.Picture1.Font = mListView.Font --这里要加 Set,你可以 Debug 比较一下

B)你的 PictureBox 是否设为无边框了。有边框时 Picture1.Height <> Picture1.Image.Height
  • 打赏
  • 举报
回复
引用 4 楼 Tiger_Zhao 的回复:
A)
query.Picture1.Font = mListView.Font --这里要加 Set,你可以 Debug 比较一下
B)你的 PictureBox 是否设为无边框了。有边框时 Picture1.Height <> Picture1.Image.Height
将set填上了, 将边框调成无 没用,问题照样
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
尝试微调iBarHeight = (iFontHeight * 1),找到一个合理的值看看。
没用啊。。奇怪了
  • 打赏
  • 举报
回复
引用 1 楼 Topc008 的回复:
If i / 2 = Int(i / 2) Then 就是隔行
但是你没发现上面图片的行与行的异处吗?,有短有长的
一如既往哈 2014-08-19
  • 打赏
  • 举报
回复
If i / 2 = Int(i / 2) Then 就是隔行

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧