Python win32 api drawText()和SetTextColor

Python win32 api drawText()和SetTextColor,python,winapi,drawtext,Python,Winapi,Drawtext,我成功地将一个程序拼凑在一起,该程序在多行上提取字符串并将其打印到透明背景上。我想知道是否有一种方法可以给绳子的各个部分涂上不同的颜色。我知道有,但我对win32缺乏了解,这真的妨碍了我。我需要将文本分成两部分并调用drawText(),还是可以在字符串的一半处更改文本颜色?任何关于信息或解决方案的观点都是很好的 示例:string=“Username:用户发送的某些消息。” 我已经在Stack和其他多个网站上搜索过了,到目前为止还没有找到任何乐趣。 我通常不会这样做,但我已经放弃了代码,因为它

我成功地将一个程序拼凑在一起,该程序在多行上提取字符串并将其打印到透明背景上。我想知道是否有一种方法可以给绳子的各个部分涂上不同的颜色。我知道有,但我对win32缺乏了解,这真的妨碍了我。我需要将文本分成两部分并调用drawText(),还是可以在字符串的一半处更改文本颜色?任何关于信息或解决方案的观点都是很好的

示例:string=“Username:用户发送的某些消息。”

我已经在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

    hWindow = win32gui.CreateWindowEx(
        exStyle,
        wndClassAtom,
        None, # WindowName
        style,
        20, # x
        900, # y
        1920, # width
        600, # height
        None, # hWndParent
        None, # hMenu
        hInstance,
        None # lpParam
)

    # Show & update the window
    win32gui.SetLayeredWindowAttributes(hWindow, 0x00ffffff, 255, 
win32con.LWA_COLORKEY | win32con.LWA_ALPHA)
    win32gui.SetWindowPos(hWindow, win32con.HWND_TOPMOST, 0, 0, 0, 0,
        win32con.SWP_NOACTIVATE | win32con.SWP_NOMOVE | win32con.SWP_NOSIZE 
| win32con.SWP_SHOWWINDOW)

    win32gui.ShowWindow(hWindow, win32con.SW_SHOWNORMAL)
    win32gui.UpdateWindow(hWindow)

    # New code: Create and start the thread
    thr = threading.Thread(target=customDraw, args=(hWindow,))
    thr.setDaemon(False)
    thr.start()

    # Dispatch messages
    win32gui.PumpMessages()


# New code: Attempt to change the text 1 second later
def customDraw(hWindow): 

    strOne      = "SomeUser: This is test line one"
    strTwo      = "SomeOtherUser: This is test line two"
    strThree    = "AndAnother: This is test line three"
    strFour     = "UserOne: This is test line four"
    strFive     = "AndAgain: This is test line five" 


    queue(strOne)
    queue(strTwo)
    queue(strThree)
    queue(strFour)
    queue(strFive) 

    global windowText
    windowText = showMessages()
    win32gui.RedrawWindow(hWindow, None, None, win32con.RDW_INVALIDATE | 
win32con.RDW_ERASE)


def wndProc(hWnd, message, wParam, lParam):
    if message == win32con.WM_PAINT:
        hDC, paintStruct = win32gui.BeginPaint(hWnd)


        fontSize = 26
        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)
        win32gui.SetTextColor(hDC,win32api.RGB(240,0,50))

        rect = win32gui.GetClientRect(hWnd)
        win32gui.DrawText(hDC,windowText,-1, rect, win32con.DT_CALCRECT); 
        win32gui.DrawText(
            hDC,
            windowText,
            -1,
            rect,
            win32con.DT_NOCLIP | win32con.DT_VCENTER | 
win32con.DT_EXPANDTABS
        )
        win32gui.EndPaint(hWnd, paintStruct)
        return 0

    elif message == win32con.WM_DESTROY:
        print('Being destroyed')
        win32gui.PostQuitMessage(0)
        return 0

    else:
        return win32gui.DefWindowProc(hWnd, message, wParam, lParam)

if __name__ == '__main__':
    main()
可能会有一些缩进的行外,这不是在程序中的情况,只是我必须按下空格键4次,每行文字


谢谢

是的,在调用
DrawText

您使用
DT\u CALCRECT
选项正确地调用了
DrawText
。这不会绘制任何内容,它只是计算矩形的高度(基于宽度…)Python的
DrawText
将为计算出的矩形返回一个元组

然后再次调用
DrawText
,使用相同的文本格式,不带
DT\u 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

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

您使用
DT\u CALCRECT
选项正确地调用了
DrawText
。这不会绘制任何内容,它只是计算矩形的高度(基于宽度…)Python的
DrawText
将为计算出的矩形返回一个元组

然后再次调用
DrawText
,使用相同的文本格式,不带
DT\u 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

@Barmak,这是我从你的帮助中得到的代码…我将你标记为正确的,如果你没有发布,我仍然会为此而挣扎。如果你运行它,你可以看到它的工作,你的一个传奇

import win32api
import win32con
import win32gui
import time
import threading
from collections import deque



messagePrompt = ' :'
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

# New code: Define globaL
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

    hWindow = win32gui.CreateWindowEx(
        exStyle,
        wndClassAtom,
        None, # WindowName
        style,
        20, # x
        900, # y
        1920, # width
        600, # height
        None, # hWndParent
        None, # hMenu
        hInstance,
        None # lpParam
    )

    # Show & update the window
    win32gui.SetLayeredWindowAttributes(hWindow, 0x00ffffff, 255, 
win32con.LWA_COLORKEY | win32con.LWA_ALPHA)
    win32gui.SetWindowPos(hWindow, win32con.HWND_TOPMOST, 0, 0, 0, 0,
        win32con.SWP_NOACTIVATE | win32con.SWP_NOMOVE | win32con.SWP_NOSIZE | 
win32con.SWP_SHOWWINDOW)

    win32gui.ShowWindow(hWindow, win32con.SW_SHOWNORMAL)
    win32gui.UpdateWindow(hWindow)

    thr = threading.Thread(target=customDraw, args=(hWindow,))
    thr.setDaemon(False)
    thr.start()

    # Dispatch messages
    win32gui.PumpMessages()

def customDraw(hWindow):
    win32gui.RedrawWindow(hWindow, None, None, win32con.RDW_INVALIDATE | 
win32con.RDW_ERASE)



queue(("Dave: ", "Daves message was important"))
queue(("Chris: ", "Chris is asleep again"))
queue(("Suzy: ", "Suzy has had way to much cake"))
queue(("Sarah: ", "Sarah is shockingly beautiful"))
queue(("Steve: ", "Steve likes to eat dog treats")) 


def wndProc(hWnd, message, wParam, lParam):
    textFormat = win32con.DT_NOCLIP | win32con.DT_VCENTER | win32con.DT_EXPANDTABS
    if message == win32con.WM_PAINT:
        hDC, paintStruct = win32gui.BeginPaint(hWnd)
        fontSize = 20

        lf = win32gui.LOGFONT()
        lf.lfFaceName = "Times New Roman"
        lf.lfHeight = fontSize
        lf.lfWeight = 300

        lf.lfQuality = win32con.NONANTIALIASED_QUALITY
        hf = win32gui.CreateFontIndirect(lf)
        win32gui.SelectObject(hDC, hf)

        if len(userAndMessage) > 4:
            win32gui.SetTextColor(hDC,win32api.RGB(255,0,0))
            rect = win32gui.GetClientRect(hWnd)
            drawRect = win32gui.DrawText(hDC,userAndMessage[0][0],-1, rect, 
win32con.DT_CALCRECT); 
            win32gui.DrawText(hDC, userAndMessage[0][0], -1, rect, textFormat)

            win32gui.SetTextColor(hDC,win32api.RGB(240,240,240))
            drawrect = win32gui.DrawText(hDC, userAndMessage[0][1], -1, rect, 
win32con.DT_CALCRECT);
            rect = (drawRect[1][0] + drawRect[1][2], drawRect[1][1], drawRect[1][2], 
drawRect[1][3])
            win32gui.DrawText(hDC, userAndMessage[0][1], -1, rect, textFormat)


#####################################################################################
            win32gui.SetTextColor(hDC,win32api.RGB(255,0,0))
            rect = (0, drawRect[1][1] + drawRect[1][3], drawRect[1][2], drawRect[1] 
[3])
            drawRect = win32gui.DrawText(hDC,userAndMessage[1][0],-1, rect, 
win32con.DT_CALCRECT); 
            win32gui.DrawText(hDC, userAndMessage[1][0], -1, rect, textFormat)

            win32gui.SetTextColor(hDC,win32api.RGB(240,240,240))
            drawrect = win32gui.DrawText(hDC, userAndMessage[1][1], -1, rect, 
win32con.DT_CALCRECT);
            rect = (drawRect[1][0] + drawRect[1][2], drawRect[1][1], drawRect[1][2], 
drawRect[1][3])
            win32gui.DrawText(hDC, userAndMessage[1][1], -1, rect, textFormat)


#####################################################################################
            win32gui.SetTextColor(hDC,win32api.RGB(255,0,0))
            rect = (0, drawRect[1][1] + (drawRect[1][3] // 2), drawRect[1][2], 
drawRect[1][3])
            drawRect = win32gui.DrawText(hDC,userAndMessage[2][0],-1, rect, 
win32con.DT_CALCRECT); 
            win32gui.DrawText(hDC, userAndMessage[2][0], -1, rect, textFormat)

            win32gui.SetTextColor(hDC,win32api.RGB(240,240,240))
            drawrect = win32gui.DrawText(hDC, userAndMessage[2][1], -1, rect, 
win32con.DT_CALCRECT);
            rect = (drawRect[1][0] + drawRect[1][2], drawRect[1][1], drawRect[1][2], 
drawRect[1][3])
            win32gui.DrawText(hDC, userAndMessage[2][1], -1, rect, textFormat)

        #####################################################################################
            win32gui.SetTextColor(hDC,win32api.RGB(255,0,0))
            rect = (0, drawRect[1][1] + (drawRect[1][3] // 3), drawRect[1][2], 
drawRect[1][3])
            drawRect = win32gui.DrawText(hDC,userAndMessage[3][0],-1, rect, 
win32con.DT_CALCRECT); 
            win32gui.DrawText(hDC, userAndMessage[3][0], -1, rect, textFormat)

            win32gui.SetTextColor(hDC,win32api.RGB(240,240,240))
            drawrect = win32gui.DrawText(hDC, userAndMessage[3][1], -1, rect, 
win32con.DT_CALCRECT);
            rect = (drawRect[1][0] + drawRect[1][2], drawRect[1][1], drawRect[1][2], 
drawRect[1][3])
            win32gui.DrawText(hDC, userAndMessage[3][1], -1, rect, textFormat)


#####################################################################################
            win32gui.SetTextColor(hDC,win32api.RGB(255,0,0))
            rect = (0, drawRect[1][1] + (drawRect[1][3] // 4), drawRect[1][2], 
drawRect[1][3])
            drawRect = win32gui.DrawText(hDC,userAndMessage[4][0],-1, rect, 
win32con.DT_CALCRECT); 
            win32gui.DrawText(hDC, userAndMessage[4][0], -1, rect, textFormat)

            win32gui.SetTextColor(hDC,win32api.RGB(240,240,240))
            drawrect = win32gui.DrawText(hDC, userAndMessage[4][1], -1, rect, 
win32con.DT_CALCRECT);
            rect = (drawRect[1][0] + drawRect[1][2], drawRect[1][1], drawRect[1][2], 
drawRect[1][3])
            win32gui.DrawText(hDC, userAndMessage[4][1], -1, rect, textFormat)

            win32gui.EndPaint(hWnd, paintStruct)
            return 0

    elif message == win32con.WM_DESTROY:
        print('Being destroyed')
        win32gui.PostQuitMessage(0)
        return 0

    else:
        return win32gui.DefWindowProc(hWnd, message, wParam, lParam)

if __name__ == '__main__':
    main()

再次感谢你,乌龟,这是我从你的帮助中得到的代码…我将你标记为正确,如果你没有发布,我仍然会为此而挣扎。如果你运行它,你可以看到它的工作,你的一个传奇

import win32api
import win32con
import win32gui
import time
import threading
from collections import deque



messagePrompt = ' :'
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

# New code: Define globaL
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

    hWindow = win32gui.CreateWindowEx(
        exStyle,
        wndClassAtom,
        None, # WindowName
        style,
        20, # x
        900, # y
        1920, # width
        600, # height
        None, # hWndParent
        None, # hMenu
        hInstance,
        None # lpParam
    )

    # Show & update the window
    win32gui.SetLayeredWindowAttributes(hWindow, 0x00ffffff, 255, 
win32con.LWA_COLORKEY | win32con.LWA_ALPHA)
    win32gui.SetWindowPos(hWindow, win32con.HWND_TOPMOST, 0, 0, 0, 0,
        win32con.SWP_NOACTIVATE | win32con.SWP_NOMOVE | win32con.SWP_NOSIZE | 
win32con.SWP_SHOWWINDOW)

    win32gui.ShowWindow(hWindow, win32con.SW_SHOWNORMAL)
    win32gui.UpdateWindow(hWindow)

    thr = threading.Thread(target=customDraw, args=(hWindow,))
    thr.setDaemon(False)
    thr.start()

    # Dispatch messages
    win32gui.PumpMessages()

def customDraw(hWindow):
    win32gui.RedrawWindow(hWindow, None, None, win32con.RDW_INVALIDATE | 
win32con.RDW_ERASE)



queue(("Dave: ", "Daves message was important"))
queue(("Chris: ", "Chris is asleep again"))
queue(("Suzy: ", "Suzy has had way to much cake"))
queue(("Sarah: ", "Sarah is shockingly beautiful"))
queue(("Steve: ", "Steve likes to eat dog treats")) 


def wndProc(hWnd, message, wParam, lParam):
    textFormat = win32con.DT_NOCLIP | win32con.DT_VCENTER | win32con.DT_EXPANDTABS
    if message == win32con.WM_PAINT:
        hDC, paintStruct = win32gui.BeginPaint(hWnd)
        fontSize = 20

        lf = win32gui.LOGFONT()
        lf.lfFaceName = "Times New Roman"
        lf.lfHeight = fontSize
        lf.lfWeight = 300

        lf.lfQuality = win32con.NONANTIALIASED_QUALITY
        hf = win32gui.CreateFontIndirect(lf)
        win32gui.SelectObject(hDC, hf)

        if len(userAndMessage) > 4:
            win32gui.SetTextColor(hDC,win32api.RGB(255,0,0))
            rect = win32gui.GetClientRect(hWnd)
            drawRect = win32gui.DrawText(hDC,userAndMessage[0][0],-1, rect, 
win32con.DT_CALCRECT); 
            win32gui.DrawText(hDC, userAndMessage[0][0], -1, rect, textFormat)

            win32gui.SetTextColor(hDC,win32api.RGB(240,240,240))
            drawrect = win32gui.DrawText(hDC, userAndMessage[0][1], -1, rect, 
win32con.DT_CALCRECT);
            rect = (drawRect[1][0] + drawRect[1][2], drawRect[1][1], drawRect[1][2], 
drawRect[1][3])
            win32gui.DrawText(hDC, userAndMessage[0][1], -1, rect, textFormat)


#####################################################################################
            win32gui.SetTextColor(hDC,win32api.RGB(255,0,0))
            rect = (0, drawRect[1][1] + drawRect[1][3], drawRect[1][2], drawRect[1] 
[3])
            drawRect = win32gui.DrawText(hDC,userAndMessage[1][0],-1, rect, 
win32con.DT_CALCRECT); 
            win32gui.DrawText(hDC, userAndMessage[1][0], -1, rect, textFormat)

            win32gui.SetTextColor(hDC,win32api.RGB(240,240,240))
            drawrect = win32gui.DrawText(hDC, userAndMessage[1][1], -1, rect, 
win32con.DT_CALCRECT);
            rect = (drawRect[1][0] + drawRect[1][2], drawRect[1][1], drawRect[1][2], 
drawRect[1][3])
            win32gui.DrawText(hDC, userAndMessage[1][1], -1, rect, textFormat)


#####################################################################################
            win32gui.SetTextColor(hDC,win32api.RGB(255,0,0))
            rect = (0, drawRect[1][1] + (drawRect[1][3] // 2), drawRect[1][2], 
drawRect[1][3])
            drawRect = win32gui.DrawText(hDC,userAndMessage[2][0],-1, rect, 
win32con.DT_CALCRECT); 
            win32gui.DrawText(hDC, userAndMessage[2][0], -1, rect, textFormat)

            win32gui.SetTextColor(hDC,win32api.RGB(240,240,240))
            drawrect = win32gui.DrawText(hDC, userAndMessage[2][1], -1, rect, 
win32con.DT_CALCRECT);
            rect = (drawRect[1][0] + drawRect[1][2], drawRect[1][1], drawRect[1][2], 
drawRect[1][3])
            win32gui.DrawText(hDC, userAndMessage[2][1], -1, rect, textFormat)

        #####################################################################################
            win32gui.SetTextColor(hDC,win32api.RGB(255,0,0))
            rect = (0, drawRect[1][1] + (drawRect[1][3] // 3), drawRect[1][2], 
drawRect[1][3])
            drawRect = win32gui.DrawText(hDC,userAndMessage[3][0],-1, rect, 
win32con.DT_CALCRECT); 
            win32gui.DrawText(hDC, userAndMessage[3][0], -1, rect, textFormat)

            win32gui.SetTextColor(hDC,win32api.RGB(240,240,240))
            drawrect = win32gui.DrawText(hDC, userAndMessage[3][1], -1, rect, 
win32con.DT_CALCRECT);
            rect = (drawRect[1][0] + drawRect[1][2], drawRect[1][1], drawRect[1][2], 
drawRect[1][3])
            win32gui.DrawText(hDC, userAndMessage[3][1], -1, rect, textFormat)


#####################################################################################
            win32gui.SetTextColor(hDC,win32api.RGB(255,0,0))
            rect = (0, drawRect[1][1] + (drawRect[1][3] // 4), drawRect[1][2], 
drawRect[1][3])
            drawRect = win32gui.DrawText(hDC,userAndMessage[4][0],-1, rect, 
win32con.DT_CALCRECT); 
            win32gui.DrawText(hDC, userAndMessage[4][0], -1, rect, textFormat)

            win32gui.SetTextColor(hDC,win32api.RGB(240,240,240))
            drawrect = win32gui.DrawText(hDC, userAndMessage[4][1], -1, rect, 
win32con.DT_CALCRECT);
            rect = (drawRect[1][0] + drawRect[1][2], drawRect[1][1], drawRect[1][2], 
drawRect[1][3])
            win32gui.DrawText(hDC, userAndMessage[4][1], -1, rect, textFormat)

            win32gui.EndPaint(hWnd, paintStruct)
            return 0

    elif message == win32con.WM_DESTROY:
        print('Being destroyed')
        win32gui.PostQuitMessage(0)
        return 0

    else:
        return win32gui.DefWindowProc(hWnd, message, wParam, lParam)

if __name__ == '__main__':
    main()

再次感谢,乌龟

嗨,巴尔马克,谢谢你的回复。差不多了,我很确定我能把它变成我需要的东西……你说得对,它会变得非常混乱,但应用程序的其余部分已经用python编写了。我有同样的想法把它全部移植到C++,但是如果我能帮助它,我真的不想…我需要有一个单独的行,上面有两种颜色,所以在用户名上面的示例字符串是一种颜色,文本是另一种颜色……当我在工作后得到一分钟的时候,我会搞得一团糟,当我完成它时,接受你的答案。再次感谢,Turtlegingly close现在…我将在一分钟内弹出我的代码…感谢您的帮助,我似乎应该能够让它工作!明白了,你的回答帮助我得到了他们的答案,所以我添加了你的评论作为正确的。谢谢你的帮助!:)“我也有同样的想法把它移植到c++上。”事实上,我并没有推荐你应该使用哪种语言,因为我不知道你的项目。我建议在C++中做一个测试程序,然后从C++转换为Python。这可能会更容易,也可能不会。嗨,巴马克,谢谢你的回复。差不多了,我很确定我能把它变成我需要的东西……你说得对,它会变得非常混乱,但应用程序的其余部分已经用python编写了。我有同样的想法把它全部移植到C++,但是如果我能帮助它,我真的不想…我需要有一个单独的行,上面有两种颜色,所以在用户名上面的示例字符串是一种颜色,文本是另一种颜色……当我在工作后得到一分钟的时候,我会搞得一团糟,当我完成它时,接受你的答案。再次感谢,Turtlegingly close现在…我将在一分钟内弹出我的代码…感谢您的帮助,我似乎应该能够让它工作!明白了,你的回答帮助我得到了他们的答案,所以我添加了你的评论作为正确的。谢谢你的帮助!:)“我也有同样的想法把它移植到c++上。”事实上,我并没有推荐你应该使用哪种语言,因为我不知道你的项目。我建议在C++中做一个测试程序,然后从C++转换为Python。这可能更容易,也可能不容易。