2. [pywin32] Windows 관련 함수 - 1
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()
'pywin32 > win32gui' 카테고리의 다른 글
6. [pywin32] LineAndCurve 관련 함수 - 2 (0) | 2021.12.17 |
---|---|
5. [pywin32] LineAndCurve 관련 함수 - 1 (0) | 2021.12.10 |
4. [pywin32] FontAndText 관련 함수 (0) | 2021.12.06 |
3. [pywin32] Windows 관련 함수 - 2 (0) | 2021.01.13 |
1. [pywin32] win32gui 소개 (0) | 2020.08.22 |