|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果需要重新编写代码,几乎任何一门计算机语言都可以跨平台了,还用得着Java嘛,而且像PHP/C#等语言不需要修改代码都可以跨Windows/Linux。treeview 在微软的.NET的Forms窗口控件中,好比Treeview和ListView,仅仅是对通用控件的复杂封装,因而他们不一般的激发Paint事务。微软所公布内容中,能看到的独一倡议就是设置控件的ControlStyles.UserPaint范例,然后本人为控件做一切的画图操纵。(译注:老外供应了一个TreeViewWithPaint控件类,派生自TreeView类,供应了Paint事务的挂接。)
1、为懂得决这个成绩,我们在类外部利用了一个基于Bitmap类的Graphics工具。当任何窗口从头界说巨细时分,工具城市重修。
//Recreateinternalgraphicsobject
protectedoverridevoidOnResize(System.EventArgse)
{
if(internalBitmap==null||internalBitmap.Width!=Width||internalBitmap.Height!=Height)
{
if(Width!=0&&Height!=0)
{
DisposeInternal();
internalBitmap=newBitmap(Width,Height);
internalGraphics=Graphics.FromImage(internalBitmap);
}
}
}
2、重写窗口历程
当控件收到了WM_PAINT动静时分,将实行上面的三个步骤:
1.经由过程一个外部的WM_PRINTCLIENT动静,让本来的控件历程把图像画到外部的Graphics工具上。
//DrawInternalGraphics
IntPtrhdc=internalGraphics.GetHdc();
MessageprintClientMessage=Message.Create(Handle,WM_PRINTCLIENT,hdc,IntPtr.Zero);
DefWndProc(refprintClientMessage);
internalGraphics.ReleaseHdc(hdc);
2.利用外部的Graphics工具创建PaintEventArgs参数,激发用户的OnPaint()函数。
//AddthemissingOnPaint()call
OnPaint(newPaintEventArgs(internalGraphics,Rectangle.FromLTRB(
updateRect.left,
updateRect.top,
updateRect.right,
updateRect.bottom)));
3.把外部Graphics工具的位图拷贝到屏幕的Graphics设备上。
//DrawScreenGraphics
screenGraphics.DrawImage(internalBitmap,0,0);
WM_ERASEBKGND动静被过滤失落,甚么都不做。caseWM_ERASEBKGND:
//removesflicker
return;
3、所供应的代码和测试程序能利用Paint事务在TreeNode在被选中的时分,在其边框上画个黄色的边框。可是,实在关于我实践要用的项目来讲,必要增加背景图的功效没有完成。而这里离我们的目标另有一步之远,我们对前文画图历程2和3之间加一个步骤:
Bitmaptemp=newBitmap(internalBitmap,internalBitmap.Size);//创建一个一时的位图temp,保留后面绘好的界面
temp.MakeTransparent(Color.White);//设置红色为通明色
internalGraphics.FillRectangle(Brushes.White,0,0,this.Bounds.Width,this.Bounds.Height);
//在本来的外部位图工具上,用红色重画背景
if(image!=null)//假如设置了背景图,就在外部工具上画背景
internalGraphics.DrawImage(image,0,0,image.Width,image.Height);
internalGraphics.DrawImage(temp,0,0,temp.Width,temp.Height);//把后面绘好的界面按红色为通明色复合到外部位图上
screenGraphics.DrawImage(internalBitmap,0,0);//把分解的一时位图刷到屏幕上
实在,这里还存在一个成绩:在处置WM_PAINT动静时分,一般的做法是利用BeginPaint和Endpaint函数来操纵DC绘图的,当树结点睁开大概折叠时分,我们收到WM_PAINT动静,并由动静失掉的革新地区大概说革新矩形。关头就是在于,这里的革新地区不是全部客户区,背景图会呈现堆叠的部分而变形。
办理办法:思索利用GetDC和ReleaseDC操纵,能够避开革新地区的限定,我们能够把全部客户区重画,而完成背景图的完全性。这里要十分注重的是:BeginPaint和Endpaint函数会主动把必要革新的地区设为无效,而GetDC和ReleaseDC函数不会,以是我们要本人增添两个操纵GetUpdateRect和ValidateRect,也就是本人把必要革新的地区设置为无效。不然:会一直的失掉WM_PAINT动静,和逝世轮回一样,CPU占用到达100%。
图一测试程序
4、停止语
因为利用了Win32的API函数,因而附加了一个Win32外部类,导进了本人必要的函数。计算机发展到这个时候,很多技术日益成熟,想学好一种技术都是不容易的,当你学会用的时候你对它的很多原理可能很不了解) |
|