• 学习笔记 :DrawText


    最近在做一个TStringGrid的自绘处理,在画文字处理上遇到了高度的计算问题。后来经过一段时间还是找到了一些方法:

     

    1、使用TLabel

      这个方法是有点绕路的,方法倒是简单,就是使用AutoSize属于来完成。。

    2、使用DrawText

      DrawText的函数定义:

    函数原型
    int DrawText(

    HDC hDC, // 设备描述表句柄

    LPCTSTR lpString, // 将要绘制的字符串

    int nCount, // 字符串的长度

    LPRECT lpRect, // 指向矩形结构RECT的指针

    UINT uFormat // 正文的绘制选项

    );

    参数
    hdc:

    [输入]设备环境句柄。

    lpString:

    [输入]指向将被写入的字符串的指针,如果参数nCount是-1,则字符串必须是以结束的。 如果uFormat包含DT_MODIFYSTRING,则函数可为此字符串增加4个字符,存放字符串的缓冲区必须足够大,能容纳附加的字符。

    nCount:

    [输入]指向字符串中的字符数。如果nCount为-1,则lpString指向的字符串被认为是以结束的,DrawText会自动计算字符数。

    lpRect:

    [输入/输出]指向结构RECT的指针,其中包含文本将被置于其中的矩形的信息(按逻辑坐标)。

    uFormat:

    [输入]指定格式化文本的方法。它可以下列值的任意组合,各值描述如下:

    DT_CALCRECT:这个参数比较重要,可以使DrawText函数计算出输出文本的尺寸。如果输出文本有多行,DrawText函数使用lpRect定义的矩形的宽度,并扩展矩形的底部以容纳输出文本的最后一行。如果输出文本只有一行,则DrawText函数改变矩形的右边界,以容纳下正文行的最后一个字符。出现上述任何一种情况,DrawText函数将返回格式化文本的高度,而不是绘制文本。

    DT_CENTER:指定文本水平居中显示。

    DT_VCENTER:指定文本垂直居中显示。该标记只在单行文本输出时有效,所以它必须与DT_SINGLELINE结合使用。

    DT_SINGLELINE:单行显示文本,回车和换行符都不断行。

    函数里面最后面那段蓝字标示的很重要,DT_CALCRECT就是用来计算文本尺寸的哦。。做个试验吧:

     

    procedure TForm1.Button1Click(Sender: TObject);
    var
      sData: string;
      cellRect: TRect;
    begin
      cellRect.Left := 10;
      cellRect.Top := 10;
      cellRect.Right := 200;
      cellRect.Bottom := 25;
      sData := '中中国国国 大';
      DrawText(Canvas.Handle, PChar(sData), Length(sData), cellRect, DT_WORDBREAK or DT_CALCRECT);
    end;
    //执行后没有在界面上画文本
    procedure TForm1.Button2Click(Sender: TObject); var sData: string; cellRect: TRect; begin cellRect.Left := 10; cellRect.Top := 10; cellRect.Right := 200; cellRect.Bottom := 25; sData := '中中国国国 大'; DrawText(Canvas.Handle, PChar(sData), Length(sData), cellRect, DT_WORDBREAK); end;

    //执行后在界面上显示一行字

    注意点:

    • 这里有一点,DrawText计算后的矩形大小还是通过cellRect来返回的哦。这个参数传入时是做为计算文本显示的矩形大小,返回时就是文本实际占用的矩形大小。
    • 同时DrawText运算后也会有函数返回值的,就是文本实际的高度。
  • 相关阅读:
    工作后对单元测试学习的一点总结
    图片做按钮会将form表单自动提交
    转jMock Cookbook 中文版三
    转jMock Cookbook 中文版二
    转jMock Cookbook 中文版一
    JUnit4学习笔记(五):Theory(理论)测试
    JUnit4学习笔记(四):利用Rule扩展JUnit
    JUnit4学习笔记(三):assertThat语法与Matcher
    JUnit4学习笔记(二):参数化测试与假定(Assumption)
    junit学习一
  • 原文地址:https://www.cnblogs.com/5207/p/5068961.html
Copyright © 2020-2023  润新知