'文本绘图函数
' FW_NORMAL=普通  FW_BOLD=加粗
'_' 斜体 As Boolean = False _
'下划线 As Boolean = False _
' 删除线 As Boolean = False _
'OutSIZE  返回字符宽度和高度
'用于简单的显示文本
'需要支持高DPI，请代码中加 AfxScaleX(X), AfxScaleY(Y)  
'返回真正开始画文本的X位置
Function TextOut1(ByVal hDC as hDC, ByVal X as Long, ByVal Y as Long, ByVal nText as String _
                           , ByVal hAlign as Long = 0 _
                           , ByVal hSize as Long = 9_
                           , ByVal hFont as String = "宋体" _
                           , ByVal Bold as Long = 400 _
                           , ByVal Italic as Byte = 0 _
                           , ByVal Underline as Byte = 0 _
                           , ByVal StrikeOut as Byte = 0 _
                           , ByVal OutSIZE as SIZE Ptr = 0 _
                           ) as Long
   
   Dim tFont as HFONT, s as SIZE
   Dim oFont as HGDIOBJ
         
   SetBkMode hDC, 1  '设置这个后，画上的字是透明的
   tFont = AfxCreateFont(hFont, hSize, -1, Bold, Italic, Underline, StrikeOut)
   oFont = SelectObject(hDC, tFont)
   GetTextExtentPoint32a hDC, StrPtr(nText), Len(nText), @s
   If hAlign > 10000 Then ' 对齐方式，=0 左对齐 >0 是显示范围的宽度，中对齐 >1万 右对齐，多出的是显示范围的宽度
      hAlign = hAlign -10000
      x = hAlign - s.cx + X
      TextOutA hDC, X, Y, StrPtr(nText), Len(nText)
      Function = x
   ElseIf hAlign > 0 Then
      x = (hAlign - s.cx) / 2 + X
      TextOutA hDC, X, Y, StrPtr(nText), Len(nText)
      Function = x
   Else
      TextOutA hDC, X, Y, StrPtr(nText), Len(nText)
      Function = X
   End If
   DeleteObject tFont
   DeleteObject oFont
   If OutSIZE Then *OutSIZE = s
   '文本绘图函数?也请参考SetTextAlign
   '返回值Long，非零表示成功，零表示失败。会设置GetLastError
   '参数 类型及说明
   'hdc Long，设备场景的句柄
   'x,y Long，绘图的起点，采用逻辑坐标
   'lpString String，欲描绘的字串
   'nCount Long，字串中要描绘的字符数量
   '注解
   '在一个路径中，如绘图背景模式是“不透明”（opaque）——请参考SetBkMode函数，那么创建的轮廓将由字符单元格减去字符构成。如背景模式为透明，轮廓就由字符的字样本身构成
   
End Function
