猿问

Python win32 api drawText() 和 SetTextColor

我设法将一个程序组合在一起,该程序将多行字符串打印到透明背景上。我想知道是否有办法为字符串的各个部分着色不同的颜色。我知道有,但我对 win32 缺乏了解真的妨碍了我。我是否需要将文本分成两部分并调用 drawText() 或者我可以在字符串中途更改文本颜色吗?任何指向信息或解决方案的观点都会很棒。


示例: string = "用户名:用户发送的一些消息。"


我在 Stack 和其他多个网站上搜索过,但到目前为止还没有任何乐趣。我通常不会,但我已经转储了代码,因为它可以运行,你可以明白我的意思。


对于缺乏评论和代码状态,我提前道歉。


import win32api

import win32con

import win32gui

import time

import threading

from collections import deque



userAndMessage = 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 Win32


windowText = ''


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 次。


当年话下
浏览 496回答 2
2回答

茅侃侃

是的,您必须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
随时随地看视频慕课网APP

相关分类

Python
我要回答