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

 

 

 

 

반응형

댓글()