메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

Autoit GUI 컨트롤 스타일

데브카페
Devcafe (토론 | 기여)님의 2026년 5월 15일 (금) 17:51 판
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

GUI 컨트롤 스타일

  • 컨트롤 윈도우에 사용할 수 있는 일반 및 확장 스타일 목록과 컨트롤에 사용할 수 있는 특정 스타일 목록
  • 이러한 스타일은 많은 GUI 기능의 "style" 및/또는 "exStyle" 매개변수에 사용됩니다.
  • 이러한 값을 사용하려면 각 섹션의 상단에 지정된 파일을 #include해야 합니다.
    • 참고: "값"은 단지 참조용으로 제공됩니다.
      스크립트를 읽기 쉽게 유지하려면 항상 스타일의 "이름"을 사용해야 합니다.


일반적인 스타일

일반적인 스타일
일반적인 스타일 설명
#include <WindowsConstants.au3>
GUI 생성을 위한 기본값/강제 $GUI_SS_DEFAULT_GUI GUICreate 함수를 참조하세요.
$WS_BORDER 0x00800000 얇은 선 테두리가 있는 창을 만듭니다.
$WS_POPUP 0x80000000 팝업창을 생성합니다. 이 스타일은 WS_CHILD 스타일과 함께 사용할 수 없습니다.
$WS_CAPTION 0x00C00000 제목 표시줄(WS_BORDER 스타일 포함)이 있는 창을 만듭니다.
$WS_CLIPCHILDREN 0x02000000 상위 창 내에서 그리기가 발생할 때 하위 창이 차지하는 영역을 제외합니다. 이 스타일은 상위 창을 만들 때 사용됩니다.
$WS_CLIPSIBLINGS 0x04000000 자식 창을 서로 상대적으로 자릅니다. 즉, 특정 자식 창이 WM_PAINT 메시지를 받으면 WS_CLIPSIBLINGS 스타일은 업데이트할 자식 창 영역에서 다른 모든 겹치는 자식 창을 잘라냅니다. $WS_CLIPSIBLINGS가 지정되지 않고 자식 창이 겹치는 경우 자식 창의 클라이언트 영역 내에 그릴 때 인접한 자식 창의 클라이언트 영역 내에 그리는 것이 가능합니다.
$WS_DISABLED 0x08000000 처음에 비활성화된 창을 만듭니다.
$WS_DLGFRAME 0x00400000 일반적으로 대화 상자에 사용되는 스타일의 테두리가 있는 창을 만듭니다.
$WS_HSCROLL 0x00100000 가로 스크롤 막대가 있는 창을 만듭니다.
$WS_MAXIMIZE 0x01000000 처음에 최대화되는 창을 만듭니다.
$WS_MAXIMIZEBOX 0x00010000 최대화 버튼이 있는 창을 만듭니다. WS_EX_CONTEXTHELP 스타일과 결합할 수 없습니다. WS_SYSMENU 스타일도 지정해야 합니다.
$WS_MINIMIZE 0x20000000 처음에 최소화된 창을 만듭니다.
$WS_MINIMIZEBOX 0x00020000 최소화 버튼이 있는 창을 만듭니다. WS_EX_CONTEXTHELP 스타일과 결합할 수 없습니다. WS_SYSMENU 스타일도 지정해야 합니다.
$WS_OVERLAPPED 0x00000000 겹쳐진 창을 만듭니다. 겹쳐진 창에는 제목 표시줄과 테두리가 있습니다. WS_TILED 스타일과 동일합니다.
$WS_OVERLAPPEDWINDOW 0x00CF0000 WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX 및 WS_MAXIMIZEBOX 스타일을 사용하여 겹쳐진 창을 만듭니다. WS_TILEDWINDOW 스타일과 동일합니다.
$WS_POPUPWINDOW 0x80880000 WS_BORDER, WS_POPUP 및 WS_SYSMENU 스타일을 사용하여 팝업 창을 만듭니다. 창 메뉴를 표시하려면 WS_CAPTION 및 WS_POPUPWINDOW 스타일을 결합해야 합니다.
$WS_SIZEBOX 0x00040000 크기 조정 테두리가 있는 창을 만듭니다. WS_THICKFRAME 스타일과 동일합니다.
$WS_SYSMENU 0x00080000 제목 표시줄에 창 메뉴가 있는 창을 만듭니다. WS_CAPTION 스타일도 지정해야 합니다.
$WS_THICKFRAME 0x00040000 크기 조정 테두리가 있는 창을 만듭니다. WS_SIZEBOX 스타일과 동일
$WS_VSCROLL 0x00200000 수직 스크롤 막대가 있는 창을 만듭니다.
$WS_VISIBLE 0x10000000 처음에 표시되는 창을 만듭니다.
$WS_CHILD 0x40000000 자식 창을 만듭니다. 이 스타일의 창에는 메뉴 표시줄이 있을 수 없습니다. 이 스타일은 WS_POPUP 스타일과 함께 사용할 수 없습니다.
$WS_GROUP 0x00020000 컨트롤 그룹의 첫 번째 컨트롤을 지정합니다. 그룹은 이 첫 번째 컨트롤과 그 뒤에 정의된 모든 컨트롤, WS_GROUP 스타일을 사용하는 다음 컨트롤로 구성됩니다.
$WS_TABSTOP 0x00010000 컨트롤을 탭 정지로 전환하면 사용자가 대화 상자의 컨트롤을 탭하여 컨트롤을 선택할 수 있습니다.
$DS_MODALFRAME 0x00000080 WS_CAPTION 및 WS_SYSMENU 스타일을 지정하여 제목 표시줄 및 창 메뉴 와 결합할 수 있는 모달 대화 상자 프레임이 있는 대화 상자를 만듭니다 .
$DS_SETFOREGROUND 0x00000200 이 스타일은 소유자 창이 전경 창인지 여부에 관계없이 사용자의 즉각적인 주의가 필요한 모달 대화 상자에 유용합니다.
$DS_CONTEXTHELP 0x00002000 대화 상자의 제목 표시줄에 물음표를 포함합니다. WS_MAXIMIZEBOX 또는 WS_MINIMIZEBOX 스타일과 함께 사용할 수 없습니다. WS_EX_CONTEXTHELP 확장 스타일과 동일합니다.

푸시 버튼 스타일

사용자가 가장 가능성이 높은 옵션이나 기본값을 빠르게 선택할 수 있도록 하는 데 유용합니다.
푸시 버튼 스타일
푸시 버튼 스타일 설명
#include <ButtonConstants.au3>
기본/강제 GUICtrlCreateButton , GUICtrlCreateCheckbox , GUICtrlCreateRadio 함수를 참조하세요 .
$BS_BOTTOM 0x0800 버튼 직사각형의 아래쪽에 텍스트를 배치합니다.
$BS_CENTER 0x0300 텍스트를 버튼 직사각형의 가로 가운데에 맞춥니다.
$BS_MULTILINE 0x2000 텍스트 문자열이 너무 길어서 버튼 직사각형의 한 줄에 들어갈 수 없는 경우 버튼 텍스트를 여러 줄로 묶습니다.
$BS_TOP 0x0400 버튼 직사각형의 상단에 텍스트를 배치합니다.
$BS_VCENTER 0x0C00 버튼 직사각형의 텍스트를 세로 중앙에 맞춥니다.
$BS_ICON 0x0040 단추에 아이콘이 표시되도록 지정합니다.
$BS_BITMAP 0x0080 단추가 비트맵을 표시하도록 지정합니다.
$BS_FLAT 0x8000 버튼이 2차원임을 지정합니다. 3D 이미지를 생성하는 데 기본 음영 처리를 사용하지 않습니다.
$BS_NOTIFY 0x4000 BN_KILLFOCUS 및 BN_SETFOCUS 알림 메시지를 상위 창으로 보내는 버튼을 활성화합니다. 버튼은 이 스타일이 있는지 여부에 관계없이 BN_CLICKED 알림 메시지를 보냅니다. BN_DBLCLK 알림 메시지를 받으려면 버튼에 BS_RADIOBUTTON 또는 BS_OWNERDRAW 스타일이 있어야 합니다.

콤보(Combo ) 스타일

콤보 스타일
콤보 스타일 설명
#include <ComboConstants.au3>
기본/강제 $GUI_SS_DEFAULT_COMBO GUICtrlCreateCombo 함수를 참조하세요.
$CBS_AUTOHSCROLL 0x0040 사용자가 줄 끝에 문자를 입력하면 편집 컨트롤의 텍스트를 오른쪽으로 자동 스크롤합니다. 이 스타일이 설정되지 않으면 직사각형 경계 내에 맞는 텍스트만 활성화됩니다.
$CBS_DISABLENOSCROLL 0x0800 상자에 스크롤할 항목이 충분하지 않은 경우 목록 상자에 비활성화된 세로 스크롤 막대를 표시합니다. 이 스타일이 없으면 목록 상자에 항목이 충분하지 않으면 스크롤 막대가

숨겨집니다.

$CBS_DROPDOWN 0x0002 기본적으로 편집 컨트롤만 표시합니다. 사용자는 편집 컨트롤 옆에 있는 아이콘을 선택하여 목록 상자를 표시할 수 있습니다.
$CBS_DROPDOWNLIST 0x0003 목록 상자의 현재 선택 항목을 표시하는 정적 텍스트 필드를 표시합니다.
$CBS_LOWERCASE 0x4000 콤보 상자의 편집 컨트롤에 입력된 모든 대문자를 소문자로 변환합니다.
$CBS_NOINTEGRALHEIGHT 0x0400 콤보 상자가 콤보 상자를 만들 때 응용 프로그램에서 지정한 크기와 정확히 일치하도록 지정합니다. 일반적으로 Windows CE에서는 부분 항목을 표시하지 않도록 콤보 상자의 크기를

조정합니다.

$CBS_OEMCONVERT 0x0080 콤보 상자 편집 컨트롤에 입력된 텍스트를 Windows CE 문자 집합에서 OEM 문자 집합으로 변환한 다음 다시 Windows CE 문자 집합으로 변환합니다. 이 스타일은 파일 이름이 포함된 콤보 상자에

가장 유용합니다. CBS_DROPDOWN 스타일로 생성된 콤보 상자에만 적용됩니다.

$CBS_SIMPLE 0x0001 항상 목록 상자를 표시합니다. 목록 상자의 현재 선택 항목이 편집 컨트롤에 표시됩니다.
$CBS_SORT 0x0100 목록 상자에 입력된 문자열을 정렬합니다.
$CBS_UPPERCASE 0x2000 콤보 상자의 편집 컨트롤에 입력된 모든 소문자를 대문자로 변환합니다.


목록(List) 스타일

목록(List) 스타일
목록(List) 스타일 설명
#include <ListBoxConstants.au3>
기본/강제 $GUI_SS_DEFAULT_LIST GUICtrlCreateList 함수를 참조하세요.
$LBS_DISABLENOSCROLL 0x1000 상자에 스크롤할 항목이 충분하지 않은 경우 목록 상자에 대해 비활성화된 세로 스크롤 막대를 표시합니다. 이 스타일을 지정하지 않으면 목록 상자에 항목이 충분하지 않으면 스크롤

막대가 숨겨집니다.

$LBS_NOINTEGRALHEIGHT 0x0100 목록 상자가 목록 상자를 만들 때 응용 프로그램에서 지정한 크기와 정확히 일치하도록 지정합니다.
$LBS_NOSEL 0x4000 사용자가 목록 상자 문자열을 볼 수 있지만 선택할 수는 없도록 지정합니다.
$LBS_NOTIFY 0x0001 사용자가 목록 상자의 문자열을 탭하거나 두 번 탭하면 상위 창에 알립니다.
$LBS_SORT 0x0002 목록 상자의 문자열을 알파벳순으로 정렬합니다.
$LBS_STANDARD 0xA00003

LBS_SORT | WS_VSCROLL | WS_BORDER)

$LBS_USETABSTOPS 0x0080 문자열을 그릴 때 목록 상자가 탭 문자를 인식하고 확장할 수 있도록 합니다. 기본 탭 위치는 32개의 대화 상자 단위입니다. 대화 상자 단위는 현재 대화 상자 기본 너비 단위의 1/4과

같습니다.

Edit/Input 스타일

Progress Bar 스타일

Up-down 스타일

Label/Static 스타일


탭 스타일

이 스타일은 TCS_FIXEDWIDTH 스타일에만 사용할 수 있으며 TCS_FORCEICONLEFT 스타일을 의미합니다.
탭 스타일
탭 스타일 설명
#include <TabConstants.au3>
기본/강제 GUICtrlCreateTab 함수를 참조하세요 .
$TCS_SCROLLOPPOSITE 0x0001 탭을 선택하면 불필요한 탭이 컨트롤의 반대쪽으로 스크롤됩니다.
$TCS_BOTTOM 0x0002 컨트롤 하단에 탭이 나타납니다. 이 값은 TCS_RIGHT와 같습니다. comctl32.dll 버전 6을 사용하는 경우 이 스타일은 지원되지 않습니다.
$TCS_RIGHT 0x0002 탭은 TCS_VERTICAL 스타일을 사용하는 컨트롤의 오른쪽에 세로로 나타납니다. 이 값은 TCS_BOTTOM과 같습니다. 비주얼 스타일을 사용하는 경우 이 스타일은 지원되지 않습니다.
$TCS_MULTISELECT 0x0004 Ctrl 키를 누른 채 클릭하면 여러 탭을 선택할 수 있습니다 . 이 스타일은 TCS_BUTTONS 스타일과 함께 사용해야 합니다.
$TCS_FLATBUTTONS 0x0008 선택한 탭은 배경에 들여쓰기되어 나타나는 반면 다른 탭은 배경과 동일한 평면에 있는 것으로 나타납니다. 이 스타일은 TCS_BUTTONS 스타일이 있는 탭 컨트롤에만 영향을 미칩니다.
$TCS_FORCEICONLEFT 0x0010 아이콘은 각 고정 너비 탭의 왼쪽 가장자리에 맞춰 정렬됩니다. 이 스타일은 TCS_FIXEDWIDTH 스타일에만 사용할 수 있습니다.
$TCS_FORCELABELLEFT 0x0020 레이블은 각 고정 너비 탭의 왼쪽 가장자리에 맞춰 정렬됩니다. 즉, 레이블은 중앙에 위치하지 않고 아이콘 바로 오른쪽에 표시됩니다.
$TCS_HOTTRACK 0x0040 포인터 아래의 항목이 자동으로 강조 표시됩니다.
$TCS_VERTICAL 0x0080 탭은 컨트롤의 왼쪽에 나타나며 탭 텍스트는 세로로 표시됩니다. 이 스타일은 TCS_MULTILINE 스타일과 함께 사용되는 경우에만 유효합니다. 컨트롤의 오른쪽에 탭이 나타나도록 하려면 TCS_RIGHT 스타일도 사용하세요. comctl32.dll 버전 6을 사용하는 경우 이 스타일은 지원되지 않습니다.
$TCS_TABS 0x0000 탭은 탭으로 나타나고 표시 영역 주위에 테두리가 그려집니다. 이 스타일이 기본값입니다.
$TCS_BUTTONS 0x0100 탭은 버튼으로 나타나며 표시 영역 주위에는 테두리가 그려지지 않습니다.
$TCS_SINGLELINE 0x0000 한 행의 탭만 표시됩니다. 필요한 경우 사용자는 스크롤하여 더 많은 탭을 볼 수 있습니다. 이 스타일이 기본값입니다.
$TCS_MULTILINE 0x0200 필요한 경우 여러 행의 탭이 표시되므로 모든 탭을 한 번에 볼 수 있습니다.
$TCS_RIGHTJUSTIFY 0x0000 필요한 경우 각 탭의 너비가 늘어나서 탭의 각 행이 탭 컨트롤의 전체 너비를 채웁니다.

TCS_MULTILINE 스타일도 지정하지 않으면 이 창 스타일은 무시됩니다.

$TCS_FIXEDWIDTH 0x0400 모든 탭의 너비는 동일합니다. 이 스타일은 TCS_RIGHTJUSTIFY 스타일과 결합할 수 없습니다.
$TCS_RAGGEDRIGHT 0x0800 탭 행은 컨트롤의 전체 너비를 채우기 위해 늘어나지 않습니다. 이 스타일이 기본값입니다.
$TCS_FOCUSONBUTTONDOWN 0x1000 탭 컨트롤을 클릭하면 입력 포커스를 받습니다.
$TCS_OWNERDRAWFIXED 0x2000 상위 창은 탭 그리기를 담당합니다.
$TCS_TOOLTIPS 0x4000 탭 컨트롤에는 연결된 도구 설명 컨트롤이 있습니다.
$TCS_FOCUSNEVER 0x8000 탭 컨트롤을 클릭해도 입력 포커스가 수신되지 않습니다.

Avi 클립 스타일

Avi 클립 스타일
Avi 클립 스타일 설명
#include <AVIConstants.au3>
기본/강제 $GUI_SS_DEFAULT_AVI GUICtrlCreateAvi 함수를 참조하세요.
$ACS_AUTOPLAY 0x04 AVI 클립이 열리자마자 애니메이션 재생을 시작합니다.
$ACS_CENTER 0x01 애니메이션 컨트롤 창의 중앙에 애니메이션을 배치합니다.
$ACS_TRANSPARENT 0x02 애니메이션의 배경색을 기본 창의 배경색과 일치시켜 "투명한" 배경을 만들 수 있습니다. (기본값)
$ACS_NONTRASPARENT 0x10 기본 ACS_TRANSPARENT를 재정의하려면

Date 스타일

월달력(MonthCal) 스타일

월 달력(MonthCal) 스타일
월 달력(MonthCal) 스타일 설명
#include <DateTimeConstants.au3>
기본/강제 GUICtrlCreateMonthCal 함수를 참조하세요 .
$MCS_NOTODAY 0x10 월 달력 컨트롤은 컨트롤 아래쪽에 "오늘" 날짜를 표시하지 않습니다.
$MCS_NOTODAYCIRCLE 0x08 월 달력 컨트롤은 "오늘" 날짜를 표시하지 않습니다.
$MCS_WEEKNUMBERS 0x04 월 달력 컨트롤은 각 날짜 행의 왼쪽에 주 번호(1-52)를 표시합니다. 1주는 최소 4일이 포함된 첫 번째 주로 정의됩니다.

TreeView 스타일

슬라이더 스타일

슬라이더 스타일
슬라이더 스타일 설명
#include <SliderConstants.au3>
기본/강제 $GUI_SS_DEFAULT_SLIDER GUICtrlCreateSlider 함수를 참조하세요.
$TBS_AUTOTICKS 0x0001 TBM_SETRANGE 메시지를 사용하여 트랙바에 범위를 설정할 때 눈금 표시를 추가합니다.
$TBS_BOTH 0x0008 트랙바 양쪽에 체크 표시를 합니다.
$TBS_BOTTOM 0x0000 수평 트랙바 하단에 체크 표시를 합니다.
$TBS_HORZ 0x0000 수평 트랙바를 지정합니다. 이것이 기본값입니다.
$TBS_VERT 0x0002 수직 트랙바의 왼쪽에 체크 표시를 합니다.
$TBS_NOTHUMB 0x0080 트랙바에 슬라이더가 없도록 지정합니다.
$TBS_NOTICKS 0x0010 트랙바에 체크 표시가 없도록 지정합니다.
$TBS_LEFT 0x0004 수직 트랙바의 왼쪽에 체크 표시를 합니다.
$TBS_RIGHT 0x0000 수직 트랙바의 오른쪽에 체크 표시를 합니다.
$TBS_TOP 0x0004 수평 트랙바 상단에 체크 표시를 합니다.

ListView 스타일

ListView 스타일
ListView 스타일 설명
#include <ListViewConstants.au3>
기본/강제 $GUI_SS_DEFAULT_LISTVIEW GUICtrlCreateListView 함수를 참조하세요.
$LVS_ICON 0x0000 이 스타일은 아이콘 보기를 지정합니다.
$LVS_REPORT 0x0001 이 스타일은 보고서 보기를 지정합니다.
$LVS_SMALLICON 0x0002 이 스타일은 작은 아이콘 보기를 지정합니다.
$LVS_LIST 0x0003 이 스타일은 목록 보기를 지정합니다.
$LVS_EDITLABELS 0x0200 항목 텍스트를 그 자리에서 편집할 수 있습니다.
$LVS_NOCOLUMNHEADER 0x4000 열 헤더는 보고서 보기에 표시되지 않습니다. 기본적으로 보고서 보기의 열에는 헤더가 있습니다.
$LVS_NOSORTHEADER 0x8000 열 헤더는 버튼처럼 작동하지 않습니다. 보고서 보기에서 열 헤더를 클릭해도 정렬 등의 작업이 수행되지 않는 경우 이 스타일을 사용할 수 있습니다.
$LVS_SINGLESEL 0x0004 한 번에 하나의 항목만 선택할 수 있습니다.
$LVS_SHOWSE항상 0x0008 컨트롤에 포커스가 없더라도 선택 항목이 항상 표시됩니다.
$LVS_SORTASCENDING 0x0010 항목 색인은 항목 텍스트를 기준으로 오름차순으로 정렬됩니다.
$LVS_SORTDESCENDING 0x0020 항목 색인은 항목 텍스트를 기준으로 내림차순으로 정렬됩니다.
$LVS_NOLABELWRAP 0x0080 항목 텍스트는 아이콘 보기에서 한 줄로 표시됩니다. 기본적으로 항목 텍스트는 아이콘 보기에서 줄 바꿈될 수 있습니다.

ListView 확장 스타일

ListView 확장 스타일
ListView 확장 스타일 설명
#include <ListViewConstants.au3>
$LVS_EX_FULLROWSELECT 0x00000020 항목을 선택하면 해당 항목과 해당 하위 항목이 모두 강조 표시됩니다.
$LVS_EX_GRIDLINES 0x00000001 항목 및 하위 항목 주위에 눈금선을 표시합니다.
$LVS_EX_HEADERDRAGDROP 0x00000010 목록 보기 컨트롤에서 끌어서 놓기 방식으로 열 순서를 변경할 수 있습니다.
$LVS_EX_TRACKSELECT 0x00000008 목록 보기 컨트롤에서 핫트랙 선택을 활성화합니다. 핫트랙 선택은 커서가 해당 항목 위에 일정 시간 동안 머무르면 해당 항목이 자동으로 선택되는 것을 의미합니다.
$LVS_EX_CHECKBOXES 0x00000004 목록 보기 컨트롤의 항목에 대한 확인란을 활성화합니다.
$LVS_EX_BORDERSELECT 0x00008000 이 스타일을 설정하면 항목을 선택할 때 항목이 강조 표시되는 대신 항목의 테두리 색상이 변경됩니다.
$LVS_EX_DOUBLEBUFFER 0x00010000 깜박임을 줄이는 이중 버퍼링을 통해 페인트합니다. 이 확장된 스타일은 지원되는 시스템에서 알파 블렌드 선택 윤곽 선택도 가능하게 합니다.
$LVS_EX_FLATSB 0x00000100 목록 보기에서 평면 스크롤 막대를 활성화합니다.
$LVS_EX_MULTIWORKAREAS 0x00002000 컨트롤은 하나 이상의 작업 영역이 정의될 때까지 아이콘을 자동 정렬하지 않습니다.
$LVS_EX_SNAPTOGRID 0x00080000 아이콘 보기에서 아이콘은 자동으로 그리드에 맞춰집니다.
$LVS_EX_SUBITEMIMAGES 0x00000002 하위 항목에 대한 이미지를 표시할 수 있습니다.
$LVS_EX_INFOTIP 0x00000400 항목이 완전히 표시되지 않을 때 도구 설명을 표시합니다. $LVN_GETINFOTIP에 알림 메시지를 보냅니다.

플랫 버튼 스타일

    1. 1. BS_FLAT 스타일 (가장 간단)

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

$hGUI = GUICreate("Flat Button", 300, 200)
GUISetBkColor(0xFFFFFF)

$hBtn = GUICtrlCreateButton("클릭", 50, 50, 200, 40, $BS_FLAT)

GUISetState()
While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd


3D 테두리가 제거되지만, 마우스 오버 시 테두리가 살아나서 완전한 플랫은 아닙니다.

    1. 2. Label + 색상 조합 (완전 플랫)

#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

$hGUI = GUICreate("Flat Button", 400, 300)
GUISetBkColor(0xFFFFFF)

; 버튼처럼 동작하는 Label
$hBtn1 = _CREATE_FLAT_BUTTON("저장",    30,  50, 150, 45, 0x2196F3, 0xFFFFFF)
$hBtn2 = _CREATE_FLAT_BUTTON("취소",   210,  50, 150, 45, 0xF44336, 0xFFFFFF)
$hBtn3 = _CREATE_FLAT_BUTTON("설정",    30, 120, 150, 45, 0x4CAF50, 0xFFFFFF)
$hBtn4 = _CREATE_FLAT_BUTTON("닫기",   210, 120, 150, 45, 0x757575, 0xFFFFFF)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $hBtn1
            MsgBox(0, "", "저장 클릭")
        Case $hBtn2
            MsgBox(0, "", "취소 클릭")
        Case $hBtn3
            MsgBox(0, "", "설정 클릭")
        Case $hBtn4
            MsgBox(0, "", "닫기 클릭")
    EndSwitch
WEnd

Func _CREATE_FLAT_BUTTON($sText, $iX, $iY, $iW, $iH, $iBgColor, $iFontColor)
    Local $hLabel = GUICtrlCreateLabel($sText, $iX, $iY, $iW, $iH, _
            BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetBkColor($hLabel, $iBgColor)
    GUICtrlSetColor($hLabel, $iFontColor)
    GUICtrlSetFont($hLabel, 11, 600, 0, "맑은 고딕")
    GUICtrlSetCursor($hLabel, 0)  ; 손가락 커서
    Return $hLabel
EndFunc
    1. 3. GDI+ Owner-Draw (호버 효과 포함)

#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <StaticConstants.au3>

Global Const $FLAT_COLOR_NORMAL  = 0xFF2196F3  ; 파란색
Global Const $FLAT_COLOR_HOVER   = 0xFF1976D2  ; 진한 파란색
Global Const $FLAT_COLOR_PRESS   = 0xFF0D47A1  ; 더 진한 파란색
Global Const $FLAT_COLOR_TEXT    = 0xFFFFFFFF  ; 흰색

Global $g_aBtns[0][6]  ; [n][CtrlID, X, Y, W, H, Text]
Global $g_iHoverIdx = -1
Global $g_iPressIdx = -1
Global $g_hGUI

_GDIPlus_Startup()

$g_hGUI = GUICreate("GDI+ Flat Buttons", 400, 300)
GUISetBkColor(0xF5F5F5)

; GDI+ 그리기용 Pic 컨트롤 (전체 영역)
Global $g_hPic = GUICtrlCreatePic("", 0, 0, 400, 300)
GUICtrlSetState($g_hPic, $GUI_DISABLE)

; 버튼 등록
_ADD_FLAT_BUTTON(30,   50, 150, 45, "저장")
_ADD_FLAT_BUTTON(210,  50, 150, 45, "취소")
_ADD_FLAT_BUTTON(30,  120, 150, 45, "설정")
_ADD_FLAT_BUTTON(210, 120, 150, 45, "닫기")

_DRAW_ALL_BUTTONS()

GUISetState()
GUIRegisterMsg($WM_MOUSEMOVE, "_WM_MOUSEMOVE")
GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_LBUTTONDOWN")
GUIRegisterMsg($WM_LBUTTONUP, "_WM_LBUTTONUP")

While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd

_GDIPlus_Shutdown()

; ── 버튼 추가 ──
Func _ADD_FLAT_BUTTON($iX, $iY, $iW, $iH, $sText)
    Local $iIdx = UBound($g_aBtns)
    ReDim $g_aBtns[$iIdx + 1][6]
    $g_aBtns[$iIdx][0] = $iIdx
    $g_aBtns[$iIdx][1] = $iX
    $g_aBtns[$iIdx][2] = $iY
    $g_aBtns[$iIdx][3] = $iW
    $g_aBtns[$iIdx][4] = $iH
    $g_aBtns[$iIdx][5] = $sText
EndFunc

; ── 전체 버튼 그리기 ──
Func _DRAW_ALL_BUTTONS()
    Local $hBitmap = _GDIPlus_BitmapCreateFromScan0(400, 300)
    Local $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hGfx, 4)
    _GDIPlus_GraphicsSetTextRenderingHint($hGfx, 5)
    _GDIPlus_GraphicsClear($hGfx, 0xFFF5F5F5)

    Local $hFontFamily = _GDIPlus_FontFamilyCreate("맑은 고딕")
    Local $hFont = _GDIPlus_FontCreate($hFontFamily, 12, 1)
    Local $hFormat = _GDIPlus_StringFormatCreate()
    _GDIPlus_StringFormatSetAlign($hFormat, 1)      ; 가로 중앙
    _GDIPlus_StringFormatSetLineAlign($hFormat, 1)   ; 세로 중앙

    Local $hTextBrush = _GDIPlus_BrushCreateSolid($FLAT_COLOR_TEXT)

    For $i = 0 To UBound($g_aBtns) - 1
        ; 상태별 색상 결정
        Local $iColor = $FLAT_COLOR_NORMAL
        If $i = $g_iPressIdx Then
            $iColor = $FLAT_COLOR_PRESS
        ElseIf $i = $g_iHoverIdx Then
            $iColor = $FLAT_COLOR_HOVER
        EndIf

        ; 둥근 사각형 배경
        Local $hPath = _GDIPlus_PathCreate()
        Local $r = 8  ; 둥근 반지름
        Local $bX = $g_aBtns[$i][1], $bY = $g_aBtns[$i][2]
        Local $bW = $g_aBtns[$i][3], $bH = $g_aBtns[$i][4]
        _GDIPlus_PathAddArc($hPath, $bX, $bY, $r * 2, $r * 2, 180, 90)
        _GDIPlus_PathAddArc($hPath, $bX + $bW - $r * 2, $bY, $r * 2, $r * 2, 270, 90)
        _GDIPlus_PathAddArc($hPath, $bX + $bW - $r * 2, $bY + $bH - $r * 2, $r * 2, $r * 2, 0, 90)
        _GDIPlus_PathAddArc($hPath, $bX, $bY + $bH - $r * 2, $r * 2, $r * 2, 90, 90)
        _GDIPlus_PathCloseFigure($hPath)

        Local $hBrush = _GDIPlus_BrushCreateSolid($iColor)
        _GDIPlus_GraphicsFillPath($hGfx, $hPath, $hBrush)
        _GDIPlus_BrushDispose($hBrush)
        _GDIPlus_PathDispose($hPath)

        ; 텍스트
        Local $tRect = _GDIPlus_RectFCreate($bX, $bY, $bW, $bH)
        _GDIPlus_GraphicsDrawStringEx($hGfx, $g_aBtns[$i][5], $hFont, $tRect, $hFormat, $hTextBrush)
    Next

    ; Pic에 적용
    Local $hHBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _WinAPI_DeleteObject(GUICtrlSendMsg($g_hPic, 0x0172, 0, $hHBmp))  ; STM_SETIMAGE
    _WinAPI_DeleteObject($hHBmp)

    _GDIPlus_BrushDispose($hTextBrush)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFontFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_GraphicsDispose($hGfx)
    _GDIPlus_BitmapDispose($hBitmap)
EndFunc

; ── 마우스 위치로 버튼 인덱스 찾기 ──
Func _HIT_TEST($iMX, $iMY)
    For $i = 0 To UBound($g_aBtns) - 1
        If $iMX >= $g_aBtns[$i][1] And $iMX <= $g_aBtns[$i][1] + $g_aBtns[$i][3] And _
           $iMY >= $g_aBtns[$i][2] And $iMY <= $g_aBtns[$i][2] + $g_aBtns[$i][4] Then
            Return $i
        EndIf
    Next
    Return -1
EndFunc

; ── 마우스 이동 ──
Func _WM_MOUSEMOVE($hWnd, $iMsg, $wParam, $lParam)
    Local $iMX = BitAND($lParam, 0xFFFF)
    Local $iMY = BitShift(BitAND($lParam, 0xFFFF0000), 16)
    Local $iIdx = _HIT_TEST($iMX, $iMY)
    If $iIdx <> $g_iHoverIdx Then
        $g_iHoverIdx = $iIdx
        _DRAW_ALL_BUTTONS()
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc

; ── 마우스 누름 ──
Func _WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
    Local $iMX = BitAND($lParam, 0xFFFF)
    Local $iMY = BitShift(BitAND($lParam, 0xFFFF0000), 16)
    $g_iPressIdx = _HIT_TEST($iMX, $iMY)
    If $g_iPressIdx >= 0 Then _DRAW_ALL_BUTTONS()
    Return $GUI_RUNDEFMSG
EndFunc

; ── 마우스 뗌 ──
Func _WM_LBUTTONUP($hWnd, $iMsg, $wParam, $lParam)
    Local $iMX = BitAND($lParam, 0xFFFF)
    Local $iMY = BitShift(BitAND($lParam, 0xFFFF0000), 16)
    Local $iIdx = _HIT_TEST($iMX, $iMY)
    If $iIdx >= 0 And $iIdx = $g_iPressIdx Then
        ; 버튼 클릭 이벤트
        MsgBox(0, "클릭", $g_aBtns[$iIdx][5] & " 버튼 클릭!")
    EndIf
    $g_iPressIdx = -1
    _DRAW_ALL_BUTTONS()
    Return $GUI_RUNDEFMSG
EndFunc


세 방식의 차이를 정리하면 다음과 같습니다.

    • 방법 1 (BS_FLAT)** — 코드 한 줄이면 되지만 Windows 기본 버튼 렌더링에 의존하므로 완전한 플랫이 아닙니다. 마우스 오버 시 3D 테두리가 나타납니다.
    • 방법 2 (Label 활용)** — Label에 배경색과 폰트색을 입히는 방식으로, 코드가 간결하면서도 완전 플랫합니다. 다만 호버/프레스 시 색상 변화를 주려면 타이머나 메시지 처리를 추가해야 합니다.
    • 방법 3 (GDI+ Owner-Draw)** — 가장 자유도가 높습니다. 둥근 모서리, 호버 색상 변화, 프레스 효과까지 완전히 커스텀 가능합니다. 코드량이 많지만 SQL*KEY처럼 UI를 세밀하게 제어해야 하는 프로그램에 적합합니다.


플랫한 버튼 스타일 예제


#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>

; ── Tab Control 스타일 상수 ──
Global Const $TCS_MULTILINE      = 0x0200
Global Const $TCS_BUTTONS        = 0x0100
Global Const $TCS_FLATBUTTONS    = 0x0008
Global Const $TCS_OWNERDRAWFIXED = 0x2000
Global Const $ODT_TAB            = 101
Global Const $ODS_SELECTED       = 0x0001

; ── 색상 설정 ──
Global Const $CLR_TAB_SELECTED_BG   = 0x2196F3  ; 선택된 탭 배경 (파란색)
Global Const $CLR_TAB_SELECTED_TEXT  = 0xFFFFFF  ; 선택된 탭 텍스트 (흰색)
Global Const $CLR_TAB_NORMAL_BG     = 0xE0E0E0  ; 일반 탭 배경 (밝은 회색)
Global Const $CLR_TAB_NORMAL_TEXT   = 0x333333  ; 일반 탭 텍스트 (진한 회색)
Global Const $CLR_TAB_HOVER_BG      = 0xBBDEFB  ; 호버 탭 배경 (연한 파란색)
Global Const $CLR_TAB_HOVER_TEXT    = 0x1565C0  ; 호버 탭 텍스트
Global Const $CLR_GUI_BG            = 0xFAFAFA  ; GUI 배경
Global Const $CLR_CONTENT_BG        = 0xFFFFFF  ; 탭 콘텐츠 영역 배경

; ── 폰트 설정 ──
Global Const $TAB_FONT_NAME = "맑은 고딕"
Global Const $TAB_FONT_SIZE = 10

; ── 탭 데이터 ──
Global $g_aTabNames[] = [ _
    "환경설정", "단축키 관리", "실행파일", "후킹설정", _
    "Direct Key", "매크로", "히스토리", "도움말" _
]

Global $g_hGUI, $g_hTab
Global $g_aTabItems[UBound($g_aTabNames)]
Global $g_aTabLabels[UBound($g_aTabNames)]  ; 탭별 콘텐츠 라벨
Global $g_iHoverTab = -1

; ── GUI 생성 ──
$g_hGUI = GUICreate("SQL*KEY - Flat Tab Demo", 700, 500)
GUISetBkColor($CLR_GUI_BG)
GUISetFont($TAB_FONT_SIZE, 400, 0, $TAB_FONT_NAME)

; ── Tab 컨트롤 생성 ──
; TCS_OWNERDRAWFIXED: 직접 그리기
; TCS_BUTTONS: 버튼 스타일
; TCS_MULTILINE: 다중 행
; TCS_FLATBUTTONS: 플랫 버튼 (owner-draw와 함께 사용)
$g_hTab = GUICtrlCreateTab(10, 10, 680, 480, _
        BitOR($TCS_OWNERDRAWFIXED, $TCS_BUTTONS, $TCS_MULTILINE, $TCS_FLATBUTTONS))
GUICtrlSetFont($g_hTab, $TAB_FONT_SIZE, 400, 0, $TAB_FONT_NAME)

; ── TabItem 생성 ──
For $i = 0 To UBound($g_aTabNames) - 1
    $g_aTabItems[$i] = GUICtrlCreateTabItem($g_aTabNames[$i])

    ; 각 탭의 콘텐츠 예시
    $g_aTabLabels[$i] = GUICtrlCreateLabel( _
            "[ " & $g_aTabNames[$i] & " ] 탭 콘텐츠 영역", _
            30, 80, 640, 380)
    GUICtrlSetFont($g_aTabLabels[$i], 14, 400, 0, $TAB_FONT_NAME)
    GUICtrlSetColor($g_aTabLabels[$i], 0x757575)
    GUICtrlSetBkColor($g_aTabLabels[$i], $CLR_CONTENT_BG)
Next
GUICtrlCreateTabItem("")  ; 탭 아이템 종료

; ── WM_DRAWITEM 등록 (탭 커스텀 그리기) ──
GUIRegisterMsg($WM_DRAWITEM, "_WM_DRAWITEM")

; ── WM_MOUSEMOVE 등록 (호버 효과) ──
GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

GUISetState(@SW_SHOW)

; ── 메인 루프 ──
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

; ══════════════════════════════════════════════════════
; WM_DRAWITEM 핸들러 - 탭을 플랫 스타일로 직접 그리기
; ══════════════════════════════════════════════════════
Func _WM_DRAWITEM($hWnd, $iMsg, $wParam, $lParam)
    ; DRAWITEMSTRUCT 구조체 파싱
    Local $tDRAWITEM = DllStructCreate( _
            "uint CtlType;" & _
            "uint CtlID;" & _
            "uint itemID;" & _
            "uint itemAction;" & _
            "uint itemState;" & _
            "hwnd hwndItem;" & _
            "handle hDC;" & _
            "long rcLeft;long rcTop;long rcRight;long rcBottom;" & _
            "ulong_ptr itemData", _
            $lParam)

    Local $iCtlType  = DllStructGetData($tDRAWITEM, "CtlType")
    If $iCtlType <> $ODT_TAB Then Return $GUI_RUNDEFMSG

    Local $iItemID   = DllStructGetData($tDRAWITEM, "itemID")
    Local $iState    = DllStructGetData($tDRAWITEM, "itemState")
    Local $hDC       = DllStructGetData($tDRAWITEM, "hDC")
    Local $iLeft     = DllStructGetData($tDRAWITEM, "rcLeft")
    Local $iTop      = DllStructGetData($tDRAWITEM, "rcTop")
    Local $iRight    = DllStructGetData($tDRAWITEM, "rcRight")
    Local $iBottom   = DllStructGetData($tDRAWITEM, "rcBottom")

    Local $bSelected = BitAND($iState, $ODS_SELECTED)

    ; ── 색상 결정 ──
    Local $iBgColor, $iTextColor
    If $bSelected Then
        $iBgColor   = $CLR_TAB_SELECTED_BG
        $iTextColor = $CLR_TAB_SELECTED_TEXT
    ElseIf $iItemID = $g_iHoverTab Then
        $iBgColor   = $CLR_TAB_HOVER_BG
        $iTextColor = $CLR_TAB_HOVER_TEXT
    Else
        $iBgColor   = $CLR_TAB_NORMAL_BG
        $iTextColor = $CLR_TAB_NORMAL_TEXT
    EndIf

    ; ── 배경 채우기 (1px 간격으로 버튼 분리) ──
    Local $tRect = DllStructCreate("long Left;long Top;long Right;long Bottom")
    DllStructSetData($tRect, "Left",   $iLeft + 1)
    DllStructSetData($tRect, "Top",    $iTop + 1)
    DllStructSetData($tRect, "Right",  $iRight - 1)
    DllStructSetData($tRect, "Bottom", $iBottom - 1)

    Local $hBrush = _WinAPI_CreateSolidBrush($iBgColor)
    _WinAPI_FillRect($hDC, $tRect, $hBrush)
    _WinAPI_DeleteObject($hBrush)

    ; ── 선택된 탭 하단 액센트 라인 ──
    If $bSelected Then
        Local $tAccent = DllStructCreate("long Left;long Top;long Right;long Bottom")
        DllStructSetData($tAccent, "Left",   $iLeft + 1)
        DllStructSetData($tAccent, "Top",    $iBottom - 4)
        DllStructSetData($tAccent, "Right",  $iRight - 1)
        DllStructSetData($tAccent, "Bottom", $iBottom - 1)
        Local $hAccentBrush = _WinAPI_CreateSolidBrush(0x0D47A1)  ; 진한 파란 액센트
        _WinAPI_FillRect($hDC, $tAccent, $hAccentBrush)
        _WinAPI_DeleteObject($hAccentBrush)
    EndIf

    ; ── 텍스트 그리기 ──
    Local $sText = ""
    If $iItemID >= 0 And $iItemID < UBound($g_aTabNames) Then
        $sText = $g_aTabNames[$iItemID]
    EndIf

    ; 폰트 생성
    Local $hFont = _WinAPI_CreateFont($TAB_FONT_SIZE + 3, 0, 0, 0, _
            ($bSelected ? 700 : 400), _  ; 선택 시 Bold
            False, False, False, _
            $DEFAULT_CHARSET, 0, 0, 5, 0, $TAB_FONT_NAME)
    Local $hOldFont = _WinAPI_SelectObject($hDC, $hFont)

    ; 텍스트 색상 및 배경 모드
    DllCall("gdi32.dll", "int", "SetBkMode", "handle", $hDC, "int", 1)  ; TRANSPARENT
    DllCall("gdi32.dll", "int", "SetTextColor", "handle", $hDC, _
            "int", $iTextColor)

    ; 텍스트 중앙 정렬 출력
    Local $tTextRect = DllStructCreate("long Left;long Top;long Right;long Bottom")
    DllStructSetData($tTextRect, "Left",   $iLeft)
    DllStructSetData($tTextRect, "Top",    $iTop)
    DllStructSetData($tTextRect, "Right",  $iRight)
    DllStructSetData($tTextRect, "Bottom", $iBottom)

    ; DT_CENTER=1, DT_VCENTER=4, DT_SINGLELINE=32
    DllCall("user32.dll", "int", "DrawTextW", _
            "handle", $hDC, _
            "wstr", $sText, _
            "int", -1, _
            "struct*", $tTextRect, _
            "uint", BitOR(1, 4, 32))

    _WinAPI_SelectObject($hDC, $hOldFont)
    _WinAPI_DeleteObject($hFont)

    Return True  ; 그리기 처리 완료
EndFunc

; ══════════════════════════════════════════════════════
; WM_NOTIFY 핸들러 - 호버 효과를 위한 마우스 추적
; ══════════════════════════════════════════════════════
Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR = DllStructCreate("hwnd hWndFrom;uint_ptr IDFrom;int Code", $lParam)
    Local $iCode = DllStructGetData($tNMHDR, "Code")

    ; TCN_SELCHANGE = -551 (탭 변경 시 강제 다시 그리기)
    If $iCode = -551 Then
        _WinAPI_InvalidateRect(GUICtrlGetHandle($g_hTab))
    EndIf

    Return $GUI_RUNDEFMSG
EndFunc

; ══════════════════════════════════════════════════════
; WinAPI 보조 함수
; ══════════════════════════════════════════════════════
Func _WinAPI_CreateSolidBrush($iColor)
    Local $aRet = DllCall("gdi32.dll", "handle", "CreateSolidBrush", "int", $iColor)
    Return $aRet[0]
EndFunc

Func _WinAPI_FillRect($hDC, $tRect, $hBrush)
    DllCall("user32.dll", "int", "FillRect", "handle", $hDC, "struct*", $tRect, "handle", $hBrush)
EndFunc

Comments