小妖女 发表于 2015-1-16 22:42:57

ASP.NET网页设计对C#中的TreeView增加背景图

如果需要重新编写代码,几乎任何一门计算机语言都可以跨平台了,还用得着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外部类,导进了本人必要的函数。计算机发展到这个时候,很多技术日益成熟,想学好一种技术都是不容易的,当你学会用的时候你对它的很多原理可能很不了解)

金色的骷髅 发表于 2015-1-19 21:35:17

在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。

莫相离 发表于 2015-1-25 11:50:24

目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.

灵魂腐蚀 发表于 2015-2-2 21:57:25

同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。

精灵巫婆 发表于 2015-2-8 08:18:24

代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。

简单生活 发表于 2015-2-25 02:32:27

ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。

活着的死人 发表于 2015-3-7 15:58:58

业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。

小魔女 发表于 2015-3-15 09:21:44

大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。

因胸联盟 发表于 2015-3-21 23:18:24

可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
页: [1]
查看完整版本: ASP.NET网页设计对C#中的TreeView增加背景图