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)这句。

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

  • 相关阅读:
    JQuery[07]Dom操作
    系统钩子[02] 安装全局鼠标钩子
    [Java动态代理] 设计模式之代理模式
    对话框编程之模态对话框 [03]
    对话框编程之属性对话框 [05]
    [Java反射机制] 通过反射机制创建类的实例并调用其方法
    JQuery[06] 过滤器、相对选择器
    JQuery[04] 节点遍历
    JQuery[13] Ajax的简单应用
    JQuery[09] CSS样式操作/节点操作
  • 原文地址:https://www.cnblogs.com/ac1985482/p/2704406.html
Copyright © 2011-2022 走看看