分享

Win32Api的DrawText怎么用啊?高手请进。

 龙山书生馆 2018-03-12
 ls_temp = "asdfasdf"

ll_1 = GetDc(Handle(st_2))

DrawText( ll_1 , (ls_temp) , len(ls_temp) , My_Rect, DT_SINGLELINE + DT_CALCRECT )

以上代码无论我怎么改动st_2的字体,颜色等属性,最后返回的My_Rect都是一样的。请高手赐教。
------华软网友回答------
DrawText 

VB声明 
Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long 
说明 
将文本描绘到指定的矩形中 
返回值 
Long,描绘文字的高度 
参数表 
参数 类型及说明 
hdc Long,欲在其中显示文字的一个设备场景的句柄 
lpStr String,欲描绘的文本字串 
nCount Long,欲描绘的字符数量。如果要描绘整个字串(直到空中止符),则可将这个参数设为-1 
lpRect RECT,指定用于绘图的一个格式化矩形(采用逻辑坐标) 
wFormat Long,一个标志位数组,决定了以何种形式执行绘图。参考下面总结的常数类型列表 
标志常数 说明 
DT_BOTTOM 必须同时指定DT_SINGLE。指示文本对齐格式化矩形的底边 
DT_CALCRECT 象下面这样计算格式化矩形:多行绘图时矩形的底边根据需要进行延展,以便容下所有文字;单行绘图时,延展矩形的右侧。不描绘文字。由lpRect参数指定的矩形会载入计算出来的值 
DT_CENTER 文本垂直居中 
DT_EXPANDTABS 描绘文字的时候,对制表站进行扩展。默认的制表站间距是8个字符。但是,可用DT_TABSTOP标志改变这项设定 
DT_EXTERNALLEADING 计算文本行高度的时候,使用当前字体的外部间距属性(the external leading attribute) 
DT_LEFT 文本左对齐 
DT_NOCLIP 描绘文字时不剪切到指定的矩形 
DT_NOPREFIX 通常,函数认为 & 字符表示应为下一个字符加上下划线。该标志禁止这种行为 
DT_RIGHT 文本右对齐 
DT_SINGLELINE 只画单行 
DT_TABSTOP 指定新的制表站间距,采用这个整数的高8位 
DT_TOP 必须同时指定DT_SINGLE。指示文本对齐格式化矩形的顶部 
DT_VCENTER 必须同时指定DT_SINGLE。指示文本对齐格式化矩形的中部 
DT_WORDBREAK 进行自动换行。如用SetTextAlign函数设置了TA_UPDATECP标志,这里的设置则无效 


------华软网友回答------
使用我都会,因为在vb下我都没有问题,但是到了pb下面就无法得到预期的效果,郁闷......
------华软网友回答------
啊,仔细看看其属性值,在结合程序
------华软网友回答------
要自己设字体呀,开始我也以为你那样做就可以了,可惜不行。
看看:http://www.csdn.net/expert/topic/763/763906.xml?temp=.1558649
------华软网友回答------
这个是对的:

public function s_rect of_gettextrect (string as_text, string as_fontname, integer ai_fontcharset, integer ai_fontheight, integer ai_fontweight);//@@获得文字占用的矩形区间
long ll_dc
long ll_font
long ll_oldfont
s_font lstr_font
s_rect lstr_rect
long ll_pixelsperinch

as_text=as_text+char(0)
ll_dc = GetDC(handle(this))
ll_pixelsperinch = GetDeviceCaps( ll_dc, LOGPIXELSY )
lstr_font.lffacename = as_fontname
lstr_font.lfcharset = char(ai_fontcharset)
lstr_font.lfheight =  ai_fontheight * ll_PixelsPerinch / 72
lstr_font.lfweight = ai_fontweight
ll_font = CreateFontIndirect( lstr_font )
if ll_font <> 0 then
  ll_oldfont = SelectObject( ll_dc, ll_font )
  DrawText( ll_dc, as_text, len(as_text), lstr_rect, DT_CALCRECT)
  ll_font =SelectObject( ll_dc, ll_oldfont )
end if
ReleaseDC(handle(this), ll_dc )
return lstr_rect
end function

------华软网友回答------
记得要用别名:

函数据声明如下:
FUNCTION ulong DrawText(ulong hdc,ref string lpStr,ulong nCount,ref RECT lpRect,ulong wFormat) LIBRARY "user32.dll" ALIAS FOR "DrawTextA"

调用方法同与你的方法一样,只是把DrawText()改为DrawTextA()即可。

------华软网友回答------
你取出的DC的FONT是系统默认的字体,你需要取出ST_2的HFONT赋给DC。
ulong hfont, hold, hdc, hwnd

hwnd = Handle( st_2 )
hdc = GetDC( hwnd )
hfont = Send( hwnd, WM_GETFONT, 0, 0 )
hold = SelectObject( hdc, hfont )
DrawText( hdc, ls_text, len( ls_text ), my_rect, DT_SINGLELINE + DT_CALCRECT )
hfont = SelectObject( hdc, hold )
ReleaseDC( hwnd, hdc )

------华软网友回答------
函数功能:该函数在指定的矩形里写入格式化文本,根据指定的方法对文本格式化(扩展的制表符,字符对齐、折行等)。

    函数原型:int DrawText(HDC, hdc, LPCTSTR lpString, int nCount, LPREST lpRect, UINT uFormat);

    参数:

    hdc:设备环境句柄。

    lpString:指向将被写入的字符串的指针,如果参数nCount是C1,则字符串必须是以\0结束的。

    如果uFormat包含DT_MODIFYSTRING,则函数可为此字符串增加4个字符,存放字符串的缓冲区必须足够大,能容纳附加的字符。

    nCount:指向字符串中的字符数。如果nCount为C1,则lpString指向的字符串被认为是以\0结束的,DrawText会自动计算字符数。

    lpRect:指向结构RECT的指针,其中包含正文将被置于其中的矩形的信息(按逻辑坐标)。

    uFormat:指定格式化正文的方法。它可以下列值的任意组合,各值描述如下:

    DT_BOTTOM:将正文调整到矩形底部。此值必须和DT_SINGLELINE组合。

    DT_CALCRECT:决定矩形的宽和高。如果正文有多行,DrawText使用lpRect定义的矩形的宽度,并扩展矩形的底训以容纳正文的最后一行,如果正文只有一行,则DrawText改变矩形的右边界,以容纳下正文行的最后一个字符,上述任何一种情况,DrawText返回格式化正文的高度而不是写正文。

    DT_CENTER:使正文在矩形中水平居中。

    DT_EDITCONTROL:复制多行编辑控制的正文显示特性,特殊地,为编辑控制的平均字符宽度是以同样的方法计算的,此函数不显示只是部分可见的最后一行。

    DT_END_ELLIPSIS或DT_PATH_ELLIPSIS:可以指定DT_END_ELLIPSIS来替换在字符串末尾的字符,或指定DT_PATH_ELLIPSIS来替换字符串中间的字符。如果字符串里含有反斜扛,DT_PATH_ELLIPSIS尽可能地保留最后一个反斜杠之后的正文。

    DT_EXPANDTABS:扩展制表符,每个制表符的缺省字符数是8。

    DT_EXTERNALLEADING:在行的高度里包含字体的外部标头,通常,外部标头不被包含在正文行的高度里。

    DT_INTERNAL:用系统字体来计算正文度量。

    DT_LEFT:正文左对齐。

    DT_MODIFYSTRING:修改给定的字符串来匹配显示的正文,此标志必须和DT_END_ELLIPSIS或DT_PATH_ELLIPSIS同时使用。

    DT_NOCLIP:无裁剪绘制当DT_NOCLIP使用时DrawText的使用会有所加快。

    DT_NOPREFIX:关闭前缀字符的处理,通常DrawText解释助记前缀字符,&为给其后的字符加下划线,解释&&为显示单个&。指定DT_NOPREFIX,这种处理被关闭。

    DT_RIGHT:正文右对齐。

    DT_RTLREADING:当选择进设备环境的字体是Hebrew或Arabicf时,为双向正文安排从右到左的阅读顺序都是从左到右的。

    DT_SINGLELINE:显示正文的同一行,回车和换行符都不能折行。

    DT_TABSTOP:设置制表,参数uFormat的15"C8位(低位字中的高位字节)指定每个制表符的字符数,每个制表符的缺省字符数是8。

    DT_TOP:正文顶端对齐(仅对单行)。DT_VCENTER:正文水平居中(仅对单行)。

    DT_WORDBREAK:断开字。当一行中的字符将会延伸到由lpRect指定的矩形的边框时,此行自动地在字之间断开。一个回车一换行也能使行折断。

    DT_WORD_ELLIPSIS:截短不符合矩形的正文,并增加椭圆。

    注意:DT_CALCRECT, DT_EXTERNALLEADING, DT_INTERNAL, DT_NOCLIP, DT_NOPREFIX值不能和DT_TABSTOP值一起使用。

    返回值:如果函数调用成功,返回值是正文的高度;如果函数调用失败,返回值是0。

    Windows NT:若想获得更多错误信息,请调用GetLastError函数。

    备注:函数DrawText用设备环境中的字体选择、正文颜色和背景颜色来写正文,除非DT_NOCLIP被使用,DrawText裁剪正文,所以它不会出现在指定矩形的外面,除DT_SINGLELINE格式化,其余的格式都认为正文有多行。

    如果选择的字体对指定的矩形而言太大,DrawText不会试图去换成一种小字体。

    Windows CE:如果为参数uFormat指定DT_CALCRECT值,必须为lpRect指向的RECT结构设置right和bottom成员。Windows CE不支持uFormat为DT_EXTERNALLEADING。

    速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:wingdi.h;库文件:gdi32.lib;Unicode:在Windows NT环境下以Unicode和ANSI两种方式实现。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多