6. [pywin32] LineAndCurve 관련 함수 - 2
1. Arc(hdc, LeftRect, TopRect, RightRect, BottomRect, XRadial1, YRadial1, XRadial2, YRadial2)
아크를 그리는 함수입니다. 타원을 그린 후 라디안 위치와 타원의 중심을 잇는 가상의 선을 이용해서 아크를 정하는 함수인 듯 합니다.
인자로는 hdc : PyHANDLE, LeftRect : int, TopRect : int, RightRect : int, BottomRect : int, XRadial1 : int, YRadial1 : int, XRadial2 : int, YRadial2 : int 가 있습니다.
hdc: device context 핸들 값입니다.
LeftRect: 아크를 그릴 타원이 외접하는 사각형의 왼쪽 위치 값입니다.
TopRect: 아크를 그릴 타원이 외접하는 사각형의 위쪽 위치 값입니다.
RightRect: 아크를 그릴 타원이 외접하는 사각형의 오른쪽 위치 값입니다.
BottomRect: 아크를 그릴 타원이 외접하는 사각형의 아래쪽 위치 값입니다.
XRadial1: 1번 라디안의 수평 위치 값
YRadial1: 1번 라디안의 수직 위치 값
XRadial2: 2번 라디안의 수평 위치 값
YRadial2: 2번 라디안의 수직 위치 값
2. ArcTo(hdc, LeftRect, TopRect, RightRect, BottomRect, XRadial1, YRadial1, XRadial2, YRadial2)
Arc() 함수와 같습니다. 추가로 아크를 그린 후 현재 위치를 아크가 끝나는 위치로 이동시킵니다.
인자는 Arc() 함수와 같으므로 생략하겠습니다.
3. AngleArc(hdc, X, Y, Radius, StartAngle, SweepAngle)
다른 방식으로 아크를 그리는 함수입니다.
인자로는 hdc : PyHANDLE, X : int, Y : int, Radius : int, StartAngle : float, SweepAngle : float 가 있습니다.
hdc: device context 핸들 값
X: 원의 중심 X 좌표
Y: 원의 중심 Y 좌표
Radius: 윈의 반지름
StartAngle: 아크를 그릴 시작 각도
SweepAngle: 아크를 끝낼 각도, 시작 각도 기준으로 상대적인 각도입니다.
4. PolyBezier(hdc, Points)
베지에 곡선을 그리는 함수입니다.
인자로는 hdc : PyHANDLE, Points : [(int,int),...] 가 있습니다.
hdc: device context 핸들 값
Points: (x,y)좌표의 튜플 값으로 이 좌표 방향으로 선이 휘어지는 듯 합니다.
- 반드시 3의 배수 + 1의 갯수여야 한다고 합니다.
5. PolyBezierTo(hdc, Points)
PolyBezier()함수와 같습니다. 추가로 베제에 곡선을 그린 후 현재 위치를 Points의 마지막 위치로 이동시킵니다.
인자로는 hdc : PyHANDLE, Points : [(int,int),...] 가 있습니다.
hdc: device context 핸들 값
Points: (x,y)좌표의 튜플 값으로 이 좌표 방향으로 선이 휘어지는 듯 합니다.
- 최소 3개의 포인트를 포함해야 한다고 합니다.
6. Polyline(hdc, Points)
연속적인 선을 그리는 함수입니다.
인자로는 hdc : PyHANDLE, Points : [(int,int),...] 가 있습니다.
hdc: device context 핸들 값
Points: (x,y)좌표의 튜플 값으로 이 좌표들 끼리 선들이 그어집니다.
7. PolylineTo(hdc, Points)
Polyline() 함수와 같습니다. 추가로 선을 그린 후 현재 위치를 Points의 마지막 위치로 이동시킵니다.
인자는 Poluline()함수와 같으므로 생략하겠습니다.
from typing import cast
import win32gui
import win32api
import win32con
# WM_CREATE가 안생겨서 만든 WM_CREATE 대용 메시지
UM_CREATE = win32con.WM_USER + 1
class WindowProcFunc:
def __init__(self):
pass
def OnCreate(self, hwnd, iMsg, wParam, lParam):
pass
def OnDestroy(self, hwnd, iMsg, wParam, lParam):
win32gui.PostQuitMessage(0)
def OnPaint(self, hwnd, iMsg, wParam, lParam):
hdc, ps = win32gui.BeginPaint(hwnd)
#hPen = win32gui.CreatePen(win32con.PS_DOT, 1, win32api.RGB(255, 0, 0))
lb = {'Style' : win32con.BS_SOLID, 'Color':win32api.RGB(255, 0, 0), 'Hatch':None}
hPen = win32gui.ExtCreatePen(win32con.PS_COSMETIC | win32con.PS_DOT, 1, lb, None)
oldPen = win32gui.SelectObject(hdc, hPen)
win32gui.SetArcDirection(hdc, win32con.AD_CLOCKWISE)
# 1번
#win32gui.Arc(hdc, 300, 10, 400, 100, 400, 10, 400, 100)
# 2번
#win32gui.MoveToEx(hdc, 350, 150)
#win32gui.ArcTo(hdc, 300, 10, 400, 100, 400, 10, 400, 100)
# 3번
win32gui.MoveToEx(hdc, 300, 100)
win32gui.AngleArc(hdc, 300, 100, 100, 30, 60)
# 4번
prePos = win32gui.MoveToEx(hdc, 10, 10)
win32gui.LineTo(hdc, 50, 50)
# 5번
polygonPos=((10, 75), (125, 30), (250, 75), (175, 150), (75, 150))
win32gui.Polyline(hdc, polygonPos)
#6번
#prePos = win32gui.MoveToEx(hdc, 400, 400)
#win32gui.PolylineTo(hdc,polygonPos)
# 7번
bezierPos=((55, 215), (75, 100), (200, 300), (275, 75))
#win32gui.PolyBezier(hdc, bezierPos)
#8번
bezierToPos=((75, 100), (200, 300), (275, 75))
prePos = win32gui.MoveToEx(hdc, 55, 215)
win32gui.PolyBezierTo(hdc, bezierToPos)
win32gui.SelectObject(hdc, oldPen)
win32gui.DeleteObject(hPen)
arcDirect = win32gui.GetArcDirection(hdc)
print(f"Arc Direct : {'시계방향' if win32con.AD_CLOCKWISE==arcDirect else '반시계방향'}")
win32gui.EndPaint(hwnd, ps)
def OnClose(self, hwnd, iMsg, wParam, lParam):
win32gui.DestroyWindow(hwnd)
wndProcFunc = WindowProcFunc()
wndProc={
UM_CREATE:wndProcFunc.OnCreate,
win32con.WM_DESTROY: wndProcFunc.OnDestroy,
win32con.WM_PAINT: wndProcFunc.OnPaint,
win32con.WM_CLOSE: wndProcFunc.OnClose,
}
def winMain():
hInstance = win32api.GetModuleHandle()
className = 'SimpleWin32'
wndClass = win32gui.WNDCLASS()
wndClass.style = win32con.CS_HREDRAW | win32con.CS_VREDRAW
wndClass.lpfnWndProc = wndProc
wndClass.hInstance = hInstance
wndClass.hIcon = win32gui.LoadIcon(0, win32con.IDI_APPLICATION)
wndClass.hCursor = win32gui.LoadCursor(0, win32con.IDC_ARROW)
wndClass.hbrBackground = win32gui.GetStockObject(win32con.WHITE_BRUSH)
wndClass.lpszClassName = className
wndClassAtom = win32gui.RegisterClass(wndClass)
hwnd = win32gui.CreateWindow(
wndClassAtom,
"title test",
win32con.WS_OVERLAPPEDWINDOW | win32con.WS_VSCROLL | win32con.WS_HSCROLL,
win32con.CW_USEDEFAULT,
win32con.CW_USEDEFAULT,
win32con.CW_USEDEFAULT,
win32con.CW_USEDEFAULT,
0,
0,
hInstance,
None)
win32gui.SendMessage(hwnd, UM_CREATE, 0, 0)
win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
win32gui.UpdateWindow(hwnd)
win32gui.PumpMessages()
return 0
if __name__ == "__main__":
x = winMain()
# 1번 ~ # 8번 으로 구분된 함수니 주석 처리를 통해 원하는 함수만 실행이 가능하실겁니다.
'pywin32 > win32gui' 카테고리의 다른 글
| 7. [pywin32] Caret 관련 함수 (0) | 2021.12.24 |
|---|---|
| 5. [pywin32] LineAndCurve 관련 함수 - 1 (0) | 2021.12.10 |
| 4. [pywin32] FontAndText 관련 함수 (0) | 2021.12.06 |
| 3. [pywin32] Windows 관련 함수 - 2 (0) | 2021.01.13 |
| 2. [pywin32] Windows 관련 함수 - 1 (0) | 2021.01.12 |








