7. [pywin32] Caret 관련 함수

pywin32/win32gui|2021. 12. 24. 00:36

CreateCaret(hWnd, hBitmap, nWidth, nHeight)

새로운 문자가 출력될 위치를 알려주는 Caret 객체를 만드는 함수입니다.

 

인자로는 hWnd : int, hBitmap : PyGdiHANDLE, nWidth : int, nHeight : int 가 있습니다.

 

hWnd: 윈도우 핸들 값

 

hBitmap: Caret 모양으로 삼을 비트맵 핸들 값, None으로 둘 시 Solid 형태의 Caret이 만들어 집니다.

 

nWidth: Caret의 넓이

 

nHeight: Caret의 높이

 

 

SetCaretPos(x, y)

Caret의 위치를 설정하는 함수입니다.

 

인자로는 x : int, y : int 가 있습니다.

 

x: x 좌표

 

y: y 좌표

 

 

int,int = GetCaretPos()

Caret의 위치를 리턴하는 함수입니다.

 

인자는 없으며, 리턴값으로 (x, y) 좌표를 리턴합니다.

 

 

ShowCaret(hWnd)

Caret을 보여주는 함수입니다.

 

인자로는 hWnd : PyHANDLE 가 있습니다.

 

hWnd: 윈도우의 핸들 값

 

 

HideCaret(hWnd)

Caret을 숨기는 함수입니다.

 

인자로는 hWnd : PyHANDLE 가 있습니다.

 

hWnd: 윈도우의 핸들 값

 

 

DestroyCaret()

Caret 객체를 파괴하는 함수입니다.

 

인자와 리턴값은 없습니다.

 

import win32gui
import win32api
import win32con

# WM_CREATE가 안생겨서 만든 WM_CREATE 대용 메시지
UM_CREATE = win32con.WM_USER + 1


class WindowProcFunc:
    def __init__(self):
        self.str=""
        pass

    def OnCreate(self, hwnd, iMsg, wParam, lParam):
        win32gui.CreateCaret(hwnd, None, 5, 15)

        
    def OnDestroy(self, hwnd, iMsg, wParam, lParam):
        win32gui.PostQuitMessage(0)


    def OnPaint(self, hwnd, iMsg, wParam, lParam):
        hdc, ps = win32gui.BeginPaint(hwnd)
        cx, cy = win32gui.GetTextExtentPoint32(hdc, self.str)
        win32gui.ExtTextOut(hdc, 0, 0, win32con.ETO_OPAQUE, None, self.str, None)

        win32gui.SetCaretPos(cx, 0)
        caretPosX, caretPosY = win32gui.GetCaretPos()
        print(f"caretPos : {caretPosX}, {caretPosY}")
        
        win32gui.ShowCaret(hwnd)
        win32gui.EndPaint(hwnd, ps)
        
    def OnChar(self, hwnd, iMsg, wParam, lParam):

        if wParam == win32con.VK_BACK:
            self.str = self.str[:-1]
        else:
            self.str+=chr(wParam)

        win32gui.InvalidateRgn(hwnd, None, win32con.TRUE)

    def OnClose(self, hwnd, iMsg, wParam, lParam):
        win32gui.HideCaret(hwnd)
        win32gui.DestroyCaret()
        win32gui.DestroyWindow(hwnd)


wndProcFunc = WindowProcFunc()

wndProc={
    UM_CREATE:wndProcFunc.OnCreate,
    win32con.WM_DESTROY: wndProcFunc.OnDestroy,
    win32con.WM_PAINT: wndProcFunc.OnPaint,
    win32con.WM_CHAR: wndProcFunc.OnChar,
    win32con.WM_CLOSE: wndProcFunc.OnClose,
}

def winMain():
    hInstance = win32api.GetModuleHandle()


    className = 'SimpleWin32'

    wndClass                = win32gui.WNDCLASS()
    wndClass.style          = win32con.CS_HREDRAW | win32con.CS_VREDRAW | win32con.CS_OWNDC
    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.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()

 

 

반응형

댓글()

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

 

 

 

 

반응형

댓글()

5. [pywin32] LineAndCurve 관련 함수 - 1

pywin32/win32gui|2021. 12. 10. 00:40

1. PyGdiHANDLE = CreatePen(PenStyle, Width , Color )

선 그리기에 사용할 Pen 스타일을 지정해서 Pen 핸들값을 만드는 함수입니다.

 

인자로는 PenStyle : int, Width : int, Color : int 가 있습니다.

 

PenSytle: Pen의 스타일을 지정합니다.

 * 참조: https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createpen

 

Width: Pen의 굵기를 지정합니다. 0으로 설정 시 1픽셀의 굵기를 갖습니다.

 

Color: Pen의 색을 지정합니다. win32api.RGB() 함수를 사용합니다.

 

리턴값은 Pen 핸들값입니다.

 

 

2. PyHANDLE = ExtCreatePen(PenStyle, Width , lb , Style )

CreatePen()함수처럼 Pen 스타일을 만드는 함수입니다. CreatePen()함수보다 여러 설정값을 가질 수 있습니다.

 

인자로는 PenStyle : int, Width : intlb : PyLOGBRUSH, Style=None : (int, ...) 가 있습니다.

 

PenStyle: Pen의 스타일을 지정합니다. 반드시 win32con.PS_GEOMETRIC, win32con.PS_COSMETIC 둘 중 하나를 포함해야 합니다. 그런데 두 스타일의 차이가 아직 이해가 안가더군요...

 * 참조: https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-extcreatepen

 

Width: Pen의 굵기를 지정합니다. PenStyle에 win32con.PS_COSMETIC 이 있으면, 반드시 1이여햐 한다고 합니다.

 

lb: PyLOGBRUSH 라는 사전형 값을 가집니다. Pen 에 지정할 Brush 값을 나타내는 듯 합니다. PenStyle에 win32con.PS_COSMETIC 이 있으면, 'Style'이 반드시 win32con.BS_SOLID 여야 합니다.

 * PyLOGBRUSH (사전형)

  - 'Style': Brush 스타일 지정

  - 'Color': win32api.RGB() 함수로 지정하는 색

  - 'Hatch': Hatch 스타일 지정(Hatch는 무늬를 뜻하는 듯 합니다.), BS_SOLID와 BS_HOLLOW에는 필요없는 값이라고 합니다.

   * 참조: https://docs.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-logbrush

 

Style: PS_USERSTYLE 일 때만 사용하는 값으로 사용자 지정 스타일을 줄 떄 사용되는 값인 듯 합니다.

 

리턴값은 Pen 핸들값입니다.

 

 

3. HGDIOBJ = SelectObject(hdc, object )

위의 CreatePen()함수처럼 GDI 핸들을 만든 후 SelectObject()함수를 사용해야 프로그램에 적용할 수 있습니다.

 

인자로는 hdc : int, object : int 가 있습니다.

 

hdc: device context 핸들 값입니다.

 

object: 적용할 GDI 핸들값입니다.

 

리턴값은 새로운 GDI 객체를 적용하기 전 사용하고 있던 GDI 객체입니다. 나중에 GDI 객체를 다시 되돌리고 싶을 때 사용합니다.

 

 

4. DeleteObject(handle)

사용하지 않는 GDI 핸들을 삭제하는 함수입니다.

 

인자로는 handle : PyGdiHANDLE 가 있습니다.

 

handle: 삭제할 GDI 핸들 값입니다.

 

 

5. int = SetArcDirection(hdc, ArcDirection )

도형을 그릴 때 그리는 방향을 지정하는 함수입니다. 기본값은 반시계 방향입니다.

 

인자로는 hdc : PyHANDLE, ArcDirection : int 가 있습니다.

 

hdc: device context 핸들값

 

ArcDirection: 그리기 방향. 아래의 값 둘 중 하나를 설정가능합니다.

 - win32con.AD_COUNTERCLOCKWISE: 반시계 방향

 - win32con.AD_CLOCKWISE: 시계 방향

 

리턴값으로는 기존의 방향 값을 리턴합니다.

 

 

6. int = GetArcDirection(hdc)

현재 그리기 방향이 무엇인지 반환하는 함수입니다.

 

인자로는 hdc : PyHANDLE가 있습니다.

 

hdc: device context 핸들값

 

리턴값으로는 현재 설정된 그리기 방향 값을 리턴합니다.

 

 

7. (int, int) = MoveToEx(hdc, X , Y )

현재의 위치를 이동시켜줍니다. 선이나 도형을 그릴 때 어디에서 부터 그릴 것인지를 정할 수 있습니다. (보통 왼쪽상단에서 시작합니다.)

 

인자로는 hdc : PyHANDLE, X : int, Y : int 가 있습니다.

 

hdc: device context 핸들값

 

X: 이동할 x 좌표 (왼쪽상단 위 기준, 오른쪽방향)

 

Y: 이동할 y 좌표 (왼쪽상단 위 기준, 아래방향)

 

리턴값은 기존의 x,y 좌표입니다.

 

 

8. LineTo(hdc, XEnd, YEnd)

현재위치에서 지정된 위치까지 선을 그리는 함수입니다. 끝에 To 가 들어간 함수이므로, MoveToEx()함수처럼 위치를 이동시켜주는 역할도 합니다. 현재위치에서 지정된 위치까지 선을 그리고, 현재위치가 지정된 위치로 이동하게 됩니다. 그래서 LinTo()함수를 계속 호출하면 선이 계속 이어지게 됩니다.

 

인자로는 hdc : PyHANDLE, XEnd : int, YEnd : int 가 있습니다.

 

hdc: device context 핸들값

 

X: 지정할 위치의 x 좌표 (왼쪽상단 위 기준, 오른쪽방향)

 

Y: 지정할 위치의 y 좌표 (왼쪽상단 위 기준, 아래방향)

 

 

이 외에도 추가적인 함수에 대한 설명은 2부에서 하고, 일단 예제를 올려두겠습니다. 번호 별로 주석처리 및 해제를 해보시면서 실행시켜보시면 됩니다.

 

 

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()

 

 

 

 

반응형

댓글()

4. [pywin32] FontAndText 관련 함수

pywin32/win32gui|2021. 12. 6. 20:18

1. hdc, paintstruct = BeginPaint()

 

윈도우에 그림을 그리기 위한 화면 영역을 가져오는 함수입니다.

 

인자는 없으며, 리턴값으로 hdc, paintstruct 를 갖습니다.

 

hdc: device context의 핸들 값

paintstruct: 클라이언트 영역의 정보를 포함하는 구조체

 

2. PyLOGFONT = LOGFONT()

 

LOGFONT 객체를 만들기 위한 함수입니다.

LOGFONT는 폰트 설정을 위한 값들을 저장한 구조체입니다.

 

인자는 없으며, 리턴값으로 PyLOGFONT 구조체를 갖습니다.

 

* 참조: http://timgolden.me.uk/pywin32-docs/PyLOGFONT.html

* 참조: https://docs.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-logfonta

 

3. PyGdiHandle = CreateFontIndirect(lplf)

 

논리적 폰트를 생성하는 함수입니다.

 

인자로는 lplf : PyLOGFONT 가 있습니다.

 

lplf: LOGFONT()함수로 만든 PyLOGFONT 객체입니다.

 

리턴값으로 폰트 객체를 리턴합니다.

 

 

4. int = SetTextAlign(hdc, Mode )

 

텍스트의 가로, 세로 정렬을 설정하는 함수입니다.

 

인자로는 hdc : PyHANDLE, Mode : int 가 있습니다.

 

hdc: device context의 핸들 값

Mode: 어떤식으로 정렬할지 설정 값(win32con.TA_*)

* 참조: https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-settextalign

 

리턴값은 이전 TextAlign 설정 값입니다.

 

 

5. int = SetTextCharacterExtra(hdc, CharExtra )

 

문자간의 공백을 설정하는 함수입니다.

 

인자로는 hdc : PyHANDLE, CharExtra : int 가 있습니다.

 

hdc: device context의 핸들 값

CharExtra: 문자간 공백 값

 

리턴값으로는 이전 공백 설정 값입니다.

 

 

6. int = SetTextColor(hdc, color )

 

텍스트의 색을 변경하는 함수입니다.

 

인자로는 hdc : int, color : int 가 있습니다.

 

hdc: device context의 핸들 값

color: color 값으로 win32api.RGB()함수의 리턴값을 사용

 

리턴값으로는 이전 텍스트 color 값입니다.

 

 

7. int = GetTextAlign(hdc)

 

텍스트 정렬 값을 반환하는 함수입니다.

 

인자로는 hdc : int 가 있습니다.

 

hdc: device context의 핸들 값

 

리턴값으로는 현재 텍스트 정렬 값입니다.

 

 

8. int = GetTextCharacterExtra(hdc)

 

텍스트 공백 값을 반환하는 함수입니다.

 

인자로는 hdc : int 가 있습니다.

 

hdc: device context의 핸들 값

 

리턴값으로는 현재 텍스트 공백 값입니다.

 

 

9. int = GetTextColor(hdc)

 

텍스트 color 값을 반환하는 함수입니다.

 

인자로는 hdc : int 가 있습니다.

 

hdc: device context의 핸들 값

 

리턴값으로는 현재 텍스트 color 값입니다.

 

10. cx, cy = GetTextExtentPoint32(hdc, str )

 

텍스트의 높이와 길이를 계산하는 함수입니다.

 

인자로는 hdc : PyHANDLE, str : string 가 있습니다.

 

hdc: device context의 핸들 값

str: 문자열

 

리턴값으로는 cx, cy가 있으며, 문자열의 길이와 높이 입니다.

 

 

11. PyUnicode = GetTextFace(hdc)

 

현재 텍스트의 폰트 이름을 반환합니다.

 

인자로는 hdc : int 가 있습니다.

 

hdc: device context의 핸들 값

 

리턴값으로는 현재 텍스트 폰트명입니다.

 

 

12. dict = GetTextMetrics()

 

폰트의 정보를 반환하는 함수입니다.

 

인자는 없으며, 리턴값으로는 폰트의 정보를 사전형으로 갖습니다.

 

 

13. int = ExtTextOut(hdc, int , int , int , rect , string , tuple )

 

화면에 텍스트를 출력하는 함수입니다. 근데 아래의 DrawText를 쓰는게 더 좋아보입니다.

 

인자로는 hdc : PyHANDLE, x : int, y : int, nOption : int, rect : PyRECT, text : string, (width1, width2) : tuple 이 있습니다.

 

hdc: device context 핸들 값

 

x: 텍스트 출력을 시작할 x 좌표(왼쪽 상단 위 기준)

 

y: 텍스트 출력을 시작할 y 좌표(왼쪽 상단 위 기준)

 

nOptions: 사각형 영역을 어떻게 사용할지를 정의합니다. 다음의 값을 하나 혹은 두개를 사용할 수 있습니다.

 - win32con.ETO_CLIPPED: 텍스트가 사각형 영역에 의해 잘립니다.

 - win32con.ETO_OPAQUE: 현재의 배경색을 사각형 영역을 채우는데 사용합니다.

 

rect: 텍스트를 출력할 사각형 영역

 

text: 출력할 텍스트

 

(width1, width2, ...): 문자 사이의 거리를 설정하는 튜플 값

 

 

14. int, PyRECT = DrawText(hDC, String , nCount , Rect , Format )

 

텍스트를 출력하는 함수입니다. ExtTextOut 보다 엔터 값을 쉽게 취급할 수 있어 얘를 사용하는 게 더 좋아보입니다,

 

인자로는 hDC : int/PyHANDLE, String : str, nCount : int, Rect : PyRECT, Format : int 가 있습니다.

 

hDC: device context 핸들 값

 

String: 출력할 텍스트

 

nCount: 텍스트의 길이

 

Rect: 텍스트를 출력할 사각형 영역

 

Format: 텍스트 출력 형식

 * 참조: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-drawtext

 

리턴값으로 int, PyRECT를 갖습니다.

int: 문자열의 높이값

PyRECT: 문자열이 출력된 사각형 영역

 

15. int,PyRECT = DrawTextW(hDC, String , Count , Rect , Format )

 

위의 DrawText와 같습니다. 유니코드용이라는데, 크게 차이는 없는 것 같습니다.

 

 

16. EndPaint(hwnd, ps)

 

BegintPaint()를 사용한 후 그리기 작업을 끝냈다면, EndPaint()함수로 device context 핸들을 닫아주어야 합니다.

 

인자로는 hwnd : int, ps : paintstruct 가 있습니다.

 

hwnd: 윈도우 핸들 값

 

ps: BegintPaint()함수의 리턴값인 paintstruct

 

 

17. PyGdiHandle = CreateRectRgnIndirect(rc)

 

사각형 영역을 만드는 함수입니다.

 

인자로는 rc : PyRECT가 있습니다.

 

rc: 사각형 영역으로 튜플 값입니다.

 

리턴값은 Region에 대한 핸들값입니다.

 

 

18. InvalidateRect(hWnd, Rect, Erase)

 

윈도우 영역을 무효화, 즉 다시 그리도록 하는 함수입니다.

 

인자로는 hWnd : PyHANDLE, Rect : PyRECT, Erase : boolean 가 있습니다.

 

hWnd: 윈도우의 핸들 값입니다.

 

Rect: 사각형 영역으로 튜플 값입니다.

 

Erase: 배경도 지울건지 설정하는 값입니다.

 

 

19. InvalidateRgn(hWnd, hRgn, Erase)

 

위의 InvalidateRect와 같은 역할의 함수입니다.

 

차이점이라면, 2번재 인자가 hRgn으로 Region 핸들 값이 필요하다는 점입니다.

 

 

20. ValidateRgn(hWnd, hRgn)

 

InvalidateRgn()함수 (InvalidateRect()함수도 포함)와는 반대로 영역을 유효화, 즉 다시 그리지 않겠다 라는 함수입니다.

 

인자로는 hWnd : PyHANDLE, hRgn : PyGdiHANDLE 가 있습니다.

 

hWnd: 윈도우의 핸들 값입니다.

 

hRgn: Regint 핸들 값입니다.

 

 

21. RedrawWindow(hWnd, rcUpdate, hrgnUpdate, flags)

 

윈도우의 클라이언트 영역을 다시 그리는 함수입니다.

 

인자로는 hWnd : PyHANDLE, rcUpdate : (int,int,int,int), hrgnUpdate : PyGdiHANDLE, flags : int가 있습니다.

 

hWnd: 윈도우의 핸들값입니다.

 

rcUpdate: Rect 영역 값으로 None 이 가능합니다. hrgnUpdate 영역에 값이 있으면 이 값은 무시됩니다.

 

hrgnUpdate: Region 영역 핸들 값으로 None이 가능합니다. rcUpdate와 함께 None이라면 전체 영역으로 설정됩니다.

 

flags: 그리기 플래그 값입니다. 이 플래그에 따라 Invalidate, Validate 를 설정 가능합니다.

 * 참조: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-redrawwindow

 

 

import win32gui
import win32api
import win32con

# WM_CREATE가 안생겨서 만든 WM_CREATE 대용 메시지
UM_CREATE = win32con.WM_USER + 1


class WindowProcFunc:
    def __init__(self):
        self.str=""

    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):
        rect = (1, 1, 1000, 1000)
        hdc, ps = win32gui.BeginPaint(hwnd)
        logfont = win32gui.LOGFONT()
        logfont.lfHeight = 20
        logfont.lfWidth = 20
        logfont.lfEscapement = 20
        logfont.lfOrientation = 20
        logfont.lfWeight = win32con.FW_BOLD
        logfont.lfItalic = win32con.TRUE
        logfont.lfUnderline = win32con.TRUE
        logfont.lfStrikeOut = win32con.TRUE
        logfont.lfCharSet = win32con.DEFAULT_CHARSET
        
        hFont = win32gui.CreateFontIndirect(logfont)
        oldFont = win32gui.SelectObject(hdc, hFont)

        oldTextAlign = win32gui.SetTextAlign(hdc, win32con.TA_CENTER)
        oldTextExtra = win32gui.SetTextCharacterExtra(hdc, 20)
        oldTextColor = win32gui.SetTextColor(hdc, win32api.RGB(0, 0, 255))
        

        #win32gui.ExtTextOut(hdc, 0, 0, win32con.ETO_OPAQUE, rect, self.str, (10, 20, 30, 40, 50))  
        height, rt = win32gui.DrawText(hdc, self.str, len(self.str), rect, win32con.DT_TOP | win32con.DT_LEFT)
        #height, rt = win32gui.DrawTextW(hdc, self.str, len(self.str), rect, win32con.DT_TOP | win32con.DT_LEFT)
        
        print(f"text height is {height}")
        print(f"rect is {rt}")


        textAlign = win32gui.GetTextAlign(hdc)
        textColor = win32gui.GetTextColor(hdc)
        bValue = textColor >> 16 & 0xFF
        gValue = textColor >> 8 & 0xFF
        rValue = textColor & 0xFF
        cx, cy = win32gui.GetTextExtentPoint32(hdc, self.str)
        textFace = win32gui.GetTextFace(hdc)
        textMetrics = win32gui.GetTextMetrics(hdc)
        textExtra = win32gui.GetTextCharacterExtra(hdc)

        print(f"textAlign is {textAlign}")
        print(f"textColor RGB is {rValue, gValue, bValue}")
        print(f"text's width is {cx}, height is {cy}")
        print(f"textFace is {textFace}")
        print(f"textMetrics is {textMetrics}")
        print(f"textExtra is {textExtra}")



        win32gui.SelectObject(hdc, oldFont)
        win32gui.DeleteObject(hFont)


        win32gui.EndPaint(hwnd, ps)
    def OnChar(self, hwnd, iMsg, wParam, lParam):
        # wParam에 입력한 문자 정보가 들어있다
        if wParam == win32con.VK_BACK:
            self.str = self.str[:-1]
        else:
            self.str+=chr(wParam)

        #win32gui.InvalidateRgn(hwnd, None, win32con.TRUE) 
        #win32gui.InvalidateRect(hwnd, None, win32con.TRUE)
        win32gui.RedrawWindow(hwnd, None, None, win32con.RDW_INVALIDATE)
        
        rc=(10, 10, 50, 50)
        hrgn = win32gui.CreateRectRgnIndirect(rc)
        win32gui.ValidateRgn(hwnd, hrgn) # 무효화 영역 무시 (유효화)
        #win32gui.RedrawWindow(hwnd, rc, None, win32con.RDW_VALIDATE)

    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,
    win32con.WM_CHAR: wndProcFunc.OnChar,


}

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.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()

 

 

 

 

반응형

댓글()

3. [pywin32] Windows 관련 함수 - 2

pywin32/win32gui|2021. 1. 13. 00:59

어제 진행했던 1부에 계속 이어나가겠습니다

 

8. SendMessage(hwnd, idMessage, wParam, lParam)

 

윈도우에게 메시지를 보냅니다.

 

인자로는 hwnd : PyHANDLE, idMessage : int, wParam=None : int/string, lParam=None : int/string 가 있습니다.

 

hwnd: 윈도우의 핸들값입니다.

 

idMessage: 보낼 메시지 입니다. 사용자 정의 메시지도 가능합니다.

 

wParam: 메시지와 함께 보낼 데이터입니다.

 

lParam: 메시지와 함께 보낼 데이터입니다. (2)

 

 

9. AnimateWindow(hwnd, Time, Flags)

 

윈도우를 보여주거나 숨길 때 애니메이션 효과를 부여합니다.

 

인자로는 hwnd : PyHANDLE, Time : int, Flags : int 가 있습니다.

 

hwnd: 윈도우의 핸들값입니다.

 

Time: 애니메이션 효과 주기 시간입니다.(ms 단위)

 

Flags: 애니메이션 효과 플래그입니다.

 * 참조: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-animatewindow

 

 

 

10. boolean = ShowWindow(hWnd, cmdShow )

 

윈도우를 어떻게 보여줄지를 정하는 함수입니다.

 

인자로는 hWnd : int, cmdShow : int가 있습니다.

 

hWnd: 윈도우의 핸들값입니다.

 

cmdShow: 윈도우를 어떻게 보여줄지를 정하는 값입니다. win32con.SW_* 플래그를 사용합니다. 보통 win32con.SW_SHOWNORMAL을 많이 사용합니다.

 * 참조: docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow

 

리턴값은 boolean으로 이전에 윈도우가 볼 수 있는 상태라면 True, 아니면 False를 리턴합니다.

 

 

10. UpdateWindow(hwnd)

 

WM_PAINT 메시지를 날려서 윈도우 영역을 업데이트 시킵니다.

 

인자로는 hwnd : int 가 있습니다.

 

hwnd: 윈도우의 핸들값입니다.

 

 

11. MSG = GetMessage(hwnd, min , max )

 

메시지 큐에서 메시지를 검색해서 가져옵니다.

 

인자로는 hwnd : int, min : int, max : int 가 있습니다.

 

hwnd: 윈도우 핸들값입니다.

 

min: 검색해서 가져올 메시지의 최소값을 정합니다.

 

max: 검색해서 가져올 메시지의 최대값을 정합니다. min과 max가 둘다 0이라면 모든 메시지를 검색하고 가져옵니다.

 

리턴값은 MSG(=PyMSG)라고 되있는데 실제 사용하는 MSG와 와 형식이 좀 다르더군요... 그래서 예제에서는 MSG를 좀 변경했습니다.

일단 MSG 형식은 다음과 같습니다.

 

* MSG(=PyMSG)

[0] PyHANDLE : hwnd : 윈도우 핸들값입니다.

[1] int : message : GetMessage로 가져온 메시지의 식별자입니다.

[2] int : wParam : 메시지와 함께 가져온 부가 데이터입니다.

[3] int : lParam : 메시지와 함께 가져온 부가 데이터입니다. (2)

[4] int : time : 메시지가 게시된 시간입니다.

[5] (int, int) : point : 메시지가 게시될 때 마우스 커서의 위치입니다. (x,y 좌표)

 

 

12. int = TranslateMessage(msg)

 

가상 키 메시지를 실제 메시지로 번역해줍니다. 예를 들어 키를 눌렀다 뗐을 때 WM_KEYDOWN과 WM_KEYUP 메시지가 발생하는 데 TranslateMessage는 WM_CHAR 메시지를 추가로 생성한다.

 

인자로는 msg : MSG가 있습니다.

 

msg: 윈도우 메시지입니다.

 

리턴값은 int로 msg가 제대로 번역이 되지 않았다면 0을, 제대로 번역이 되거나, WM_KEYDOWN, WM_SYSKEYDOWN일 경우(번역과 상관없이) 0이 아닌 값을 리턴합니다.

 

 

13. int = DispatchMessage(msg)

 

메시지를 윈도우 처리 함수로 보내는 함수입니다.

 

인자로는 msg : MSG 가 있습니다.

 

리턴값은 윈도우 처리 함수의 리턴값인데 보통 사용하지 않는다고 합니다.

 

 

14. PumpMessages()

 

이 함수는 pywin32에서 만든 함수로 보입니다. GetMessage, TranslateMessage, DisplatchMessage 의 역할을 하며, 3가지 함수대신 이 함수를 이용해 윈도우 메시지를 처리할 수 있습니다.

 

WM_QUIT메시지가 나올 때까지 메시지를 처리합니다.

 

 

15. PostQuitMessage(rc)

 

시스템에게 현재 쓰레드를 종료시킬 거라고 알려주는 함수입니다. 보통 WM_DESTROY 메시지를 처리할 때 사용합니다.

 

인자로는 rc : int 가 있습니다.

 

rc: 종료 코드를 나타냅니다. WM_QUIT 메시지를 처리할 때 wParam에 넣어져서 사용된다고 합니다.

 

16. DestroyWindow(hwnd)

 

윈도우를 파괴하는 함수입니다. 이 함수가 호출되면 WM_DESTROY, WM_NCDESTROY 메시지를 보냅니다.

 

윈도우 프로시저는 이 함수를 통해 WM_DESTROY 메시지를 받고, WM_DESTROY 처리 함수에서 윈도우 종료를 처리합니다.

 

인자로는 hwnd : int 가 있습니다.

 

hwnd: 윈도우의 핸들 값

 

 

17. int = DefWindowProc(hwnd, message , wparam , lparam )

 

디폴트 윈도우 메시지 처리 함수를 호출합니다. 개발자가 작성한 윈도우 메시지 처리 함수에서 사용하지 않는 메시지에 대해 디폴트 처리를 수행합니다.

 

인자로는 hwnd : int, message : int, wparam : int, lparam : int

 

hwnd: 윈도우의 핸들값입니다.

 

message: 보낼 메시지 입니다.

 

wparam: 메시지와 함께 보낼 데이터입니다.

 

lparam: 메시지와 함께 보낼 데이터입니다. (2)

 

보통 윈도우 메시지 처리 함수에 인자로 들어오는 값을 그대로 사용합니다.

 

 

import win32gui
import win32api
import win32con
 
# WM_CREATE가 안생겨서 만든 WM_CREATE 대용 메시지
UM_CREATE=win32con.WM_USER + 1

PAINT_CNT=0
 
def WndProc(hwnd, iMsg, wParam, lParam):
    global PAINT_CNT
     
    if iMsg == UM_CREATE:
        print("create!")
        return 0
    elif iMsg == win32con.WM_DESTROY:
        print("destroy!")
        win32gui.PostQuitMessage(0)
        return 0
 
    elif iMsg == win32con.WM_PAINT:
        if PAINT_CNT == 0:
            print("paint")
            PAINT_CNT=1
        return 0
    elif iMsg == win32con.WM_CLOSE:
        win32gui.DestroyWindow(hwnd)
 
    return win32gui.DefWindowProc(hwnd, iMsg, wParam, lParam)
     
 
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 = None
    wndClassAtom = win32gui.RegisterClass(wndClass)
 
    hwnd = win32gui.CreateWindow(
        wndClassAtom,
        "title test",
        win32con.WS_OVERLAPPEDWINDOW,
        win32con.CW_USEDEFAULT,
        win32con.CW_USEDEFAULT,
        win32con.CW_USEDEFAULT,
        win32con.CW_USEDEFAULT,
        0,
        0,
        hInstance,
        None)
     
    win32gui.SendMessage(hwnd, UM_CREATE, 0, 0)
    
    win32gui.AnimateWindow(hwnd, 500, win32con.AW_CENTER)
    #win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
    win32gui.UpdateWindow(hwnd)

    win32gui.PumpMessages()
    return 0
     
    '''
    msg = win32gui.GetMessage(hwnd, 0, 0)
    msg = msg[1]
 
 
    while msg[1]:
        win32gui.TranslateMessage(msg)
        win32gui.DispatchMessage(msg)
        msg = win32gui.GetMessage(hwnd, 0, 0)
        msg = msg[1]
     
    return msg[2]
    '''
 
 
if __name__ == "__main__":
    x = WinMain()

위의 예제 실행 시 윈도우 창이 하나 뜨고 다음의 내용을 Python Shell 에서 확인할 수 있습니다.

 

 

 

 

반응형

댓글()

2. [pywin32] Windows 관련 함수 - 1

pywin32/win32gui|2021. 1. 12. 01:42

1. int = GetModuleHandle(fileName)

win32api 함수로 여기서는 HINSTANCE를 얻기 위해 사용되었습니다. 리턴값으로 현재 프로그램의 인스턴스 핸들값을 리턴합니다.

자세한 설명은 win32api에서 다루겠습니다.

 

 

2. PyWNDCLASS = WNDCLASS()

윈도우를 만들기 위한 기초 구조체로 CreateWindow 혹은 CreateWindowEx 함수를 통해 윈도우로 생성됩니다.

 

리턴값은 PyWNDCLASS 구조체로 다음의 객체를 가지며, 객체를 설정해주어야 합니다.

객체 의미
style 윈도우의 스타일을 지정해줍니다. 주로 CS_HREDRAW와 CS_VREDRAW를 많이 사용합니다.
 * 참조: docs.microsoft.com/en-us/windows/win32/winmsg/window-class-styles
cbWndExtra 윈도우가 내부적으로 사용하는 예약 영역이다. 0으로 두거나 그대로 두면 됩니다.
hInstance 인스턴스 핸들값을 넣어주며, GetModuleHandle() 의 리턴값을 사용합니다.
hIcon 윈도우의 아이콘 모양을 지정해줍니다. LoadIcon의 리턴값을 사용합니다.
hCursor 윈도우의 커서 모양을 지정해줍니다. LoadCursor의 리턴값을 사용합니다.
hbrBackground 윈도우의 바탕색을 지정해줍니다. GetStockObject의 리턴값을 사용합니다.
lpszMenuName 윈도우 프로그램이 사용할 메뉴를 지정합니다. 이 항목은 추후에 다루겠습니다.
lpszClassName 윈도우 클래스 이름을 지정합니다. CreateWindow에서 사용합니다.
lpfnWndProc 윈도우 메시지 처리 함수를 지정합니다.

 

 

3. HCURSOR = LoadIcon(hinstance, resource_id )

등록된 아이콘을 가져오는 함수입니다.

 

인자로는 hinstance : int, resource_id : int/string 가 있습니다.

 

hinstance: 아이콘 리소스를 갖고 있는 파일의 인스턴스 핸들입니다. 시스템에서 제공하는 아이콘을 사용하기 위해서는 0으로 두어야 합니다.

 

resource_id: 아이콘 리소스 ID 값입니다. 디폴트로 win32con.IDI_APPLICATION을 사용합니다.

 * 참조: docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-loadicona

 

리턴값은 HCURSOR로 아이콘 리소스 핸들입니다. (HICON이 아닌 HCURSOR인 이유는 모르겠습니다...)

 

 

4. HCURSOR = LoadCursor(hinstance, resid )

등록된 커서를 가져오는 함수입니다.

 

인자로는 hinstance : int, resid : int 가 있습니다.

 

hinstance: 커서 리소스를 갖고 있는 파일의 인스턴스 핸들입니다. 시스템에서 제공하는 커서를 사용하기 위해서는 0으로 두어야 합니다.

 

resid: 커서 리소스 ID 값입니다. 디폴트로 win32con.IDC_ARROW를 사용합니다.

 * 참조: docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-loadcursora

 

리턴값은 HCURSOR로 커서 리소스 핸들입니다.

 

 

5. PyHANDLE = GetStockObject(Object)

시스템의 표준 GDI 객체를 생성하는 함수입니다.

 

인자로는 Object : int 가 있습니다.

 

Object: 어떤 GDI 객체를 생성할 지 선택합니다.

 - *_BRUSH, *_PEN, *_FONT, *_PALLETTE 값이 올 수 있습니다.

 

리턴값은 선택한 GDI 객체 핸들 값입니다.

 

 

6. int = RegisterClass(wndClass)

윈도우 클래스를 등록하는 함수입니다.

 

인자로는 wndClass : PyWNDCLASS가 있습니다.

 

wndClass: WNDCLASS() 함수로 생성한 윈도우 클래스 구조체입니다.

 

리턴값은 WNDCLASS 에 대한 고유 식별자입니다.

 

 

7. int = CreateWindow(className, windowTitle , style , x , y , width , height , parent , menu , hinstance , reserved )

실제로 윈도우를 생성하는 함수입니다.

 

인자로는 className : int/string, windowTitle : string, style : int, x : int, y : int, width : int, height : int, parent : int, menu : int, hinstance : int, reserved : None 가 있습니다.

 

className: 클래스 이름으로 RegisterClass 의 리턴값을 넣어줍니다.

 

windowTitle: 윈도우의 타이틀 바에 나타낸 제목입니다.

 

style: 윈도우의 형태를 지정합니다. 보통 win32con.WS_OVERLAPPEDWINDOW를 많이 사용합니다.

 * 참조: docs.microsoft.com/en-us/windows/win32/winmsg/window-styles

 

x, y, width, height: x, y는 윈도우의 시작 좌표를 의미하며, width와 height는 넓이와 높이를 의미합니다. 기본적으로 win32con.CW_USEDEFAULT를 사용합니다.

 

parent: 부모 윈도우의 핸들값을 의미하며, 없으면 0으로 둡니다.

 

menu: 메뉴의 핸들값을 의미하며, 없으면 0으로 둡니다.

 

hinstance: 인스턴스 핸들로 GetModuleHandle()의 리턴값을 넣어줍니다.

 

reserved: 예약 영역으로 None으로 두어야 합니다.

 

리턴값은 윈도우 핸들값입니다.

 

 

일단 예제는 아래와 같습니다만, 아직 설명하지 않은 함수가 있어 마무리하고 결과를 보여드리겠습니다.ㅎㅎ

 - 2부에 계속 -

 

import win32gui
import win32api
import win32con
 
# WM_CREATE가 안생겨서 만든 WM_CREATE 대용 메시지
UM_CREATE=win32con.WM_USER + 1

PAINT_CNT=0
 
def WndProc(hwnd, iMsg, wParam, lParam):
    global PAINT_CNT
     
    if iMsg == UM_CREATE:
        print("create!")
        return 0
    elif iMsg == win32con.WM_DESTROY:
        print("destroy!")
        win32gui.PostQuitMessage(0)
        return 0
 
    elif iMsg == win32con.WM_PAINT:
        if PAINT_CNT == 0:
            print("paint")
            PAINT_CNT=1
        return 0
    elif iMsg == win32con.WM_CLOSE:
        win32gui.DestroyWindow(hwnd)
 
    return win32gui.DefWindowProc(hwnd, iMsg, wParam, lParam)
     
 
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 = None
    wndClassAtom = win32gui.RegisterClass(wndClass)
 
    hwnd = win32gui.CreateWindow(
        wndClassAtom,
        "title test",
        win32con.WS_OVERLAPPEDWINDOW,
        win32con.CW_USEDEFAULT,
        win32con.CW_USEDEFAULT,
        win32con.CW_USEDEFAULT,
        win32con.CW_USEDEFAULT,
        0,
        0,
        hInstance,
        None)
     
    win32gui.SendMessage(hwnd, UM_CREATE, 0, 0)
    
    win32gui.AnimateWindow(hwnd, 500, win32con.AW_CENTER)
    #win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
    win32gui.UpdateWindow(hwnd)

    win32gui.PumpMessages()
    return 0
     
    '''
    msg = win32gui.GetMessage(hwnd, 0, 0)
    msg = msg[1]
 
 
    while msg[1]:
        win32gui.TranslateMessage(msg)
        win32gui.DispatchMessage(msg)
        msg = win32gui.GetMessage(hwnd, 0, 0)
        msg = msg[1]
     
    return msg[2]
    '''
 
 
if __name__ == "__main__":
    x = WinMain()

 

 

 

 

반응형

댓글()

1. [pywin32] win32gui 소개

pywin32/win32gui|2020. 8. 22. 00:50

윈도우의 gui 함수를 다루는 모듈입니다.

* win32 기반의 gui를 다루는 것 같습니다. mfc gui에 대한 함수를 다루는 모듈은 따로 있는 것으로 보였기 때문입니다.

 

다음의 330개 함수를 제공합니다.

 

  • AbortPath
  • AlphaBlend
  • AngleArc
  • AnimateWindow
  • AppendMenu
  • Arc
  • ArcTo
  • BeginPaint
  • BeginPath
  • BitBlt
  • BringWindowToTop
  • CallWindowProc
  • CheckMenuItem
  • CheckMenuRadioItem
  • ChildWindowFromPoint
  • ChildWindowFromPoint
  • Chord
  • ClientToScreen
  • CloseFigure
  • CloseWindow
  • CombineRgn
  • CombineTransform
  • CommDlgExtendedError
  • CopyIcon
  • CreateAcceleratorTable
  • CreateBitmap
  • CreateBrushIndirect
  • CreateCaret
  • CreateCompatibleBitmap
  • CreateCompatibleDC
  • CreateDC
  • CreateDialogIndirect
  • CreateEllipticRgnIndirect
  • CreateFontIndirect
  • CreateHatchBrush
  • CreateIconFromResource
  • CreateIconIndirect
  • CreateMenu
  • CreatePatternBrush
  • CreatePen
  • CreatePolygonRgn
  • CreatePopupMenu
  • CreateRectRgnIndirect
  • CreateRoundRectRgn
  • CreateSolidBrush
  • CreateWindow
  • CreateWindowEx
  • DefWindowProc
  • DeleteDC
  • DeleteMenu
  • DeleteObject
  • DestroyAccleratorTable
  • DestroyCaret
  • DestroyIcon
  • DestroyMenu
  • DestroyWindow
  • DialogBox
  • DialogBoxIndirect
  • DialogBoxIndirectParam
  • DialogBoxIndirectParam
  • DialogBoxParam
  • DispatchMessage
  • DragAcceptFiles
  • DragDetect
  • DrawAnimatedRects
  • DrawEdge
  • DrawFocusRect
  • DrawIcon
  • DrawIconEx
  • DrawMenuBar
  • DrawText
  • DrawTextW
  • Ellipse
  • EnableMenuItem
  • EnableWindow
  • EndDialog
  • EndPaint
  • EndPath
  • EnumChildWindows
  • EnumFontFamilies
  • EnumPropsEx
  • EnumThreadWindows
  • EnumWindows
  • EqualRgn
  • ExtCreatePen
  • ExtFloodFill
  • ExtTextOut
  • ExtractIcon
  • ExtractIconEx
  • FillPath
  • FillRect
  • FillRgn
  • FindWindow
  • FindWindowEx
  • FlashWindow
  • FlashWindowEx
  • FlattenPath
  • FrameRect
  • FrameRgn
  • GetActiveWindow
  • GetArcDirection
  • GetBkColor
  • GetBkMode
  • GetCapture
  • GetCaretPos
  • GetClassLong
  • GetClassName
  • GetClientRect
  • GetCurrentObject
  • GetCurrentPositionEx
  • GetCursor
  • GetCursorInfo
  • GetCursorPos
  • GetDC
  • GetDesktopWindow
  • GetDlgCtrlID
  • GetDlgItem
  • GetDlgItemInt
  • GetDlgItemText
  • GetDoubleClickTime
  • GetFocus
  • GetForegroundWindow
  • GetGraphicsMode
  • GetIconInfo
  • GetLayeredWindowAttributes
  • GetLayout
  • GetMapMode
  • GetMenu
  • GetMenuDefaultItem
  • GetMenuInfo
  • GetMenuItemCount
  • GetMenuItemID
  • GetMenuItemInfo
  • GetMenuItemRect
  • GetMenuState
  • GetMessage
  • GetMiterLimit
  • GetNextDlgGroupItem
  • GetNextDlgTabItem
  • GetObject
  • GetObjectType
  • GetOpenFileName
  • GetOpenFileNameW
  • GetParent
  • GetPath
  • GetPixel
  • GetPolyFillMode
  • GetROP2
  • GetRgnBox
  • GetSaveFileNameW
  • GetScrollInfo
  • GetStockObject
  • GetStretchBltMode
  • GetSubMenu
  • GetSysColor
  • GetSysColorBrush
  • GetSystemMenu
  • GetTextAlign
  • GetTextCharacterExtra
  • GetTextColor
  • GetTextExtentPoint32
  • GetTextFace
  • GetTextMetrics
  • GetUpdateRgn
  • GetViewportExtEx
  • GetViewportOrgEx
  • GetWindow
  • GetWindowDC
  • GetWindowExtEx
  • GetWindowLong
  • GetWindowOrgEx
  • GetWindowPlacement
  • GetWindowRect
  • GetWindowRgn
  • GetWindowRgnBox
  • GetWindowText
  • GetWorldTransform
  • GradientFill
  • HideCaret
  • ImageList_Add
  • ImageList_Create
  • ImageList_Destroy
  • ImageList_Draw
  • ImageList_DrawEx
  • ImageList_GetIcon
  • ImageList_GetImageCount
  • ImageList_LoadBitmap
  • ImageList_LoadImage
  • ImageList_Remove
  • ImageList_Replace
  • ImageList_ReplaceIcon
  • ImageList_SetBkColor
  • ImageList_SetOverlayImage
  • InitCommonControls
  • InitCommonControlsEx
  • InsertMenu
  • InsertMenuItem
  • InvalidateRect
  • InvalidateRgn
  • InvertRect
  • InvertRgn
  • IsChild
  • IsIconic
  • IsWindow
  • IsWindowEnabled
  • IsWindowVisible
  • LOGFONT
  • LineTo
  • ListView_SortItems
  • ListView_SortItemsEx
  • LoadCursor
  • LoadIcon
  • LoadImage
  • LoadMenu
  • MaskBlt
  • MessageBeep
  • MessageBox
  • ModifyMenu
  • ModifyWorldTransform
  • MoveToEx
  • MoveWindow
  • OffsetRgn
  • PaintDesktop
  • PaintRgn
  • PatBlt
  • PathToRegion
  • PeekMessage
  • Pie
  • PlgBlt
  • PolyBezier
  • PolyBezierTo
  • Polygon
  • Polyline
  • PolylineTo
  • PostMessage
  • PostQuitMessage
  • PostThreadMessage
  • PtInRect
  • PtInRegion
  • PumpMessages
  • PumpWaitingMessages
  • PyGetArraySignedLong
  • PyGetBufferAddressAndLen
  • PyGetMemory
  • PyGetString
  • PySetMemory
  • PySetString
  • RectInRegion
  • Rectangle
  • RedrawWindow
  • RegisterClass
  • RegisterDeviceNotification
  • RegisterWindowMessage
  • ReleaseCapture
  • ReleaseDC
  • RemoveMenu
  • ReplyMessage
  • RestoreDC
  • RoundRect
  • SaveDC
  • ScreenToClient
  • ScrollWindowEx
  • SelectObject
  • SendMessage
  • SendMessageTimeout
  • SetActiveWindow
  • SetArcDirection
  • SetBkColor
  • SetBkMode
  • SetCapture
  • SetCaretPos
  • SetCursor
  • SetDlgItemInt
  • SetDlgItemText
  • SetDoubleClickTime
  • SetFocus
  • SetForegroundWindow
  • SetGraphicsMode
  • SetLayeredWindowAttributes
  • SetLayout
  • SetMapMode
  • SetMenu
  • SetMenuDefaultItem
  • SetMenuInfo
  • SetMenuItemBitmaps
  • SetMenuItemInfo
  • SetMiterLimit
  • SetParent
  • SetPixel
  • SetPixelV
  • SetPolyFillMode
  • SetROP2
  • SetRectRgn
  • SetScrollInfo
  • SetStretchBltMode
  • SetTextAlign
  • SetTextCharacterExtra
  • SetTextColor
  • SetViewportExtEx
  • SetViewportOrgEx
  • SetWindowExtEx
  • SetWindowLong
  • SetWindowOrgEx
  • SetWindowPlacement
  • SetWindowPos
  • SetWindowRgn
  • SetWindowText
  • SetWorldTransform
  • Shell_NotifyIcon
  • ShowCaret
  • ShowWindow
  • StretchBlt
  • StrokeAndFillPath
  • StrokePath
  • SystemParametersInfo
  • TrackPopupMenu
  • TranslateAccelerator
  • TranslateMessage
  • TransparentBlt
  • UnregisterClass
  • UnregisterDeviceNotification
  • UpdateLayeredWindow
  • UpdateWindow
  • ValidateRgn
  • WaitMessage
  • WidenPath
  • WindowFromDC
  • WindowFromPoint
  • _TrackMouseEvent
  • set_logger

 

반응형

댓글()