6. [pywin32] LineAndCurve 관련 함수 - 2

pywin32/win32gui|2021. 12. 17. 00:45

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번 으로 구분된 함수니 주석 처리를 통해 원하는 함수만 실행이 가능하실겁니다.

 

 

 

 

반응형

댓글()