예전에 프로그램 만들때 사용했던 마이크로소프트 오피스 gui 프로토타입입니다
초기때는 이미지 사용한 버전이라, 이미지 안쓰려고 전부다 프로그레스바로 바꾼 노가다의 흔적떄문에 눈물이 나네요
오토핫키L의 제작자 Lexikos가 1.1.20 버전부터 새로 추가한 기능인 BoundFunc을 코드내에서 사용하니
관심이 있다면 아래 코드를 통해 사용예를 확인해보시는것도 공부에 도움이 될 듯 합니다
코드에 주석달아서 더럽히는(...)걸 좋아하지 않아서 주석이 없지만 글작성하면서 아래에 적어두니 참고하시기 바랍니다
#SingleInstance, Off ;프로그램 중복실행 허용
#NoEnv ;내장환경변수 제거, 퍼포먼스 향샹 목적
#NoTrayIcon ;트레이아이콘 제거
#KeyHistory 0 ;키저장기능 제거, 퍼포먼스 향샹 목적
ListLines Off ;라인제거, 퍼포먼스 향샹 목적
SetWinDelay, 0 ;윈도우 관련 딜레이 최소한으로 설정 (-1은 딜레이X)
SetBatchLines, -1 ;코드간 자동 Sleep 삭제, 속도 향샹 목적
new OfficeGUI()
return
class OfficeGUI {
static GuiW := A_ScreenWidth * 0.3, GuiH := A_ScreenHeight * 0.6 ;시작 Static 변수 Assign
__New() {
this.Bound := [] ;오브젝트 생성
this.Bound.IconButton := this.IconButton.Bind(this) ;이하 버튼 g라벨 초기 설정 구간
this.Bound.MinimizeButton := this.MinimizeButton.Bind(this)
this.Bound.MaximizeButton := this.MaximizeButton.Bind(this)
this.Bound.CloseButton := this.CloseButton.Bind(this)
this.Bound.MoveButton := this.MoveButton.Bind(this)
this.Color := "FFFFFF" ;배경색 Assign
Gui, New, -DPIScale -Caption +Resize +hwndhMainWindow ;구이 윈도우설정
this.hMainWindow := hMainWindow ;클래스내 사용을위해 hwnd 설정
Gui, Margin, 0, 0 ;컴포넌트 간의 기본폭 삭제
Gui, Color, % this.Color ;배경색 지정
; 아래는 BoundFunction 관련 코드 (도움말 http://ahkscript.org/docs/objects/Functor.htm)
Gui, Add, Text, % " x" 1 " y" 1 " w" 37 " h" 28 " +BackgroundTrans hwndhIconButton" ; 아이콘 영역 설정
this.hIconButton := hIconButton ;아이콘 hwnd 설정
BoundIconButton := this.Bound.IconButton ;함수 바운드
GuiControl, +g, %hIconButton%, %BoundIconButton% ;아이콘버튼 g라벨 바운드
Gui, Add, Text, % " x" this.GuiW-89 " y" 4 " w" 29 " h" 22 " +BackgroundTrans hwndhMinimizeButton" ;최소화 영역 설정
this.hMinimizeButton := hMinimizeButton ;최소화 hwnd 설정
BoundMinimizeButton := this.Bound.MinimizeButton ;함수 바운드
GuiControl, +g, %hMinimizeButton%, %BoundMinimizeButton% ;최소화버튼 g라벨 바운드
Gui, Add, Text, % " x" this.GuiW-59 " y" 4 " w" 29 " h" 22 " +BackgroundTrans hwndhMaximizeButton" ;최대화 영역
this.hMaximizeButton := hMaximizeButton ;최대화 hwnd 설정
BoundMaximizeButton := this.Bound.MaximizeButton ;함수 바운드
GuiControl, +g, %hMaximizeButton%, %BoundMaximizeButton% ;최대화버튼 g라벨 바운드
Gui, Add, Text, % " x" this.GuiW-30 " y" 4 " w" 29 " h" 22 " +BackgroundTrans hwndhCloseButton" ;종료 (X) 영역
this.hCloseButton := hCloseButton ;종료 hwnd 설정
BoundClose := this.Bound.CloseButton ;함수바운드
GuiControl, +g, %hCloseButton%, %BoundClose% ;종료버튼 g라벨 바운드
Gui, Add, Text, % " x" 1 " y" 1 " w" this.GuiW-2 " h" 28 " +BackgroundTrans hwndhMoveButton" ;상단바 영역
this.hMoveButton := hMoveButton ;hwnd 설정
BoundMoveButton := this.Bound.MoveButton ;함수바운드
GuiControl, +g, %hMoveButton%, %BoundMoveButton% ;상단 드래그영역 g라벨 바운드
;이제부터는 Progrss를 이용한 버튼이미지 그리기 부분
Gui, Add, Progress, % " x" 11 " y" 4 " w" 16 " h" 16 " Background0072C6", 0 ;GUI 아이콘
Gui, Add, Progress, % " x" this.GuiW-80 " y" 10 " w" 9 " h" 2 " Background777777 hwndhMin", 0 ;GUI MINIMIZE
Gui, Add, Progress, % " x" this.GuiW-50 " y" 3 " w" 11 " h" 2 " Background777777 hwndhMaxT", 0 ;GUI 최대화 top
Gui, Add, Progress, % " x" this.GuiW-50 " y" 11 " w" 11 " h" 2 " Background777777 hwndhMaxB", 0 ;GUI 최대화 bottom
Gui, Add, Progress, % " x" this.GuiW-41 " y" 3 " w" 2 " h" 10 " Background777777 hwndhMaxR", 0 ;GUI 최대화 right
Gui, Add, Progress, % " x" this.GuiW-50 " y" 3 " w" 2 " h" 10 " Background777777 hwndhMaxL", 0 ;GUI 최대화 left
Gui, Add, Progress, % " x" this.GuiW-20 " y" 4 " w" 1 " h" 1 " Background777777 hwndhXTL1", 0 ;GUI CLOSE TOP-LEFT 01
Gui, Add, Progress, % " x" this.GuiW-21 " y" 5 " w" 3 " h" 1 " Background777777 hwndhXTL2", 0 ;GUI CLOSE TOP-LEFT 02
Gui, Add, Progress, % " x" this.GuiW-20 " y" 6 " w" 3 " h" 1 " Background777777 hwndhXTL3", 0 ;GUI CLOSE TOP-LEFT 03
Gui, Add, Progress, % " x" this.GuiW-13 " y" 4 " w" 1 " h" 1 " Background777777 hwndhXTR1", 0 ;GUI CLOSE TOP-RIGHT 01
Gui, Add, Progress, % " x" this.GuiW-14 " y" 5 " w" 3 " h" 1 " Background777777 hwndhXTR2", 0 ;GUI CLOSE TOP-RIGHT 02
Gui, Add, Progress, % " x" this.GuiW-15 " y" 6 " w" 3 " h" 1 " Background777777 hwndhXTR3", 0 ;GUI CLOSE TOP-RIGHT 03
Gui, Add, Progress, % " x" this.GuiW-19 " y" 7 " w" 6 " h" 1 " Background777777 hwndhXC1", 0 ;GUI CLOSE CENTER 01
Gui, Add, Progress, % " x" this.GuiW-18 " y" 8 " w" 4 " h" 1 " Background777777 hwndhXC2", 0 ;GUI CLOSE CENTER 02
Gui, Add, Progress, % " x" this.GuiW-18 " y" 9 " w" 4 " h" 1 " Background777777 hwndhXC3", 0 ;GUI CLOSE CENTER 03
Gui, Add, Progress, % " x" this.GuiW-19 " y" 10 " w" 6 " h" 1 " Background777777 hwndhXC4", 0 ;GUI CLOSE CENTER 04
Gui, Add, Progress, % " x" this.GuiW-20 " y" 11 " w" 3 " h" 1 " Background777777 hwndhCBL1", 0 ;GUI CLOSE BOTTOM-LEFT 01
Gui, Add, Progress, % " x" this.GuiW-21 " y" 12 " w" 3 " h" 1 " Background777777 hwndhCBL2", 0 ;GUI CLOSE BOTTOM-LEFT 02
Gui, Add, Progress, % " x" this.GuiW-20 " y" 13 " w" 1 " h" 1 " Background777777 hwndhCBL3", 0 ;GUI CLOSE BOTTOM-LEFT 03
Gui, Add, Progress, % " x" this.GuiW-15 " y" 11 " w" 3 " h" 1 " Background777777 hwndhCBR1", 0 ;GUI CLOSE BOTTOM-RIGHT 01
Gui, Add, Progress, % " x" this.GuiW-14 " y" 12 " w" 3 " h" 1 " Background777777 hwndhCBR2", 0 ;GUI CLOSE BOTTOM-RIGHT 02
Gui, Add, Progress, % " x" this.GuiW-13 " y" 13 " w" 1 " h" 1 " Background777777 hwndhCBR3", 0 ;GUI CLOSE BOTTOM-RIGHT 03
Gui, Add, Progress, % " x" 1 " y" this.GuiH-23 " w" this.GuiW-2 " h" 22 " Background0072C6 hwndhBar", 0 ;GUI STATUSBAR
Gui, Font, s9 c444444, Segoe UI ;프로그램 타이틀 텍스트를위해 폰트설정
Gui, Add, Text, % " x" 37 " y" 2 " w" this.GuiW-96 " +Center +BackgroundTrans hwndhTitletext", 프로그램 타이틀
Gui, Font ;폰트 초기화
Gui, Font, s8 cFFFFFF, Segoe UI ;하단 메시지 텍스트를위해 폰트설정
Gui, Add, Text, % " x" 8 " y" this.GuiH-19 " w" this.GuiW-16 " +BackgroundTrans hwndhBarText", 하단 메시지 텍스트
Gui, Font ;폰트 초기화
WinEvents.Register(this.hMainWindow, this) ;기본 GuiEvent 레지스트
Gui, Show, % " w" this.GuiW " h" this.GuiH, GUI
}
IconButton() ;아이콘버튼, Bound된 g라벨 Function
{
SendInput, !{Space} ;컨트롤메뉴 보이게
}
MinimizeButton() ;최소화버튼, Bound된 g라벨 Func
{
WinMinimize
}
MaximizeButton() ;최대화버튼, Bound된 g라벨 Func
{
VarSetCapacity(rect, 16, 0)
DllCall("GetClientRect", uint, this.hMainWindow, uint, &rect ) ;보더와 캡션을 제외한 실제 윈도우영역을 구함
if (NumGet( rect, 8, "int" ) >= A_ScreenWidth - 50)
WinRestore
else
WinMaximize
}
MoveButton() ;상단 드래그영역, Bound된 g라벨 Func
{
PostMessage, 0xA1, 2,,, A ;드래그
}
CloseButton() ;종료 X버튼, Bound된 g라벨 Func
{
this.Delete("Bound") ;Bound 오브젝트 제거
WinEvents.Unregister(this.hMainWindow) ;기본 GuiEvent 설정 언로드
Gui, Destroy
ExitApp
}
GuiSize() ;구이 리사이즈, WinEvents.Register(this.hMainWindow, this)로 인해 Bound됨
{
global
GuiControl, Move, % this.hMinimizeButton, % "x" A_GuiWidth - 89 " y" 4 " w" 29 " h" 22
GuiControl, Move, % this.hMaximizeButton, % "x" A_GuiWidth - 59 " y" 4 " w" 29 " h" 22
GuiControl, Move, % this.hCloseButton, % "x" A_GuiWidth - 29 " y" 4 " w" 29 " h" 22
GuiControl, Move, % this.hMoveButton, % "x" 1 " y" 1 " w" A_GuiWidth - 2 " h" 28
GuiControl, Move, % hMin, % "x" A_GuiWidth - 80 " y" 10 " w" 9 " h" 2
GuiControl, Move, % hMaxT, % "x" A_GuiWidth - 50 "y" 3 "w" 11 "h" 2
GuiControl, Move, % hMaxB, % "x" A_GuiWidth - 50 "y" 11 "w" 11 "h" 2
GuiControl, Move, % hMaxR, % "x" A_GuiWidth - 41 "y" 3 "w" 2 "h" 10
GuiControl, Move, % hMaxL, % "x" A_GuiWidth - 50 "y" 3 "w" 2 "h" 10
GuiControl, Move, % hXTL1, % "x" A_GuiWidth - 20 " y" 4 " w" 1 " h" 1
GuiControl, Move, % hXTL2, % "x" A_GuiWidth - 21 " y" 5 " w" 3 " h" 1
GuiControl, Move, % hXTL3, % "x" A_GuiWidth - 20 " y" 6 " w" 3 " h" 1
GuiControl, Move, % hXTR1, % "x" A_GuiWidth - 13 " y" 4 " w" 1 " h" 1
GuiControl, Move, % hXTR2, % "x" A_GuiWidth - 14 " y" 5 " w" 3 " h" 1
GuiControl, Move, % hXTR3, % "x" A_GuiWidth - 15 "y" 6 "w" 3 "h" 1
GuiControl, Move, % hXC1, % "x" A_GuiWidth - 19 " y" 7 " w" 6 " h" 1
GuiControl, Move, % hXC2, % "x" A_GuiWidth - 18 " y" 8 " w" 4 " h" 1
GuiControl, Move, % hXC3, % "x" A_GuiWidth - 18 " y" 9 " w" 4 " h" 1
GuiControl, Move, % hXC4, % "x" A_GuiWidth - 19 " y" 10 " w" 6 " h" 1
GuiControl, Move, % hCBL1, % "x" A_GuiWidth - 20 " y" 11 " w" 3 " h" 1
GuiControl, Move, % hCBL2, % "x" A_GuiWidth - 21 " y" 12 " w" 3 " h" 1
GuiControl, Move, % hCBL3, % "x" A_GuiWidth - 20 " y" 13 " w" 1 " h" 1
GuiControl, Move, % hCBR1, % "x" A_GuiWidth - 15 " y" 11 " w" 3 " h" 1
GuiControl, Move, % hCBR2, % "x" A_GuiWidth - 14 " y" 12 " w" 3 " h" 1
GuiControl, Move, % hCBR3, % "x" A_GuiWidth - 13 " y" 13 " w" 1 " h" 1
GuiControl, Move, % hBar, % "x" 1 " y" A_GuiHeight - 23 " w" A_GuiWidth - 2 " h" 22
GuiControl, Move, % hTitletext, % "x" 37 " y" 2 " w" A_GuiWidth - 96
GuiControl, Move, % hBarText, % "x" 8 " y" A_GuiHeight - 19 " w" A_GuiWidth - 16
WinSet, Redraw
}
}
class WinEvents
{
static Table := {}
Register(hWnd, Class, Prefix="Gui")
{
Gui, +LabelWinEvents.
this.Table[hWnd] := {Class: Class, Prefix: Prefix}
}
Unregister(hWnd)
{
this.Table.Delete(hWnd)
}
Dispatch(hWnd, Type)
{
Info := this.Table[hWnd]
return Info.Class[Info.Prefix . Type].Call(Info.Class)
}
Size()
{
return WinEvents.Dispatch(this, "Size")
}
}
'프로그래밍 > Archive' 카테고리의 다른 글
[Lib] CleanNotify (4) | 2015.11.21 |
---|---|
WinWaitCreated() (0) | 2015.10.17 |
GetActiveObjects 활성중인 객체를 불러온다 (0) | 2015.03.04 |
L 유니코드32비트 1.1.19.03 (11) | 2015.02.21 |
암호화 , 복호화 프로그램 (20) | 2015.02.19 |