Python GDI 中的平方(使用 PatBLT)

Square in Python GDI (with PatBLT)

你好!

如何在 Python GDI 中创建正方形? (与 PatBLT)

所以我和 pywin32 玩得很开心。
我正在尝试制作一个正方形来制作一些有趣的 GDI 效果
这是我到目前为止尝试过的方法:

from win32gui import *
from win32api import *
from win32ui import *
from win32con import *


desk = GetDC(0)
x = 100
y = 100
x_2 = 100
y_2 = 100


for i in range(5):
    PatBlt(desk, x, y, x_2, y_2, PATINVERT)
    x += 10
    y += 10
    x_2 -= 10
    y_2 -= 10

而不是像这样:

0 0 0 0 0
0 X X X 0
0 X 0 X 0
0 X X X 0
0 0 0 0 0

我收到这样的信息:

0 0 0 0 0
0 X X X X
0 X 0 0 0
0 X 0 0 0
0 X 0 0 0

我应该会得到预期的结果...但我没有。有谁知道为什么?

根据[MS.Docs]: PatBlt function (wingdi.h),矩形在(x, y, w, h)格式,即最后2个值不是右下角坐标,而是宽高。

因此,如果将左上角的x翻译成n 像素和 w by -n,右下角的x将保持不变。要使 2 xes 相对于中心对称(x),您应该减去两倍的值:

  • 初始:

    • upper_left_x0 = i
    • lower_right_x0 = i + w0
  • 将两个 n 移向中心:

    • upper_left_x1 = i + n
    • lower_right_x1 = i + w0 - n

所以:

w1 = lower_right_x1 - upper_left_x1
   = i + w0 - n - (i + n)
   = w0 - (2 * n)

同样的事情发生在垂直轴上(y 和高度)。

code00.py:

#!/usr/bin/env python

import sys

from win32con import PATINVERT
from win32gui import GetDC, PatBlt


def draw_rects(dc, x, y, w, h, count, dx, dy):
    for i in range(count):
        PatBlt(dc, x + i * dx, y + i * dy, w - 2 * i * dx, h - 2 * i * dy, PATINVERT)


def main(*argv):
    dc = GetDC(0)
    draw_rects(dc, 100, 100, 250, 250, 13, 10, 10)


if __name__ == "__main__":
    print("Python {:s} {:03d}bit on {:s}\n".format(" ".join(elem.strip() for elem in sys.version.split("\n")),
                                                   64 if sys.maxsize > 0x100000000 else 32, sys.platform))
    rc = main(*sys.argv[1:])
    print("\nDone.")
    sys.exit(rc)

输出: