zoukankan      html  css  js  c++  java
  • c#控件编写 (3)重绘From的非工作区

         重绘窗体的工作区的时候我们可以用到OnPaint来实现。而非工作区的绘制有几种思路

        1.直接实现WM_NCCALCSIZE消息绘制

        2.把窗体修改成None状态并拦截WM_NCCALCSIZE修改非工作区的大小实现

        3.把窗体修改成None直接做一个模拟的状态 

         这三种方法都会有一些弱点,这些弱点也许是我没有找到对应的解决方法 。

       1.在实现后需要修改 base.ControlBox = false,要不然在鼠标经过的时候会出现如下图的效果

    image

    其实我们是要的下面的这种效果

    image

       但是这样做的后果是无法使用任务栏的菜单 ,如果有谁知道这个怎么解决的话留个言,在此谢过了 

      2.第二种实现的话在最大化最小化的时候,不知道是什么原因会产生窗体自动缩小在WM_NCCALCSIZE定义的标题栏的大小,这个也有一个折中的解决方法,就是重写SetBoundsCore然后注释掉里面的内容,但是在这样的话在Visual Studio里面就无法改变窗体的大小了。  如果这个也有解决方法的话,在此谢过了。

     protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
            {
                //base.SetBoundsCore(x, y, width, height, specified);
            }

    3.第三种当然是最好实现的了 ,但是模拟的状态无法直接替换到以前已经写好的窗体,直接否掉了 。

    第一种和第二种其实是有点类似的,主要的地方还是在绘制上面  。

    重绘非工作区,这个地方的重点在 DarwRegion函数里的

    using (Bitmap img = new Bitmap(this.Bounds.Width, this.Bounds.Height))

    { Graphics g = Graphics.FromImage(img);

    ……

    gs.DrawImage(img, Point.Empty);

    }

    这里利用双缓存先在图片上绘制了然后在画在窗体上

    绘制函数


     
    三个按钮的绘制,可以参考我前一篇重写TabControl标签的方法  。

    最后是几个需要重绘的消息 

    非客户区刷新

    非客户区刷新

    在这里鼠标点击关闭按钮是会出现WM_NCLBUTTONDOWN无法接收到消息,研究了很久发现了一个可以收到的方法,在WM_NCLBUTTONUP事件中判断是否是在最大最小关闭按钮按下的,如果是就不执行base.WndProc(ref m)这句。

            基本上窗体绘制的原理就这么些东西了,如果哪位同学对上面的方法有更好的建议的话,欢迎讨论 。

  • 相关阅读:
    hdu 5224 Tom and paper 水题
    2015 UESTC 搜索专题N题 韩爷的梦 hash
    2015 UESTC 搜索专题M题 Palindromic String 马拉车算法
    2015 UESTC 搜索专题K题 秋实大哥の恋爱物语 kmp
    2015 UESTC 搜索专题J题 全都是秋实大哥 kmp
    2015 UESTC 搜索专题F题 Eight Puzzle 爆搜
    2015 UESTC 搜索专题E题 吴队长征婚 爆搜
    2015 UESTC 搜索专题D题 基爷的中位数 二分
    2015 UESTC 搜索专题C题 基爷与加法等式 爆搜DFS
    2015 UESTC 搜索专题B题 邱老师降临小行星 记忆化搜索
  • 原文地址:https://www.cnblogs.com/ac1985482/p/2704406.html
Copyright © 2011-2022 走看看