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)
输出:
你好!
如何在 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)
输出: