.NET就是封装的太密了,有时很多时候让我们反而更麻烦,特别是COPY不到的时候,又不懂自已想的话,说土一点就是死路一条,

记得以前经常用一句话,C++支持,可C#他不支持啊!就这样安慰自已

其实做多了就明白了,其实不是C#不支持,而是自已不懂,不会,程序里没有什么是不可能的,只是你没找到方法而已,语言只是外衣,内在是一样的,

就像JAVA配置环境变量一个道理,如果没碰过C#的人去碰下安装环境变量也会一直骂JAVA的开发环境,但有时自已动手安装那么一下,却能学到许多

其实透明的LISTVIEW是很EASY的一件事啦

不过.NET不提供设置背景,或者说没提供平铺拉伸的背景,就是一拉下拉框,图片就也跟着动了,没救了

本来很土的,一动我就刷背景,还是系统画,就算给他加了双缓冲,TNND还是有很明显的迟滞

我想做到这种效果

一句话:不就重画嘛!

当然这个图不好完全放出来,还是一个拙形!哈哈

而经过重画之后的效果就是下面这样喽

嘿嘿!一些同事的信息也给显示出来了,不好意思呀!

下面就开始介绍重画

首先,这控件必须是透明的,而透明的前提是这个控件是自已重画

this.SetStyle(System.Windows.Forms.ControlStyles.UserPaint, true);
this.SetStyle(System.Windows.Forms.ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent;

这几个属性的定义是一清二楚啊!也由此见,一个好的命名对一个程序来说,是多少重要啊!我们使用起来真的挺爽的,一目了然

开始重画喽
protected override void OnPaintBackground(PaintEventArgs pevent)
{
//选让系统自已画背景,其实也是没用的
base.OnPaintBackground(pevent);

if (TopItem == null || ListViewImageList.Images.Count==0)
{
return;
}
//要画几个
int CurIn = this.Height / 18 + 1;
//第一项非空时才画
if (TopItem!=null&& TopItem.Index >= 0)
{
if (CurSelectIndex == -1 || CurSelectIndex < TopItem.Index || CurSelectIndex > (TopItem.Index + this.Height / 20))
{

}
else
{
/当前选择项
int i = CurSelectIndex - TopItem.Index;
就是画那个矩形啦,那个选中的地方,忘记说了,我定高为18个像索
pevent.Graphics.FillRectangle(Brushes.AliceBlue, 0, 18 * i, 300, 18);
}
然后就是一项一项地画下去
for (int i = 0; i < CurIn; i++)
{
if ((TopItem.Index + i) < this.Items.Count)
{
if (this.Items[TopItem.Index + i].ImageIndex < ListViewImageList.Images.Count)
{
pevent.Graphics.DrawImage(ListViewImageList.Images[this.Items[TopItem.Index + i].ImageIndex], 0, i * 18 + 1);

pevent.Graphics.DrawString(this.Items[TopItem.Index + i].Text, this.Font, Brushes.Black, 30, i * 18 + 1);
}
很简单吧!从第一控件下来的第一项开始画,即控件能显示二十项,不管他的数据里有多少项,就只画二十项,效率高吧!连双缓冲都省下来了
}
}
}
}

然后就是下拉啦!下拉里就刷新嘛!可TNND 他提供的事件处理里面没有处理下拉框的消息,因为这不属于树型控件

但我们还是有办法的,下拉在WINDOWS里面的消息是:m.Msg == 0x114 || m.Msg == 0x115

这那里来的有点WIN API经验的人就知道了

在这里面捕抓一下,再用委托送出去,这时候一个好的命名又出现了,不明白的人还以为是.NET提供的,用得乱爽起来了,哈哈

protected override void WndProc(ref Message m)
{
if (m.Msg == 0x114 || m.Msg == 0x115)
{
if (OnScroll != null)
{
OnScroll(this, m.Msg == 0x115);
}
}
}

在鼠标中健的滑动还有下拉移时就重画,很快的,就那二十项而已嘛!
protected override void OnMouseWheel(MouseEventArgs e)
{
base.OnMouseWheel(e);
this.Invalidate();
}

void DouBufferListview_OnScroll(object sender, bool vscroll)
{
this.Invalidate();
}
就剩下点击下选中的效果啦,前面会了后面代码就懒得COPY了,哈哈,还是刷,

其实是很简单的,最主要就是三方面
一:透明背景
二:是在OnPaintBackground里完成,因为userpaint设置TRUE,这个函数是最后一步系统调用的,在这之前画的话,你画得半死,都被盖住了
三:就是捕抓消息,WINPROC这个认识了就行了

这个是绝对原创的,自已也痛苦了几天,几乎放弃,在元旦的时候突然想到ONPAINTGROUND函数,特意加班试出来,免费的哦!嘿嘿!其实一直加班从没拿过加班费,看到别的同学加班都有,好不爽啊!但不爽归不爽,事情还是要做好的

其实大家都年轻,从这时候开始,渐渐明白,没有实现不了的东东,只有你不会做的东东,我只想专注于WINFORM,一切一切慢慢来

只身一人来到这里本来就是对自已的一次赌博,其实好想去完成那本科,

可惜,几个月前没这么想,把那一本院校的录取通知书扔在家里就跑了出来!

年轻就是冲动,但年轻也就是敢于付出!我相信自已

改天再把那一组可爱的按钮放出来,想什么形状就什么形状的哦!很卡哇伊的哦!

透明的LISTVIEW的更多相关文章

  1. Android里透明的ListView

    发现了一个list滚动时,某item背景透明的问题.网上搜索一下,发现有很多人在问list背景黑色的问题,交流中给出的解决方案基本上很统一. 先是解释问题产生的原因是Android对list的滚动做了 ...

  2. 如何禁用ListView中的选中效果

    有的时候,我们希望ListView没有选中效果. 导致选中效果出现可能有两方面的原因: 1.每一行View自身可能有选中效果,可以将它的背景设置为透明 2.ListView有一个listSelecto ...

  3. vb listview 的常用操作

    常用操作:获取当前行数和列数: MsgBox "行数:" & ListView1.ListItems.Count & "列数:" & L ...

  4. Android开发心得(转)

    前言: 很早以前,就听人说过android以后会火起来,作为一个前瞻性对它有所了解会是一个转型的好机会,javaweb太成熟饱和了,现在市面上各种android手机层出不穷,网上各种android视频 ...

  5. 2018-12-1-WPF-修改-ItemContainerStyle-鼠标移动到未选中项效果和选中项背景

    title author date CreateTime categories WPF 修改 ItemContainerStyle 鼠标移动到未选中项效果和选中项背景 lindexi 2018-12- ...

  6. Android—ListView条目背景为图片时,条目间距问题解决

    ListView是android开发中使用最普遍的控件了,可有的listView条目的内容颇为丰富,甚至为了美观,背景用指定图片,如下图:

  7. ReactNative 根据scrollView/listview滑动距离动态修改NavBar颜色

    我们常见某些APP上滑的时候,NavBar颜色会从透明渐变为某种颜色 原理非常简单,根据scrollView的回调动态修改NavBar的透明度即可. 在RN中,尤其是ListView中这个回调不是很好 ...

  8. android ListView 属性

    android:divider="#fffff" 分割线颜色 android:dividerHeight="1px" 分割线高度 divider 分割线-去掉分 ...

  9. Android使用ListView应该注意的地方

    在ListView中设置Selector为null会报空指针? mListView.setSelector(null);//空指针 试试下面这种: mListView.setSelector(new ...

随机推荐

  1. linux 软连接的使用

    软连接是linux中一个常用命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接. 具体用法是:ln -s 源文件 目标文件. 当 我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需 ...

  2. Mbox-React Native

    Mbox-React Native 学习网址:https://www.jianshu.com/p/bbf9837443f3 MboX环境配置: .npm i mobx mobx-react --sav ...

  3. Mac入门--通过homebrew下载过慢问题

    使用国内的镜像替换homebrew镜像,对镜像进行加速源 原先我们执行brew命令安装的时候,跟3个仓库地址有关 1 brew.git 2 homebrew-core.git 3 homebrew-b ...

  4. Nginx配置之rewrite、proxy_pass、upstream、location

    如图,这是Nginx的配置文件nginx.conf中的一段配置代码. 在http段中定义了一个名为webservers的upstream模块,主要用于负载均衡. 在server模块中,定义了一个loc ...

  5. leveldb memtable

    memtable常驻于内存,需要按照key进行排序,通常意义上的话,可以使用二叉查找树来实现,跟进一步可以使用红黑树保证树的平衡,但是leveldb中使用了另外的一种数据结构:跳表Skip List. ...

  6. Python - pycharm 代码自动补全

    有很多人说是代码补全功能未打开,的确,代码补全功能确实要打开才能用,打开方法 file---->power save mode,把这个前面的√号去掉即可

  7. [19/05/05-星期日] JDBC(Java DataBase Connectivity,java数据库连接)_mysql基本知识

    一.概念 (1).是一种开放源代码的关系型数据库管理系统(RDBMS,Relational Database Management System):目前有很多大公司(新浪.京东.阿里)使用: (2). ...

  8. 使用userAgent区分浏览器版本

    使用userAgent区分浏览器版本:https://blog.csdn.net/n447194252/article/details/76255489 JS根据userAgent值来判断浏览器的类型 ...

  9. Java RPC 分布式框架性能大比拼,Dubbo排老几?

    来源:http://985.so/aXe2 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成 ...

  10. ofbiz idea 启动

    1.下载gradle并安装到本地 2.idea引入gradle 3.gradle右键选择refresh,项目会重新编译并加载gradle的task 4.可以再编译一下 5.没问题的话打开,jar ap ...