如何使 ListView 的背景图片固定?

kailler2002 2005-08-25 08:01:20
首先,C#里的 ListView 本身并不提供背景图片的设置。所以我这里用 Win32API 来实现,代码如下:

public void SetBGImage( ListView lst, Bitmap image ) {
int LVBKIF_SOURCE_HBITMAP = 1;
int LVM_SETBKIMAGEA = 0x1000 + 68;

LVBKIMAGE apiItem = new LVBKIMAGE();
apiItem.hbm = (int) image.GetHbitmap();
apiItem.ulFlags = LVBKIF_SOURCE_HBITMAP;
Win32API.SendMessage(lst.Handle, LVM_SETBKIMAGEA, 0, ref apiItem);
}

[StructLayout(LayoutKind.Sequential)]
public struct LVBKIMAGE{
public int ulFlags;
public int hbm;
public string pszImage;
public int cchImageMax;
public int xOffsetPercent;
public int yOffsetPercent;
}

[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, ref LVBKIMAGE lParam);

//===============================================

这样的话背景图片确实可以显示了,调整ListView的大小,图片的显示位置也正确。但有一个问题,就是当ListView数据很多,出现滚动条的时候,拖拽滚动条,背景图片也跟着动。也就是说背景图片没法固定在 ListView 的某个位置(滚动条的情况)

大家可以观察一下 WinXP 或 Win2003 系统的文件夹窗口,当开启【为特定文件夹显示背景图片】功能时,同样的 ListView,拖动系统文件夹的滚动条,背景图就是固定的。

所以我怀疑系统应该有这样的API或者选项。就好像我上面的例子里,是用 LVBKIMAGE.hbm 属性直接设置一个 Bitmap 的 Handle,再利用 LVBKIF_SOURCE_HBITMAP 属性来直接显示图片。但网上的很多例子,包括 MSDN 的文档里,都没有提到 LVBKIMAGE.hbm 和 LVBKIF_SOURCE_HBITMAP 的作用。

在查看了 CommCtrl.h 里面的定义后,我发现 API 里面还提供了一个属性: LVBKIF_TYPE_WATERMARK = 0x10000000。从名字上看像是水印。难道系统就是用这个固定图片??我试了一下 LVBKIMAGE.ulFlags = LVBKIF_SOURCE_HBITMAP | LVBKIF_TYPE_WATERMARK。结果失败。 -_-

现在想请问各位高手,到底怎样才能使 ListView 的背景图片固定下来? 还有 LVBKIF_TYPE_WATERMARK 到底什么作用?怎么用?我在网上、国内国外,还有MSDN都找遍了也没发现这个属性的说明啊。。难道真的是"隐藏"API? 只有微软自己才知道怎样调用?

【注:】如果是通过自己重绘背景图( WM_ERASEBKIMAGE..), 这种方法就算了
...全文
460 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
aSalt 2006-07-01
  • 打赏
  • 举报
回复
mark
烤火的鱼 2006-07-01
  • 打赏
  • 举报
回复
vs2005支持
Knight94 2006-06-01
  • 打赏
  • 举报
回复
要想设置ListView的背景,首先要考虑ListView的结构,
ListView是有两部分组成的,
一个是底层的容器,一个是显示在上面的Item。
而ListView要进行显示的时候,都是先画底层,然后在上面画Item。
所以要给ListView真正设置背景,你就需要重载ListView,去逐个处理。

参看
http://www.codeproject.com/cs/miscctrl/bk_custlistview.asp
wushu 2006-06-01
  • 打赏
  • 举报
回复
CSDN这个破东西,这点问题都解决不了,我也在着急,亏CSDN论坛上还有一大堆一大堆的MVP呢,真是没用...
julong88 2005-09-13
  • 打赏
  • 举报
回复
mark
kailler2002 2005-08-28
  • 打赏
  • 举报
回复
自己重画背景的话效果不是很好,一滚动就很闪烁。系统自己的ListView的背景不会有这个问题啊。还有一个效率的问题,如果API已经有的,用API肯定比C#要快一些吧。

如果要完全消除闪烁,好像不止背景图,连整个 ListView 都要自己画吧? 似乎要用 ControlStyles.UserPaint
greenery 2005-08-27
  • 打赏
  • 举报
回复
为什么也定要用API来实现呢?也许我们有对应的C#函数吧,不过我不清楚。哈哈。
我觉得还是自己重画背景好,简单些。
kailler2002 2005-08-26
  • 打赏
  • 举报
回复
哎。。顶一下
greenery 2005-08-26
  • 打赏
  • 举报
回复
我在用别人写的一个ListView,可以有背景图。由于是整个ListView重新自己写画出来的,所以他好像在控件的最下面放个Image来实现的。不知道这个方法对你行不行。
kailler2002 2005-08-26
  • 打赏
  • 举报
回复
谢谢大家
其实真的要在 ListView 画背景,也不是什么太难的事,也有很多其他的思路和方法(例如重绘背景或者自己画)
但我很郁闷的就是,为什么很多系统本身已经提供的功能,我们自己还要重新实现一遍!
最好还是通过API来设置和固定背景图。。
Leeshell 2005-08-26
  • 打赏
  • 举报
回复
学习一下~~~~~
cdo 2005-08-26
  • 打赏
  • 举报
回复
帮你up一下.
salmon230 2005-08-26
  • 打赏
  • 举报
回复
学习
kailler2002 2005-08-26
  • 打赏
  • 举报
回复
看来又是没人回答了。。。
zeusvenus 2005-08-25
  • 打赏
  • 举报
回复
看了上面一堆,就想到个局部retangle重绘,结果被楼主最后一句毙掉了.....
Johnnyxy 2005-08-25
  • 打赏
  • 举报
回复
不知道,想了解,帮顶

110,530

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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