none
winform StatusStrip控件显示手柄样式如何达到类似ie或vs 2008 右下角的边角样式 RRS feed

答案

  • 可以重写StatusStrip控件的OnPaint方法来自定义你的所需要的,至于实现方式参考下面代码:

     // 你可以用Reflector反射工具查看下StatusStrip的WndProc的源码,
            // 其中你设置SizingGrip=true,其实是创建了 RightToLeftLayoutGrip控件的,这个控件是私有类
            // 这个控件的是继承Control的,重新了WndProc方法,RightToLeftLayoutGrip控件的WndProc方法如下:
            //protected override void WndProc(ref Message m)
            //{
            //    if (m.Msg == 0x84)
            //    {
            //        int x = NativeMethods.Util.LOWORD(m.LParam);
            //        int y = NativeMethods.Util.HIWORD(m.LParam);
            // 这里原来实现是把点绘制到控件矩形中,如果要改成你想要的效果就要重新OnPaint方法,并把SizingGrip修改为false,因为该属性默认为true.
            //        if (base.ClientRectangle.Contains(base.PointToClient(new Point(x, y))))
            //        {
            //            m.Result = (IntPtr)0x10;
            //            return;
            //        }
            //    }
            //    base.WndProc(ref m);
            //}
            protected override void OnPaint(PaintEventArgs e)
            {
                base.SizingGrip = false;
                Graphics g = e.Graphics;
                Pen p = new Pen(Color.Black, 1);
                int x =this.ClientRectangle.Width;
                int y =this.ClientRectangle.Height;
                // 画三条线
                g.DrawLine(p, new Point(x - 2, y - 2), new Point(y - 2, x - 2));
                g.DrawLine(p, new Point(x - 2, y - 8), new Point(y - 8, x - 2));
                g.DrawLine(p, new Point(x - 2, y - 14), new Point(y - 14, x - 2));
                base.OnPaint(e);
            }

    最后实现的组件效果如下图所示:

    目前实现的线比你上传图片的线细,你可以通过修改画笔的第二个参数来设置线的宽度,如Pen p =new Pen(Color.Black,2); // 设置画笔粗细为2


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample


    • 已编辑 Learning hard 2013年10月12日 4:12 update
    • 已建议为答案 Learning hard 2013年10月12日 5:14
    • 已标记为答案 极度 2013年10月12日 5:45
    2013年10月12日 4:10

全部回复

  • 顺便追加一个问题 statusStrip ToolStripStatusLabel.BorderStyle 属性 设置样式运行没有效果,难道还要设置其他属性才支持这个样式吗

    啥叫乐观-得瑟的最高境界

    2013年10月11日 10:19
  • 您好,由于您的截图我看不清楚,我只能猜想你需要一个伸缩手柄。如对的话请参考:

    SizingGrip=True。

    截图:


    Click For donating:Free Rice For the poor
    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
    For more things to talk about? StackOverFlow is your choice.

    2013年10月11日 12:04
    版主
  • 但是手柄样式不是这样的,你发现没有的手柄样式并不是 点点 而是直线

    啥叫乐观-得瑟的最高境界

    2013年10月11日 13:01
  • 想要 这个 直线的样式 而不是 点点的


    啥叫乐观-得瑟的最高境界

    2013年10月11日 14:07
  • 可以重写StatusStrip控件的OnPaint方法来自定义你的所需要的,至于实现方式参考下面代码:

     // 你可以用Reflector反射工具查看下StatusStrip的WndProc的源码,
            // 其中你设置SizingGrip=true,其实是创建了 RightToLeftLayoutGrip控件的,这个控件是私有类
            // 这个控件的是继承Control的,重新了WndProc方法,RightToLeftLayoutGrip控件的WndProc方法如下:
            //protected override void WndProc(ref Message m)
            //{
            //    if (m.Msg == 0x84)
            //    {
            //        int x = NativeMethods.Util.LOWORD(m.LParam);
            //        int y = NativeMethods.Util.HIWORD(m.LParam);
            // 这里原来实现是把点绘制到控件矩形中,如果要改成你想要的效果就要重新OnPaint方法,并把SizingGrip修改为false,因为该属性默认为true.
            //        if (base.ClientRectangle.Contains(base.PointToClient(new Point(x, y))))
            //        {
            //            m.Result = (IntPtr)0x10;
            //            return;
            //        }
            //    }
            //    base.WndProc(ref m);
            //}
            protected override void OnPaint(PaintEventArgs e)
            {
                base.SizingGrip = false;
                Graphics g = e.Graphics;
                Pen p = new Pen(Color.Black, 1);
                int x =this.ClientRectangle.Width;
                int y =this.ClientRectangle.Height;
                // 画三条线
                g.DrawLine(p, new Point(x - 2, y - 2), new Point(y - 2, x - 2));
                g.DrawLine(p, new Point(x - 2, y - 8), new Point(y - 8, x - 2));
                g.DrawLine(p, new Point(x - 2, y - 14), new Point(y - 14, x - 2));
                base.OnPaint(e);
            }

    最后实现的组件效果如下图所示:

    目前实现的线比你上传图片的线细,你可以通过修改画笔的第二个参数来设置线的宽度,如Pen p =new Pen(Color.Black,2); // 设置画笔粗细为2


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample


    • 已编辑 Learning hard 2013年10月12日 4:12 update
    • 已建议为答案 Learning hard 2013年10月12日 5:14
    • 已标记为答案 极度 2013年10月12日 5:45
    2013年10月12日 4:10
  • 你好

         

    Learning hard,如果重绘,是不是要新建一个类 StatusStripEx 继承StatusStrip 然后实现 OnPaint,,要不然如何知道重绘的是StatusStrip ,还 有如何知道重绘的是StatusStrip 控件 伸缩样式


    啥叫乐观-得瑟的最高境界


    • 已编辑 极度 2013年10月12日 5:14 修改
    2013年10月12日 5:12
  • 肯定要的了,你创建新添加一个组件类,然后把默认继承Component修改为StatusStrip,具体代码为:

     public partial class Component1 :StatusStrip


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    2013年10月12日 5:14
  • 平时都是用
    Reflector 反射具体某一个dll, 你上面说道的反射StatusStrip 还真不知道如何找到这个dll 进行反射,请指教

    啥叫乐观-得瑟的最高境界

    2013年10月12日 5:20
  • 现在.NET已经公布源码了,你也可以下载.NET源码查看StatusStrip实现的源码,下载地址为:http://referencesource.microsoft.com/netframework.aspx

    不过我是习惯了用Reflector反射工具去查看它的源码去弄明白原理,即为什么你设置一个SizingGrip属性就显示“点点”的格式,其背后肯定是重绘了控件,把"点“重新绘制到窗体上了,此时你可以查看SizingGrip属性,其代码如下:

    public bool SizingGrip
    {
        get
        {
            return this.state[stateSizingGrip];
        }
        set
        {
            if (value != this.state[stateSizingGrip])
            {
                this.state[stateSizingGrip] = value;
                this.EnsureRightToLeftGrip();
                base.Invalidate(true);
            }
        }
    }
    然后从Set块入手,set块主要就是EnsureRightToLefrGrip方法,然后点击这个方法Refloctor就会导航到该方法的定义,接下来的留给你自己去发现了,总之解决问题的思路大致是这样的


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    • 已标记为答案 极度 2013年10月12日 5:33
    • 取消答案标记 极度 2013年10月12日 5:46
    2013年10月12日 5:27
  • Learning hard ths

    啥叫乐观-得瑟的最高境界

    2013年10月12日 5:33
  • 答案应该是我建议为答案的那个,这样可以帮助和你有相同问题的人找到解决方案

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    2013年10月12日 5:35
  • 顺便问下 .net reflector插件 支持在vs 菜单工具上显示,你那有破解带注册版本吗

    啥叫乐观-得瑟的最高境界

    2013年10月12日 5:44
  • 支持的,但是现在Refloctor好像是收费的了,我这边的是破解版的Refloctor工具,并没有插件。

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    2013年10月12日 5:46
  • 方便发我一份 加如何破解   bmagi@qq.com  谢谢

    啥叫乐观-得瑟的最高境界

    2013年10月12日 5:57
  • 你好极度:

    你完全可以使用免费并且可以升级的(Just-Decompiler):

    1)click here to download

    2)注册的时候,安装界面只能对JustDecompiler打钩,其它都是收费的;并且注册界面用Email注册,以后用这个Email登陆就可以升级啦!完全免费的。


    Click For donating:Free Rice For the poor
    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
    For more things to talk about? StackOverFlow is your choice.

    2013年10月12日 11:28
    版主