.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,一切一切慢慢来
只身一人来到这里本来就是对自已的一次赌博,其实好想去完成那本科,
可惜,几个月前没这么想,把那一本院校的录取通知书扔在家里就跑了出来!
年轻就是冲动,但年轻也就是敢于付出!我相信自已
改天再把那一组可爱的按钮放出来,想什么形状就什么形状的哦!很卡哇伊的哦!
转载于:https://www.cnblogs.com/yellowyu/archive/2008/03/12/1102893.html