C#美化winform窗口代码和思路,非调用win api

2012年1月17日 发表评论 阅读评论

在C#里面美化窗口,似乎有点难度,在网上搜了几种方式,都不完美。经过我的努力,我做出了第三种方式的解决方案。

在我探索的过程中,我希望使用纯C#实现,而非调用API

我希望能通过OnPaint方法直接重绘整个窗口,而目前OnPaint方法只能绘客户区。

我希望通过改变操作系统的显示设置里 窗口边框的大小不影响我的程序。

我希望能像offince2007那样,有些按钮一部分在标题栏上,一部分在客户区(当然,只是视觉上看上去像)

我希望不用FormBorderStyle设置为None的方式实现,就像第一种解决方案一样,我讨厌这样。

下面是我的一些总结。

第一种方式:

    直接把FormBorderStyle设置为none 然后自己去画,如果需要圆角可以设置窗口的Region。

    该方式简单易学 ,网上美化窗口也常见的是这种方式。

    但是如果xp系统的显示属性 外观 效果里面把“拖动时显示窗口内容”前面的对勾去掉的话,移动这个窗口,始终显示的是一个1像素宽的虚框,而不像其它可调整大小的窗口有那么宽的框。比如你拖动qq或飞信的窗口。

第二种方式:

    重写WndProc方法,在里面处理相应的消息,去重绘边框和标题栏。

    该方式需要有一定的功力

    如果使用该方法,花费的精力大,代码量大,我在国外论坛上下载过相应的源码,看起来相当头痛

第三种方式:

    使窗口全部变成客户区,这样就可以在OnPaint方法里进行重绘。

    代码很简单。

   看代码:

     protected override void WndProc(ref System.Windows.Forms.Message m)
        {

            if (m.Msg == 0×0085 || m.Msg == 0×0086|| m.Msg == 0×0083)//WM_NCPAINT WM_NCACTIVE WM_NCCALCSIZE
            {
                return;
            }
            base.WndProc(ref m);
        }

重点是不处理WM_NCCALCSIZE消息,这样窗口的全部区域就是客户区域。您就可以在OnPaint事件里想怎么画就怎么画了。

   该方式简单,也满足了我绝大部分的希望。

   但是窗口的移动 及 可调整大小需要自己另写代码来处理。


转载请注明来自:[MSN Spaces]http://msn.shandian.biz/14.html

  1. 本文目前尚无任何评论.