在C#中如何重绘listview和toolbar的外观

要实现ListView的各行各列重绘是一件很麻烦的事情,最近就确定要实现一个功能需求,在一个ListView各行的第二列(Details模式)加入一个小图标。之前已经领教过ListView的设置,要开启重绘ListView各行,就必须重载它的OnDrawSubItem,但是ListView默认是不会执行你重载的OnDrawSubItem事件的,除非你把它OwnerDraw设置为true,即打开由用户控制绘图模式。然而让人抓狂的是,OwnerDraw=true后,整个ListView的Item/SubItem/Column全部都会空掉,即使你同时重载OnDrawSubItem/OnDrawItem/OnDrawColumnHeader并执行里面的base.OnDrawXXXXX(e),也不给你画出来。
网站上寻找了若干资料,还请教了猫猫,基本拿到的案例都是老老实实完整重绘各行;还有一个比较特别的案例,是使用发送消息方式给ListView发送LVM_SETITEM消息,让SubItem显示图标和文字,然而奇怪的是,案例提供的编译好的EXE可以实现这个功能,但通过源代码编译后却图标出不来,又经过一番资料搜索后,才知道.Net 1.x下可以实现,反而.Net 2.x下无法实现该效果(....M$是白痴么?)最终不得不放弃这个方案。
其实我只需要在ListView各行原内容的基础上添加东西而已,用不着正行重绘那么劳师动众啊,于是还是硬着头皮回去看重载事件,忽然发现了重载的事件OnDrawSubItem/OnDrawItem/OnDrawColumnHeader的参数中,都有e.DrawDefault这个东东,而且默认是e.DrawDef

如果您要在C#创建自绘的ListView控件,可以使用以下步骤: 1. 创建一个新的Windows窗体应用程序项目。 2. 在工具箱找到ListView控件并将其拖放到窗体上。 3. 在窗体的代码文件添加以下命名空间: ```csharp using System.Runtime.InteropServices; ``` 4. 在窗体的代码文件添加以下常量和结构体: ```csharp private const int LVM_FIRST = 0x1000; private const int LVM_SETBKCOLOR = LVM_FIRST + 1; private const int LVM_SETTEXTBKCOLOR = LVM_FIRST + 38; private const int LVM_SETTEXTCOLOR = LVM_FIRST + 36; [StructLayout(LayoutKind.Sequential)] public struct LVITEM { public int mask; public int iItem; public int iSubItem; public int state; public int stateMask; public IntPtr pszText; public int cchTextMax; public int iImage; public IntPtr lParam; public int iIndent; public int iGroupId; public int cColumns; public IntPtr puColumns; } [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); ``` 5. 在窗体的代码文件添加以下方法: ```csharp private void SetListViewProperties() { // 设置背景颜色 SendMessage(listView1.Handle, LVM_SETBKCOLOR, 0, SystemColors.Window.ToArgb()); // 设置文本背景颜色 SendMessage(listView1.Handle, LVM_SETTEXTBKCOLOR, 0, SystemColors.Window.ToArgb()); // 设置文本颜色 SendMessage(listView1.Handle, LVM_SETTEXTCOLOR, 0, SystemColors.ControlText.ToArgb()); } private void DrawListViewItem(DrawListViewItemEventArgs e) { // 自定义项的绘制方式 // ... } ``` 6. 在窗体的代码文件添加以下事件处理程序: ```csharp private void Form1_Load(object sender, EventArgs e) { SetListViewProperties(); } private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) { DrawListViewItem(e); } ``` 7. 在DrawListViewItem方法实现您自己的绘制逻辑。在这个方法,您可以使用GDI+绘制ListView控件的项。 以上就是创建自绘的ListView控件的基本步骤。请注意,您需要在DrawListViewItem方法实现自定义的绘制逻辑以达到您想要的外观效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值