From 42c00b37d526f4cb62d0e29992f61d44f16702d4 Mon Sep 17 00:00:00 2001 From: tolelom <98kimsungmin@naver.com> Date: Mon, 13 Apr 2026 02:36:01 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20Win32=20=EC=84=A0=EC=96=B8=EB=B6=80?= =?UTF-8?q?=EB=A5=BC=20win32.go=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- ui.go | 168 ------------------------------------------------------ win32.go | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 171 insertions(+), 168 deletions(-) create mode 100644 win32.go diff --git a/ui.go b/ui.go index 0c5f537..aedb6c0 100644 --- a/ui.go +++ b/ui.go @@ -10,174 +10,6 @@ import ( "golang.org/x/sys/windows" ) -// ── Win32 메시지 상수 ──────────────────────────────────────── - -const ( - wmDestroy uint32 = 0x0002 - wmClose uint32 = 0x0010 - wmSetFont uint32 = 0x0030 - wmSetText uint32 = 0x000C - wmCtlColorStatic uint32 = 0x0138 - wmAppDone uint32 = 0x8001 // 다운로드 완료 시 사용하는 커스텀 메시지 -) - -// ── 윈도우 스타일 상수 ─────────────────────────────────────── - -const ( - wsPopup uintptr = 0x80000000 - wsCaption uintptr = 0x00C00000 - wsSysMenu uintptr = 0x00080000 - wsChild uintptr = 0x40000000 - wsVisible uintptr = 0x10000000 - ssCenter uintptr = 0x00000001 -) - -// ── 프로그레스바 상수 ──────────────────────────────────────── - -const ( - pbsSmooth uintptr = 0x01 - pbmSetRange32 uint32 = 0x0406 - pbmSetPos uint32 = 0x0402 - pbmSetBarColor uint32 = 0x0409 - pbmSetBkColor uint32 = 0x2001 -) - -// ── 기타 Win32 상수 ────────────────────────────────────────── - -const ( - setBkModeTransparent = 1 - - swShow = 5 - smCxScreen = 0 - smCyScreen = 1 - - mbOK uintptr = 0x00000000 - mbInfo uintptr = 0x00000040 - mbError uintptr = 0x00000010 - mbYesNo uintptr = 0x00000004 - mbQ uintptr = 0x00000020 - idYes = 6 - - iccProgressClass uint32 = 0x00000020 -) - -// ── 색상 ───────────────────────────────────────────────────── - -// rgb COLORREF(0x00BBGGRR) 값을 생성한다. -func rgb(r, g, b uint8) uintptr { - return uintptr(r) | (uintptr(g) << 8) | (uintptr(b) << 16) -} - -// 웹사이트 색상과 동일한 팔레트 -var ( - colorBg = rgb(46, 44, 47) // #2E2C2F - colorText = rgb(200, 200, 200) // 밝은 회색 - colorAccent = rgb(186, 205, 176) // #BACDB0 - colorProgressBg = rgb(65, 63, 67) // bg보다 약간 밝은 색 -) - -// ── DLL 및 프로시저 ────────────────────────────────────────── - -var ( - user32 = windows.NewLazySystemDLL("user32.dll") - kernel32 = windows.NewLazySystemDLL("kernel32.dll") - gdi32 = windows.NewLazySystemDLL("gdi32.dll") - comctl32 = windows.NewLazySystemDLL("comctl32.dll") - uxtheme = windows.NewLazySystemDLL("uxtheme.dll") -) - -// user32.dll -var ( - messageBoxWProc = user32.NewProc("MessageBoxW") - registerClassExWProc = user32.NewProc("RegisterClassExW") - createWindowExWProc = user32.NewProc("CreateWindowExW") - showWindowProc = user32.NewProc("ShowWindow") - updateWindowProc = user32.NewProc("UpdateWindow") - getMessageWProc = user32.NewProc("GetMessageW") - translateMsgProc = user32.NewProc("TranslateMessage") - dispatchMsgWProc = user32.NewProc("DispatchMessageW") - sendMessageWProc = user32.NewProc("SendMessageW") - postMessageWProc = user32.NewProc("PostMessageW") - defWindowProcWProc = user32.NewProc("DefWindowProcW") - destroyWindowProc = user32.NewProc("DestroyWindow") - postQuitMsgProc = user32.NewProc("PostQuitMessage") - getSystemMetricsProc = user32.NewProc("GetSystemMetrics") - getDpiForSystemProc = user32.NewProc("GetDpiForSystem") - setProcessDpiAwarenessContextProc = user32.NewProc("SetProcessDpiAwarenessContext") - findWindowWProc = user32.NewProc("FindWindowW") - setForegroundWindowProc = user32.NewProc("SetForegroundWindow") -) - -// kernel32.dll -var ( - createMutexWProc = kernel32.NewProc("CreateMutexW") - getModuleHandleWProc = kernel32.NewProc("GetModuleHandleW") -) - -// gdi32.dll -var ( - createFontIndirectWProc = gdi32.NewProc("CreateFontIndirectW") - createSolidBrushProc = gdi32.NewProc("CreateSolidBrush") - setTextColorProc = gdi32.NewProc("SetTextColor") - setBkModeProc = gdi32.NewProc("SetBkMode") - deleteObjectProc = gdi32.NewProc("DeleteObject") -) - -// comctl32.dll / uxtheme.dll -var ( - initCommonControlsExProc = comctl32.NewProc("InitCommonControlsEx") - setWindowThemeProc = uxtheme.NewProc("SetWindowTheme") -) - -// ── Win32 구조체 ───────────────────────────────────────────── - -type wndClassExW struct { - cbSize uint32 - style uint32 - lpfnWndProc uintptr - cbClsExtra int32 - cbWndExtra int32 - hInstance uintptr - hIcon uintptr - hCursor uintptr - hbrBackground uintptr - lpszMenuName *uint16 - lpszClassName *uint16 - hIconSm uintptr -} - -type msgW struct { - hwnd uintptr - message uint32 - wParam uintptr - lParam uintptr - time uint32 - ptX int32 - ptY int32 -} - -type initCommonControlsExS struct { - dwSize uint32 - dwICC uint32 -} - -type logFontW struct { - lfHeight int32 - lfWidth int32 - lfEscapement int32 - lfOrientation int32 - lfWeight int32 - lfItalic byte - lfUnderline byte - lfStrikeOut byte - lfCharSet byte - lfOutPrecision byte - lfClipPrecision byte - lfQuality byte - lfPitchAndFamily byte - lfFaceName [32]uint16 -} - // ── 윈도우 핸들 (진행 창에서 사용) ────────────────────────── var ( diff --git a/win32.go b/win32.go new file mode 100644 index 0000000..83f6d98 --- /dev/null +++ b/win32.go @@ -0,0 +1,171 @@ +package main + +import "golang.org/x/sys/windows" + +// ── Win32 메시지 상수 ──────────────────────────────────────── + +const ( + wmDestroy uint32 = 0x0002 + wmClose uint32 = 0x0010 + wmSetFont uint32 = 0x0030 + wmSetText uint32 = 0x000C + wmCtlColorStatic uint32 = 0x0138 + wmAppDone uint32 = 0x8001 // 다운로드 완료 시 사용하는 커스텀 메시지 +) + +// ── 윈도우 스타일 상수 ─────────────────────────────────────── + +const ( + wsPopup uintptr = 0x80000000 + wsCaption uintptr = 0x00C00000 + wsSysMenu uintptr = 0x00080000 + wsChild uintptr = 0x40000000 + wsVisible uintptr = 0x10000000 + ssCenter uintptr = 0x00000001 +) + +// ── 프로그레스바 상수 ──────────────────────────────────────── + +const ( + pbsSmooth uintptr = 0x01 + pbmSetRange32 uint32 = 0x0406 + pbmSetPos uint32 = 0x0402 + pbmSetBarColor uint32 = 0x0409 + pbmSetBkColor uint32 = 0x2001 +) + +// ── 기타 Win32 상수 ────────────────────────────────────────── + +const ( + setBkModeTransparent = 1 + + swShow = 5 + smCxScreen = 0 + smCyScreen = 1 + + mbOK uintptr = 0x00000000 + mbInfo uintptr = 0x00000040 + mbError uintptr = 0x00000010 + mbYesNo uintptr = 0x00000004 + mbQ uintptr = 0x00000020 + idYes = 6 + + iccProgressClass uint32 = 0x00000020 +) + +// ── 색상 ───────────────────────────────────────────────────── + +// rgb COLORREF(0x00BBGGRR) 값을 생성한다. +func rgb(r, g, b uint8) uintptr { + return uintptr(r) | (uintptr(g) << 8) | (uintptr(b) << 16) +} + +// 웹사이트 색상과 동일한 팔레트 +var ( + colorBg = rgb(46, 44, 47) // #2E2C2F + colorText = rgb(200, 200, 200) // 밝은 회색 + colorAccent = rgb(186, 205, 176) // #BACDB0 + colorProgressBg = rgb(65, 63, 67) // bg보다 약간 밝은 색 +) + +// ── DLL 및 프로시저 ────────────────────────────────────────── + +var ( + user32 = windows.NewLazySystemDLL("user32.dll") + kernel32 = windows.NewLazySystemDLL("kernel32.dll") + gdi32 = windows.NewLazySystemDLL("gdi32.dll") + comctl32 = windows.NewLazySystemDLL("comctl32.dll") + uxtheme = windows.NewLazySystemDLL("uxtheme.dll") +) + +// user32.dll +var ( + messageBoxWProc = user32.NewProc("MessageBoxW") + registerClassExWProc = user32.NewProc("RegisterClassExW") + createWindowExWProc = user32.NewProc("CreateWindowExW") + showWindowProc = user32.NewProc("ShowWindow") + updateWindowProc = user32.NewProc("UpdateWindow") + getMessageWProc = user32.NewProc("GetMessageW") + translateMsgProc = user32.NewProc("TranslateMessage") + dispatchMsgWProc = user32.NewProc("DispatchMessageW") + sendMessageWProc = user32.NewProc("SendMessageW") + postMessageWProc = user32.NewProc("PostMessageW") + defWindowProcWProc = user32.NewProc("DefWindowProcW") + destroyWindowProc = user32.NewProc("DestroyWindow") + postQuitMsgProc = user32.NewProc("PostQuitMessage") + getSystemMetricsProc = user32.NewProc("GetSystemMetrics") + getDpiForSystemProc = user32.NewProc("GetDpiForSystem") + setProcessDpiAwarenessContextProc = user32.NewProc("SetProcessDpiAwarenessContext") + findWindowWProc = user32.NewProc("FindWindowW") + setForegroundWindowProc = user32.NewProc("SetForegroundWindow") +) + +// kernel32.dll +var ( + createMutexWProc = kernel32.NewProc("CreateMutexW") + getModuleHandleWProc = kernel32.NewProc("GetModuleHandleW") +) + +// gdi32.dll +var ( + createFontIndirectWProc = gdi32.NewProc("CreateFontIndirectW") + createSolidBrushProc = gdi32.NewProc("CreateSolidBrush") + setTextColorProc = gdi32.NewProc("SetTextColor") + setBkModeProc = gdi32.NewProc("SetBkMode") + deleteObjectProc = gdi32.NewProc("DeleteObject") +) + +// comctl32.dll / uxtheme.dll +var ( + initCommonControlsExProc = comctl32.NewProc("InitCommonControlsEx") + setWindowThemeProc = uxtheme.NewProc("SetWindowTheme") +) + +// ── Win32 구조체 ───────────────────────────────────────────── + +type wndClassExW struct { + cbSize uint32 + style uint32 + lpfnWndProc uintptr + cbClsExtra int32 + cbWndExtra int32 + hInstance uintptr + hIcon uintptr + hCursor uintptr + hbrBackground uintptr + lpszMenuName *uint16 + lpszClassName *uint16 + hIconSm uintptr +} + +type msgW struct { + hwnd uintptr + message uint32 + wParam uintptr + lParam uintptr + time uint32 + ptX int32 + ptY int32 +} + +type initCommonControlsExS struct { + dwSize uint32 + dwICC uint32 +} + +type logFontW struct { + lfHeight int32 + lfWidth int32 + lfEscapement int32 + lfOrientation int32 + lfWeight int32 + lfItalic byte + lfUnderline byte + lfStrikeOut byte + lfCharSet byte + lfOutPrecision byte + lfClipPrecision byte + lfQuality byte + lfPitchAndFamily byte + lfFaceName [32]uint16 +}