none
关于WinForms坐标系的两个问题. RRS feed

  • 问题

  • private void ShowSize()
    {
                StringBuilder output = new StringBuilder();

                output.AppendFormat("通过 System.Windows.Forms.SystemInformation.CaptionHeight 获取的标题栏高度: {0}\r\n\r\n", System.Windows.Forms.SystemInformation.CaptionHeight);
                output.AppendFormat("通过 System.Windows.Forms.Form.Bounds.Height - System.Windows.Forms.Form.ClientRectangle.Height 获取的标题栏高度: {0}\r\n\r\n", Bounds.Height - ClientRectangle.Height);
                output.AppendFormat("System.Windows.Forms.SystemInformation.CaptionHeight + System.Windows.Forms.SystemInformation.Border3DSize.Height 的值: {0}\r\n\r\n", System.Windows.Forms.SystemInformation.CaptionHeight + System.Windows.Forms.SystemInformation.Border3DSize.Height);
                output.AppendFormat("System.Windows.Forms.Form.ClientRectangle 的值: Location = {0},{1} | Size = {2},{3}\r\n\r\n", ClientRectangle.Left, ClientRectangle.Top, ClientRectangle.Width, ClientRectangle.Height);
                output.AppendFormat("System.Windows.Forms.Form.Bounds 的值: Location = {0},{1} | Size = {2},{3}\r\n\r\n", Bounds.Left, Bounds.Top, Bounds.Width, Bounds.Height);

                MessageBox.Show(output.ToString());
    }

     

    private void DrawZeroPoint()
    {
           Graphics gr = Graphics.FromHwnd(Handle);

            gr.DrawLine(new Pen(Color.Red), new Point(0, 0),new Point(1,1));
            gr.DrawString("\r\n↑原点(0,0)位置", SystemFonts.DefaultFont, new SolidBrush(Color.Red), new PointF(0f,0f));

    }

     

    以上函数. 可以在System.Windows.Forms.Form的继承类中声明并调用. 大家可以测试一下结果. 第一个函数中输出的值互相矛盾. 通过两种方法获取标题栏的高度可以得到两种不同的结果. Windows XP Professional 启用 "Windows XP" 主题之后, 通过 System.Windows.Forms.SystemInformation.CaptionHeight 获取的标题栏高度为 26
    而通过 System.Windows.Forms.Form.Bounds.Height - System.Windows.Forms.Form.ClientRectangle.Height 获取的标题栏高度为 34. System.Windows.Forms.SystemInformation.Border3DSize.Height为2. 如果说System.Windows.Forms.Form.Bounds.Height - System.Windows.Forms.Form.ClientRectangle.Height 的结果包含了标题栏和底边栏的话, 那么34-2=32, 依然大于26. 如果说标题栏中还包含边框宽度的话, 那么应该是34-(2*2)=30. 怎么算都不对啊!!!!! 哪位大师给解释一下?

     

    还有, 如果用 Control.CopyFromScreen(Bitmap,Rectangle); 函数捕捉窗体的话, 那么无论怎样获取的位图中都包含有标题栏和边框. Rectangle参数似乎是表示将要画在Bitmap的什么位置上, 而不是像MSDN中所言:"呈现控件时的边界。" 我应该如何让Control.CopyFromScreen函数从控件的指定位置开始截图??????

     

     

    谢谢各位


    哈哈哈哈
    2010年6月6日 18:23

答案

  • 问题1:

    调用
    StringBuilder output = new StringBuilder();
    output.AppendLine("设置FormBorderStyle为Sizable:");
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
    output.AppendLine(string.Format("总高度:this.Bounds.Height:{0}", this.Bounds.Height));
    output.AppendLine("设置FormBorderStyle为Fixed3D:");
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
    output.AppendLine(string.Format("总高度:this.Bounds.Height:{0}", this.Bounds.Height));
    output.AppendLine("设置FormBorderStyle为FixedDialog:");
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
    output.AppendLine(string.Format("总高度:this.Bounds.Height:{0}", this.Bounds.Height));
    MessageBox.Show(output.ToString());

    显示
    设置FormBorderStyle为Sizable:
    总高度:this.Bounds.Height:300
    设置FormBorderStyle为Fixed3D:
    总高度:this.Bounds.Height:302
    设置FormBorderStyle为FixedDialog:
    总高度:this.Bounds.Height:298

    说明:边框高度不能用System.Windows.Forms.SystemInformation.Border3DSize.Height一概而论。

    问题2:

    int width = this.Bounds.Width;
    int height = this.Bounds.Height;
    int left = this.Bounds.Left;
    int top = this.Bounds.Top;
    System.Drawing.Image myImage = new System.Drawing.Bitmap(width, height);
    Graphics g = Graphics.FromImage(myImage);
    Point upperLeftSource = new Point(left, top);
    g.CopyFromScreen(upperLeftSource, new Point(0, 0), new Size(width, height));
    myImage.Save(@"c:\1.bmp");

    说明:调整upperLeftSource坐标,即可从任意位置开始截图。

    2010年7月1日 10:05

全部回复

  • 无人回答
    哈哈哈哈
    2010年6月7日 15:41
  • 继续顶贴. 直到有回答为止.
    哈哈哈哈
    2010年6月8日 16:16
  • 你的东西写的太多了

    建议把你内容精简下 描述剪短点 不然没人愿意浪费一大把时间来替你看

     

    2010年6月9日 6:37
  • 问题1:

    调用
    StringBuilder output = new StringBuilder();
    output.AppendLine("设置FormBorderStyle为Sizable:");
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
    output.AppendLine(string.Format("总高度:this.Bounds.Height:{0}", this.Bounds.Height));
    output.AppendLine("设置FormBorderStyle为Fixed3D:");
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
    output.AppendLine(string.Format("总高度:this.Bounds.Height:{0}", this.Bounds.Height));
    output.AppendLine("设置FormBorderStyle为FixedDialog:");
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
    output.AppendLine(string.Format("总高度:this.Bounds.Height:{0}", this.Bounds.Height));
    MessageBox.Show(output.ToString());

    显示
    设置FormBorderStyle为Sizable:
    总高度:this.Bounds.Height:300
    设置FormBorderStyle为Fixed3D:
    总高度:this.Bounds.Height:302
    设置FormBorderStyle为FixedDialog:
    总高度:this.Bounds.Height:298

    说明:边框高度不能用System.Windows.Forms.SystemInformation.Border3DSize.Height一概而论。

    问题2:

    int width = this.Bounds.Width;
    int height = this.Bounds.Height;
    int left = this.Bounds.Left;
    int top = this.Bounds.Top;
    System.Drawing.Image myImage = new System.Drawing.Bitmap(width, height);
    Graphics g = Graphics.FromImage(myImage);
    Point upperLeftSource = new Point(left, top);
    g.CopyFromScreen(upperLeftSource, new Point(0, 0), new Size(width, height));
    myImage.Save(@"c:\1.bmp");

    说明:调整upperLeftSource坐标,即可从任意位置开始截图。

    2010年7月1日 10:05