为了账号安全,请及时绑定邮箱和手机立即绑定

Python win32 api drawText() 和 SetTextColor

Python win32 api drawText() 和 SetTextColor

当年话下 2021-10-26 18:19:52
我设法将一个程序组合在一起,该程序将多行字符串打印到透明背景上。我想知道是否有办法为字符串的各个部分着色不同的颜色。我知道有,但我对 win32 缺乏了解真的妨碍了我。我是否需要将文本分成两部分并调用 drawText() 或者我可以在字符串中途更改文本颜色吗?任何指向信息或解决方案的观点都会很棒。示例: string = "用户名:用户发送的一些消息。"我在 Stack 和其他多个网站上搜索过,但到目前为止还没有任何乐趣。我通常不会,但我已经转储了代码,因为它可以运行,你可以明白我的意思。对于缺乏评论和代码状态,我提前道歉。import win32apiimport win32conimport win32guiimport timeimport threadingfrom collections import dequeuserAndMessage = deque()def queue(message):    userAndMessage.append(message)def getQueue():    return userAndMessage;def dequeue():    return userAndMessage.popleft()def cleanMessage(message):    return message.split("\r\n")[0]def showMessages():    return userAndMessage[0] + "\n" + userAndMessage[1] + "\n" + userAndMessage[2] + "\n" + userAndMessage[3] + "\n" + userAndMessage[4]#Code example modified from:#Christophe Keller#Hello World in Python using Win32windowText = ''def main():    #get instance handle    hInstance = win32api.GetModuleHandle()    # the class name    className = 'SimpleWin32'    # create and initialize window class    wndClass                = win32gui.WNDCLASS()    wndClass.style          = win32con.CS_HREDRAW | win32con.CS_VREDRAW    wndClass.lpfnWndProc    = wndProc    wndClass.hInstance      = hInstance    wndClass.hCursor        = win32gui.LoadCursor(None, win32con.IDC_ARROW)    wndClass.hbrBackground  = win32gui.GetStockObject(win32con.WHITE_BRUSH)    wndClass.lpszClassName  = className    # register window class    wndClassAtom = None    try:        wndClassAtom = win32gui.RegisterClass(wndClass)    except Exception as e:        print (e)        raise e    exStyle = win32con.WS_EX_COMPOSITED | win32con.WS_EX_LAYERED | win32con.WS_EX_NOACTIVATE | win32con.WS_EX_TOPMOST | win32con.WS_EX_TRANSPARENT    style = win32con.WS_DISABLED | win32con.WS_POPUP | win32con.WS_VISIBLE可能有一些不合时宜的缩进,在程序中不是这种情况,只是我必须在每行文本上按空格键 4 次。
查看完整描述

2 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

是的,您必须SetTextColor在调用之前使用更改颜色DrawText


你是正确的调用DrawText与DT_CALCRECT选择。这不会绘制任何东西,它只是计算矩形的高度(基于宽度...)PythonDrawText将返回一个计算矩形的元组。


然后DrawText再次调用,使用相同的文本格式,没有DT_CALCRECT标志。然后偏移矩形,改变颜色,并绘制下一个文本。


请注意,这在 pywin32 中会变得非常混乱,首先在 C/C++ 中尝试它可能会更容易。


if message == win32con.WM_PAINT:

    hDC, paintStruct = win32gui.BeginPaint(hWnd)


    fontSize = 16

    lf = win32gui.LOGFONT()

    lf.lfFaceName = "Stencil"

    lf.lfHeight = fontSize

    lf.lfWeight = 600


    lf.lfQuality = win32con.NONANTIALIASED_QUALITY

    hf = win32gui.CreateFontIndirect(lf)

    win32gui.SelectObject(hDC, hf)


    text1 = 'line1'

    text2 = 'line2'

    text3 = 'line3'

    rect = win32gui.GetClientRect(hWnd)


    textformat = win32con.DT_LEFT | win32con.DT_TOP


    win32gui.SetTextColor(hDC,win32api.RGB(255,0,0))

    drawrect = win32gui.DrawText(hDC, text1, -1, rect, textformat | win32con.DT_CALCRECT);

    win32gui.DrawText(hDC, text1, -1, rect, textformat)


    l = drawrect[1][0]

    t = drawrect[1][1]

    r = drawrect[1][2]

    b = drawrect[1][3]

    height = b - t

    rect = (l, t + height, r, b + height)


    win32gui.SetTextColor(hDC,win32api.RGB(0,255,0))

    drawrect = win32gui.DrawText(hDC, text2, -1, rect, textformat | win32con.DT_CALCRECT);

    win32gui.DrawText(hDC, text2, -1, rect, textformat)


    l = drawrect[1][0]

    t = drawrect[1][1]

    r = drawrect[1][2]

    b = drawrect[1][3]

    height = b - t

    rect = (l, t + height, r, b + height)


    win32gui.SetTextColor(hDC,win32api.RGB(0,0,255))

    drawrect = win32gui.DrawText(hDC, text3, -1, rect, textformat | win32con.DT_CALCRECT);

    win32gui.DrawText(hDC, text3, -1, rect, textformat)


    win32gui.EndPaint(hWnd, paintStruct)

    return 0



查看完整回答
反对 回复 2021-10-26
  • 2 回答
  • 0 关注
  • 495 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信