【jehnjehn原创文章,欢迎转载,但请保留原文链接】本文CSDN地址:http://blog.csdn.net/jehnjehn/article/details/7521529
首先,这标题夸张了些。但我可以向毛主席保证夸张不是目的,我只是有目的地夸张:为了证明C#(.NET平台)其实有多么的强大,为了证明C# WinForm仿QQ界面其实没有多么多么难,更为了证明选择.NET平台并为之奋斗的兄弟姐们其实是多么明智(^_^)。
各位注意了,现在正式开工:
国内桌面应用程序中,界面做到极致的我个人觉得当属迅雷7,各种炫,各种酷,还各种流畅。然后第二位的就是马化腾的企鹅界面了。不知道是马化腾抄袭了迅雷还是迅雷抄袭了QQ界面,反正结果是:QQ界面比迅雷7稍微卡点,稍微逊点。但QQ的界面依然很好很强大,像什么(250+110)公司的什么卫士啦,又或者XX音乐盒之类的,应该都是抄袭自QQ的界面了。但抄袭绝对不是坏事,反而我觉得这个可以有,而且本文旨在干这么一件事情。
兄弟姐妹们,我想说在.NET平台,用C#美化WinForm窗体界面,其实也可以轻松如愿地做到。网上有人总结出3种解决方案:
第一种方式:鉴于OnPaint方法只能绘客户区。故我们直接把FormBorderStyle设为none 然后自己去画,如果需要圆角可以设置窗口的Region。该方式简单易学,网上美化窗口也常见的是这种方式。典型代表是Along的高仿QQ界面,但个人感觉他的实现方式有很多地方值得改进,如:
① 对VS设计器的支持不友好;
② 还有Dock或Anchor后界面一片混乱不堪;
③ 系统的显示属性外观 效果里面把“拖动时显示窗口内容”前面的对勾去掉的话,移动这个窗口,始终显示的是一个1px的虚框,丑。
第二种方式:使窗口全部变成客户区,这样就可以在OnPaint方法里进行重绘。代码很简单:
/// <summary>
/// 重写消息处理机制,使窗口全部变成客户区
/// </summary>
/// <param name="m">消息</param>
protected override void WndProc(ref System.Windows.Forms.Message m)
{
//0x83:在需要计算窗口客户区的大小和位置时发送。通过处理这个消息,应用程序可以在窗口大小或位置改变时控制客户区的内容
//0x85:窗体客户区以外的重绘消息,一般是由系统负责处理
//0x86:画窗体被激活或者没有被激活时的样子//http://blog.csdn.net/commandos/archive/2007/11/27/1904558.aspx
if (m.Msg == 0x0083) // || m.Msg == 0x0086 m.Msg == 0x0085|| //WM_NCPAINTWM_NCACTIVE WM_NCCALCSIZE
{
return;
}
base.WndProc(ref m);
}
重点是不处理WM_NCCALCSIZE消息,这样窗口的全部区域就是客户区域。您就可以在OnPaint事件里想怎么画就怎么画了。该方式简单,也满足了绝大部分的需求,但是窗口的移动 及 可调整大小 需要自己另写代码来处理。
第三种方式:重写WndProc方法,在里面处理相应的消息,去重绘边框和标题栏。该方式需要有一定的功力并细致处理。感觉有一位叫starts2000的前辈(我猜的)很擅长处理这个:http://www.csharpwin.com/articleredirect.aspx?ChID=2&IL=1,可是他要收费的,更可是:
这位大哥也不知道是真忙还是装清高,我发去几封Email,直接不鸟我,伤不起啊!没有办法,大家都是.NET程序员,何况我还是80末的程序员,在.NET平台就算是打酱油也好歹3年。故而毫不艰难地决定:
第四种方式:那就是由前面三种(主要是第三种)灵活组合。啥也不多说了,我愿意用“有图有真相”来证明C#的足够强大!(换肤图片和配置xml文件及结构直接用了starts2000的,在此感谢,虽然他不理我)
什么?你说为什么C#可以如此强大?很简单,其实只是因为它直接越过肩膀站在了巨人的头顶上!你说你仍然不懂?好吧,请将鼠标移动并定位到浏览器右上角的叉叉上,然后食指猛地双击,绝对就展示出你的灵敏的反应速度了。
最后,必须严正确定本文的主旨:其实我很优秀,虽然你以前可能都没有发现或者察觉!另外:
① 如果您喜欢并希望的软件产品也有这么炫酷的界面,本人(416358318@qq.com)表示愿意有偿(没办法,程序员很廉价,也要吃饭)效劳。
② 或者要是哪家企业愿意给个Offer,那更好更给力了。
③ 看本文的反响和关注度,我再决定是否提供下载。
④ 感谢您的阅读,晚安!