找回密码
 加入
搜索
查看: 23828|回复: 22

[交流] 第二讲 GDI文字DrawText

[复制链接]
发表于 2013-5-13 18:37:29 | 显示全部楼层 |阅读模式
本帖最后由 seniors 于 2013-6-16 07:58 编辑

2、GDI之DrawText

这一讲,主要是说_WinAPI_DrawText($hDC, $sText, ByRef $tRect, $iFlags)
他比textout的功能要强一些,可以设置显示的范围$tRect,以及显示的方式$iFlags;
$tRECT:可以用_WinAPI_CreateRect来生成,例子中已经有说明
$iFlags:显示方式有很多,例子说介绍了左对齐、水平居中、区域不够显示时有省略号,更多请看F1帮助

由于有时不知道这个字符串要多少大小的矩形,所以介绍了一个测量函数
_WinAPI_GetTextExtentPoint32($hDC, $sText)

上一讲,讲到设置字体函数_WinAPI_CreateFont,在这一讲中,再介绍一个可以设置字体的函数
_WinAPI_GetStockObject($iObject)
这个函数不仅能得到字体,还能得到画笔、画刷等句柄。
在DC中如果不设置字体,就是用的_WinAPI_GetStockObject($DEVICE_DEFAULT_FONT)

布置作业:
1.输出一个红字,背景透明,靠右对齐的字符串;
2.一个黄字,背景红色,垂直居中的字符串;
3.输出一个有阴影的字符串
阴影字想法
比如先写一个灰色的字,再在偏一点的位置写红色的字
这里可以用_WinAPI_OffsetRect($tRECT, -2, -2),让那个矩形范围向左移2,向上移2

更简单点,在API中本来就有一个写阴影字的函数叫做 _WinAPI_DrawShadowText
大家加油啊,主动看帮助啊!因为我不可能讲到所有函数的。

本讲源码。
#include <APIConstants.au3>
#include <WinAPIEx.au3>

GUICreate("第二讲", 300, 200)
$ctrlId = GUICtrlCreatePic("",0 ,0 ,300,200)
$hWnd = GUICtrlGetHandle($ctrlId)
GUISetState()
gditest()

While 1
        $Msg = GUIGetMsg()
        Switch $Msg
                Case -3
                        ExitLoop
        EndSwitch
WEnd
GUIDelete()
Exit

Func gditest()
        Local $sText = '这是我输出的字符串'
        $hDC = _WinAPI_GetDC($hWnd)
        
        $hFont = _WinAPI_GetStockObject($DEFAULT_GUI_FONT);获取预定义默认界面字体,DC中不设置字体的话默认的是$DEVICE_DEFAULT_FONT默认设备字体
        _WinAPI_SelectObject($hDC, $hFont)
        ;居中输出
        $tRECT = _WinAPI_CreateRect(10, 10, 100, 30);文字区域左上XY坐标,右下XY坐标,本例就是长宽为90*20
        _WinAPI_SetBkMode($hDC, $OPAQUE);设置文字背景不透明
        _WinAPI_SetBkColor($hDC, 0x0000FF);背景颜色为红色
        _WinAPI_DrawText($hDC, $sText, $tRECT, $DT_CENTER);居中输出
        ;左对齐输出
        $tRECT = _WinAPI_CreateRect(10, 40, 100, 60);文字区域左上XY坐标,右下XY坐标,本例就是长宽为90*20
        _WinAPI_SetBkMode($hDC, $OPAQUE);设置文字背景不透明
        _WinAPI_SetBkColor($hDC, 0x00FF00);背景颜色为绿色
        _WinAPI_DrawText($hDC, $sText, $tRECT, $DT_LEFT);左对齐输出
        
        ;左对齐输出不哆输出省略号
        $tRECT = _WinAPI_CreateRect(10, 70, 100, 90);文字区域左上XY坐标,右下XY坐标,本例就是长宽为90*20
        _WinAPI_SetBkMode($hDC, $OPAQUE);设置文字背景不透明
        _WinAPI_SetBkColor($hDC, 0x00FF00);背景颜色为绿色
        _WinAPI_DrawText($hDC, $sText, $tRECT, $DT_WORD_ELLIPSIS);如果不哆输出省略号
        
        ;计算字符串长度和高度
        $tsize = _WinAPI_GetTextExtentPoint32($hDC, $sText);计算字符串所需长度
        $Width = DllStructGetData($tsize, "X")
        $Height = DllStructGetData($tsize, "Y")
        $tRECT = _WinAPI_CreateRect(10, 100, 10 + $Width, 100 + $Height)
        _WinAPI_SetBkMode($hDC, $OPAQUE);设置文字背景不透明
        _WinAPI_SetBkColor($hDC, 0x00FFFF);背景颜色为黄色
        _WinAPI_DrawText($hDC, $sText, $tRECT, $DT_LEFT);左对齐输出

        $hFont = _WinAPI_CreateFont(38, 0, 0, 0, $FW_NORMAL, 0, 0, 0, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $ANTIALIASED_QUALITY, $DEFAULT_PITCH, '黑体')
        $oldFontObj = _WinAPI_SelectObject($hDC, $hFont);选择新建立的字体,返回值为原来默认字体
        $tsize = _WinAPI_GetTextExtentPoint32($hDC, $sText);计算字符串所需长度
        $Width = DllStructGetData($tsize, "X")
        $Height = DllStructGetData($tsize, "Y")
        $tRECT = _WinAPI_CreateRect(10, 130, 10 + $Width, 130 + $Height)
        _WinAPI_SetBkMode($hDC, $OPAQUE);设置文字背景不透明
        _WinAPI_SetBkColor($hDC, 0xFFFFFF);背景颜色为白色
        _WinAPI_DrawText($hDC, $sText, $tRECT, $DT_LEFT);左对齐输出
        _WinAPI_SelectObject($hDC, $oldFontObj);改回原来默认字体
        _WinAPI_DeleteObject($hFont);释放字体对象
        
        _WinAPI_ReleaseDC($hWnd, $hDC)
EndFunc

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 5威望 +5 金钱 +215 贡献 +15 收起 理由
xiehuahere + 20 以前还真不知道有这么个测量函数,学习了~
楼上风云 + 15 不给分怎么能行呢?
xms77 + 50 + 5 GDI的东东要好好学习一下
haijie1223 + 30 + 5 +
afan + 5 不占位子,只+

查看全部评分

发表于 2013-5-13 18:47:23 | 显示全部楼层
开课了啊,先占个位置,I will be back~
发表于 2013-5-13 20:44:44 | 显示全部楼层
后续上的很快呀。。。。。
发表于 2013-5-13 20:48:30 | 显示全部楼层
不错,好好学学,回头做个年历。
发表于 2013-5-13 21:25:15 | 显示全部楼层
占位学习奋进,要地!
发表于 2013-5-13 21:33:51 | 显示全部楼层

回复 1# seniors

我讲都会认真跟着学,有问题就向您反馈和请教哦
发表于 2013-5-13 21:49:25 | 显示全部楼层
作业3中的阴影字体帮助中没有找到~
;~ 布置作业:
;~ 1.输出一个红字,背景透明,靠右对齐的字符串;
;~ 2.一个黄字,背景红色,垂直居中的字符串;
;~ 3.输出一个有阴影的字符串本讲源码。
#include <APIConstants.au3>
#include <WinAPIEx.au3>

GUICreate("作业", 300, 200)
$ctrlId = GUICtrlCreatePic("", 0, 0, 300, 200)
$hWnd = GUICtrlGetHandle($ctrlId)
GUISetState()
gditest()

While 1
        $Msg = GUIGetMsg()
        Switch $Msg
                Case -3
                        ExitLoop
        EndSwitch
WEnd
GUIDelete()
Exit

Func gditest()
        $hDC = _WinAPI_GetDC($hWnd)
        _WinAPI_SetBkMode($hDC, $TRANSPARENT)
        _WinAPI_SetTextColor($hDC, 0x0000FF)
        $tRECT = _WinAPI_CreateRect(10, 10, 100, 30)
        _WinAPI_DrawText($hDC, "这是作业1", $tRECT, $DT_RIGHT)
        
        $TEXTCOLOR = _WinAPI_SetTextColor($hDC, 0x00FFFF)
        _WinAPI_SetBkMode($hDC, $OPAQUE)
        _WinAPI_SetBkColor($hDC, $TEXTCOLOR)
        $tRECT = _WinAPI_CreateRect(10, 50, 100, 70)
        _WinAPI_DrawText($hDC, "这是作业2", $tRECT, $DT_VCENTER)
        
        $hFont = _WinAPI_CreateFont(18, 0, 0, 0, 600, 0, 0, 0, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $ANTIALIASED_QUALITY, $FF_MODERN, '黑体')
        _WinAPI_SelectObject($hDC, $hFont)
        _WinAPI_SetBkMode($hDC, $TRANSPARENT)        
        _WinAPI_SetTextColor($hDC, 0x0000FF)
        $tRECT = _WinAPI_CreateRect(10, 90, 100, 110)
        _WinAPI_DrawText($hDC, "这是作业3", $tRECT, $DT_VCENTER)        
        
        _WinAPI_DeleteObject($hFont)
        _WinAPI_ReleaseDC($hWnd, $hDC)
EndFunc   ;==>gditest

评分

参与人数 2金钱 +30 收起 理由
seniors + 10 及时上交作业加
user3000 + 20 ++这么快完成作业

查看全部评分

发表于 2013-5-13 22:24:20 | 显示全部楼层
mark a bookmark!
Thanks
 楼主| 发表于 2013-5-14 07:47:21 | 显示全部楼层
回复 7# haijie1223
阴影,正如蛋哥说的,要有想法
比如先写一个灰色的字,再在偏一点的位置写红色的字
这里可以用_WinAPI_OffsetRect($tRECT, -2, -2),让那个矩形范围向左移2,向上移2

更简单点,在API中本来就有一个写阴影字的函数叫做 _WinAPI_DrawShadowText
大家加油啊
发表于 2013-5-14 11:07:32 | 显示全部楼层
继续跟随大犀牛的脚步!
发表于 2013-5-14 11:33:59 | 显示全部楼层
回复 9# seniors


    这个办法我曾想到,但是我以为会有直接的办法,怕那么写出来会贻笑大方,所以没有那么做~
发表于 2013-5-14 12:09:46 | 显示全部楼层
回复 9# seniors


    多谢指点,再交一次作业。
;~ 布置作业:
;~ 1.输出一个红字,背景透明,靠右对齐的字符串;
;~ 2.一个黄字,背景红色,垂直居中的字符串;
;~ 3.输出一个有阴影的字符串本讲源码。
#include <APIConstants.au3>
#include <WinAPIEx.au3>

GUICreate("作业", 300, 200)
$ctrlId = GUICtrlCreatePic("", 0, 0, 300, 200)
$hWnd = GUICtrlGetHandle($ctrlId)
GUISetState()
gditest()

While 1
        $Msg = GUIGetMsg()
        Switch $Msg
                Case -3
                        ExitLoop
        EndSwitch
WEnd
GUIDelete()
Exit

Func gditest()
        $hDC = _WinAPI_GetDC($hWnd)
        _WinAPI_SetBkMode($hDC, $TRANSPARENT)
        _WinAPI_SetTextColor($hDC, 0x0000FF)
        $tRECT = _WinAPI_CreateRect(10, 10, 100, 30)
        _WinAPI_DrawText($hDC, "这是作业1", $tRECT, $DT_RIGHT)
        
        $TEXTCOLOR = _WinAPI_SetTextColor($hDC, 0x00FFFF)
        _WinAPI_SetBkMode($hDC, $OPAQUE)
        _WinAPI_SetBkColor($hDC, $TEXTCOLOR)
        $tRECT = _WinAPI_CreateRect(10, 50, 100, 70)
        _WinAPI_DrawText($hDC, "这是作业2", $tRECT, $DT_VCENTER)
        
        $hFont = _WinAPI_CreateFont(18, 0, 0, 0, 600, 0, 0, 0, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $ANTIALIASED_QUALITY, $FF_MODERN, '黑体')
        _WinAPI_SelectObject($hDC, $hFont)
        _WinAPI_SetBkMode($hDC, $TRANSPARENT)        
        _WinAPI_SetTextColor($hDC, 0x666666)
        $tRECT = _WinAPI_CreateRect(10, 90, 200, 110)
        _WinAPI_DrawText($hDC, "这是作业3(方法一)", $tRECT, $DT_VCENTER)        
        _WinAPI_SetTextColor($hDC, $TEXTCOLOR)
        $tRECT = _WinAPI_CreateRect(8, 88, 200, 110)
        _WinAPI_DrawText($hDC, "这是作业3(方法一)", $tRECT, $DT_VCENTER)        
        
         $tRECT = _WinAPI_CreateRect(10, 130, 200, 150)
         _WinAPI_DrawShadowText($hDC, '这是作业3(方法二)', $TEXTCOLOR, 0x666666, 2, 2, $tRECT, BitOR($DT_CENTER, $DT_SINGLELINE, $DT_VCENTER));颜色模式为RRGGBB,所以是蓝色


        _WinAPI_DeleteObject($hFont)
        _WinAPI_ReleaseDC($hWnd, $hDC)
EndFunc   ;==>gditest

评分

参与人数 1金钱 +10 收起 理由
seniors + 10 辛苦了

查看全部评分

 楼主| 发表于 2013-5-14 12:49:06 | 显示全部楼层
回复 13# haijie1223
用$TEXTCOLOR这样设置颜色,不直观,不如直接用数字
或者$RedColor = 0x0000FF

在WINAPI.au3中的多是BGR格式的颜色
WINAPIEx.au3中多是RGB格式的颜色
其实这里GDI的颜色多应该是BGR格式的,只是WINAPIEx.au3的作者帮我们转换了一下颜色格式
_WinAPI_SwitchColor()可以把RGB格式转换为BGR格式,同样可以把BGR格式转换为RGB格式
发表于 2013-5-14 12:57:02 | 显示全部楼层
回复 14# seniors


    多些指点,学习了~
发表于 2013-5-16 16:43:54 | 显示全部楼层
大师开讲真是太好,慢慢学。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-3-28 19:24 , Processed in 0.096075 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表