文本显示尺寸计算(关于控件的尺寸定义)

来源:互联网 发布:淘宝店铺刷收藏怎么刷 编辑:程序博客网 时间:2024/04/29 22:22

  WM系统的特点之一就是:尺寸比较小。因此,在UI设计时,控件大小、位置、布局,就显得尤为重要,力求在有限的空间中,完整的显示文本信息。之前提到的跑马灯控件,也是类似的功能。

  用于文本显示的,主要有两种控件:LABEL和TEXTBOX。这两种控件,在一定程度上,都支持自动换行。但是要使其显示完整信息,就必须定义一个合适的尺寸(LABEL显示高度不够时,文字被遮蔽,TEXTBOX则会显示滚动条)。

  情况一、LABEL不换行,但需要显示完整的内容,即动态设置LABEL的长度。

  在NET2.0的桌面系统中,可以用以下方法:
  TextRenderer.MeasureText 方法 (String, Font)
  在使用指定字体绘制时,提供指定文本的尺寸(以像素为单位)。

  NETCF可以用以下方式:
    Graphics g = this.CreateGraphics();
    SizeF siF = g.MeasureString(内容, 字体);
    label2.Width = (int)siF.Width;

 

  情况二、在LABEL显示时,需要自动换行,并根据实际高度,设置控件的尺寸。
  思路,计算出一行显示需要的尺寸,除以希望每行显示的尺寸,得到行数。 再根据行数得到高度。


  情况三、在TEXTBOX中,根据文本,需要计算文本需要显示的高度。
  一般思路,文字的FONT决定了高度,只要知道行数,就可以得到需要显示的高度了。但是,用topic.Font.Height当行数很多时存在误差。 所以, 要获得一行文字所占的实际高度,需要借鉴Graphics方法。

以下是获得行数的方法(获得行数的方法,只支持2005):

 [DllImport("coredll.dll")]
        private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, string lParam);  

        private void button1_Click(object sender, EventArgs e)
        {
            //获得TEXTBOX中文本的实际高度
            int EM_GETLINECOUNT = 0x00BA;//获取总行数的消息号 
            int lc = SendMessage(this.textBox1.Handle, EM_GETLINECOUNT, IntPtr.Zero, "");//行数

            Graphics g = this.CreateGraphics();
            SizeF siF = g.MeasureString("TEST", textBox1.Font);
            g.Dispose();
            int sf = (int)siF.Height * lc;

            this.textBox1.ClientSize = new Size(this.textBox1.ClientSize.Width, sf + 5);

        }

针对2003获得行数,需要下面的方法(获得控件句柄):
 [DllImport("coredll.dll")]
        private static extern IntPtr GetFocus();
 IntPtr hWnd = GetFocus();
        int lc3 = SendMessage(hWnd, EM_GETLINECOUNT, IntPtr.Zero, "");//行数

原创粉丝点击