Макросы структуры MSDN COLORREF, Python - PullRequest
1 голос
/ 29 августа 2011

Я пытаюсь использовать функцию SetLayeredWindowAttributes для изменения цвета прозрачности окон.Я сделал структуру, используя модуль ctypes.Я уверен, что для правильной работы нужно использовать макрос COLORREF RGB.

Как использовать макросы в структуре, созданной с использованием ctypes?

Что я собираюсь.

import Tkinter as tk

import win32gui
import win32con

class ColorRef (ctypes.Structure) :

    _fields_ = [("byRed", ctypes.c_byte),
                ("byGreen", ctypes.c_byte),
                ("byBlue", ctypes.c_byte)]

# makes a Tkinter window
root = tk.Tk()

# a handle to that window
handle = int(root.wm_frame(), 0)

# a COLORRED struct
colorref = ColorRef(1, 1, 1)

# attempting to change the transparency color
win32gui.SetLayeredWindowAttributes(handle, colorref, 0, win32con.LWA_COLORKEY)

root.mainloop()

1 Ответ

4 голосов
/ 29 августа 2011

Три вещи:

  1. Макросы препроцессора C не существуют вне кода C.Они текстово раскрываются до фактической компиляции.
  2. COLORREF - это typedef для DWORD, а не структура.
  3. Все, что делает макрос RGB, это сдвиг битов для получения значения 0x00bbggrr.

Таким образом, код будет выглядеть так:

def RGB(r, g, b):
    r = r & 0xFF
    g = g & 0xFF
    b = b & 0xFF
    return (b << 16) | (g << 8) | r

colour = RGB(1, 1, 1)
win32gui.SetLayeredWindowAttributes(handle, colour, 0, win32con.LWA_COLORKEY)
...