<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://devcafe.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%EB%B2%84%ED%8A%BC_%EC%8A%A4%ED%83%80%EC%9D%BC</id>
	<title>버튼 스타일 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://devcafe.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%EB%B2%84%ED%8A%BC_%EC%8A%A4%ED%83%80%EC%9D%BC"/>
	<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=%EB%B2%84%ED%8A%BC_%EC%8A%A4%ED%83%80%EC%9D%BC&amp;action=history"/>
	<updated>2026-05-17T10:42:42Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=%EB%B2%84%ED%8A%BC_%EC%8A%A4%ED%83%80%EC%9D%BC&amp;diff=2407&amp;oldid=prev</id>
		<title>2026년 5월 15일 (금) 08:59에 Devcafe님의 편집</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=%EB%B2%84%ED%8A%BC_%EC%8A%A4%ED%83%80%EC%9D%BC&amp;diff=2407&amp;oldid=prev"/>
		<updated>2026-05-15T08:59:31Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://devcafe.co.kr/w/index.php?title=%EB%B2%84%ED%8A%BC_%EC%8A%A4%ED%83%80%EC%9D%BC&amp;amp;diff=2407&amp;amp;oldid=2406&quot;&gt;차이 보기&lt;/a&gt;</summary>
		<author><name>Devcafe</name></author>
	</entry>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=%EB%B2%84%ED%8A%BC_%EC%8A%A4%ED%83%80%EC%9D%BC&amp;diff=2406&amp;oldid=prev</id>
		<title>Devcafe: 새 문서: == 플랫 버튼 스타일 ==  ## 1. BS_FLAT 스타일 (가장 간단)  &lt;source lang=autoit&gt;  #include &lt;GUIConstantsEx.au3&gt; #include &lt;ButtonConstants.au3&gt;  $hGUI = GUICreate(&quot;Flat Button&quot;, 300, 200) GUISetBkColor(0xFFFFFF)  $hBtn = GUICtrlCreateButton(&quot;클릭&quot;, 50, 50, 200, 40, $BS_FLAT)  GUISetState() While GUIGetMsg() &lt;&gt; $GUI_EVENT_CLOSE WEnd &lt;/source&gt;   3D 테두리가 제거되지만, 마우스 오버 시 테두리가 살아나서 완전한 플랫은 아닙니다.  ## 2. Lab...</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=%EB%B2%84%ED%8A%BC_%EC%8A%A4%ED%83%80%EC%9D%BC&amp;diff=2406&amp;oldid=prev"/>
		<updated>2026-05-15T08:53:03Z</updated>

		<summary type="html">&lt;p&gt;새 문서: == 플랫 버튼 스타일 ==  ## 1. BS_FLAT 스타일 (가장 간단)  &amp;lt;source lang=autoit&amp;gt;  #include &amp;lt;GUIConstantsEx.au3&amp;gt; #include &amp;lt;ButtonConstants.au3&amp;gt;  $hGUI = GUICreate(&amp;quot;Flat Button&amp;quot;, 300, 200) GUISetBkColor(0xFFFFFF)  $hBtn = GUICtrlCreateButton(&amp;quot;클릭&amp;quot;, 50, 50, 200, 40, $BS_FLAT)  GUISetState() While GUIGetMsg() &amp;lt;&amp;gt; $GUI_EVENT_CLOSE WEnd &amp;lt;/source&amp;gt;   3D 테두리가 제거되지만, 마우스 오버 시 테두리가 살아나서 완전한 플랫은 아닙니다.  ## 2. Lab...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 플랫 버튼 스타일 ==&lt;br /&gt;
&lt;br /&gt;
## 1. BS_FLAT 스타일 (가장 간단)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=autoit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;GUIConstantsEx.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;ButtonConstants.au3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$hGUI = GUICreate(&amp;quot;Flat Button&amp;quot;, 300, 200)&lt;br /&gt;
GUISetBkColor(0xFFFFFF)&lt;br /&gt;
&lt;br /&gt;
$hBtn = GUICtrlCreateButton(&amp;quot;클릭&amp;quot;, 50, 50, 200, 40, $BS_FLAT)&lt;br /&gt;
&lt;br /&gt;
GUISetState()&lt;br /&gt;
While GUIGetMsg() &amp;lt;&amp;gt; $GUI_EVENT_CLOSE&lt;br /&gt;
WEnd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3D 테두리가 제거되지만, 마우스 오버 시 테두리가 살아나서 완전한 플랫은 아닙니다.&lt;br /&gt;
&lt;br /&gt;
## 2. Label + 색상 조합 (완전 플랫)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=autoit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;GUIConstantsEx.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;StaticConstants.au3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$hGUI = GUICreate(&amp;quot;Flat Button&amp;quot;, 400, 300)&lt;br /&gt;
GUISetBkColor(0xFFFFFF)&lt;br /&gt;
&lt;br /&gt;
; 버튼처럼 동작하는 Label&lt;br /&gt;
$hBtn1 = _CREATE_FLAT_BUTTON(&amp;quot;저장&amp;quot;,    30,  50, 150, 45, 0x2196F3, 0xFFFFFF)&lt;br /&gt;
$hBtn2 = _CREATE_FLAT_BUTTON(&amp;quot;취소&amp;quot;,   210,  50, 150, 45, 0xF44336, 0xFFFFFF)&lt;br /&gt;
$hBtn3 = _CREATE_FLAT_BUTTON(&amp;quot;설정&amp;quot;,    30, 120, 150, 45, 0x4CAF50, 0xFFFFFF)&lt;br /&gt;
$hBtn4 = _CREATE_FLAT_BUTTON(&amp;quot;닫기&amp;quot;,   210, 120, 150, 45, 0x757575, 0xFFFFFF)&lt;br /&gt;
&lt;br /&gt;
GUISetState()&lt;br /&gt;
&lt;br /&gt;
While 1&lt;br /&gt;
    Switch GUIGetMsg()&lt;br /&gt;
        Case $GUI_EVENT_CLOSE&lt;br /&gt;
            Exit&lt;br /&gt;
        Case $hBtn1&lt;br /&gt;
            MsgBox(0, &amp;quot;&amp;quot;, &amp;quot;저장 클릭&amp;quot;)&lt;br /&gt;
        Case $hBtn2&lt;br /&gt;
            MsgBox(0, &amp;quot;&amp;quot;, &amp;quot;취소 클릭&amp;quot;)&lt;br /&gt;
        Case $hBtn3&lt;br /&gt;
            MsgBox(0, &amp;quot;&amp;quot;, &amp;quot;설정 클릭&amp;quot;)&lt;br /&gt;
        Case $hBtn4&lt;br /&gt;
            MsgBox(0, &amp;quot;&amp;quot;, &amp;quot;닫기 클릭&amp;quot;)&lt;br /&gt;
    EndSwitch&lt;br /&gt;
WEnd&lt;br /&gt;
&lt;br /&gt;
Func _CREATE_FLAT_BUTTON($sText, $iX, $iY, $iW, $iH, $iBgColor, $iFontColor)&lt;br /&gt;
    Local $hLabel = GUICtrlCreateLabel($sText, $iX, $iY, $iW, $iH, _&lt;br /&gt;
            BitOR($SS_CENTER, $SS_CENTERIMAGE))&lt;br /&gt;
    GUICtrlSetBkColor($hLabel, $iBgColor)&lt;br /&gt;
    GUICtrlSetColor($hLabel, $iFontColor)&lt;br /&gt;
    GUICtrlSetFont($hLabel, 11, 600, 0, &amp;quot;맑은 고딕&amp;quot;)&lt;br /&gt;
    GUICtrlSetCursor($hLabel, 0)  ; 손가락 커서&lt;br /&gt;
    Return $hLabel&lt;br /&gt;
EndFunc&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
## 3. GDI+ Owner-Draw (호버 효과 포함)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=autoit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;GUIConstantsEx.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;GDIPlus.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;WindowsConstants.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;WinAPI.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;StaticConstants.au3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Global Const $FLAT_COLOR_NORMAL  = 0xFF2196F3  ; 파란색&lt;br /&gt;
Global Const $FLAT_COLOR_HOVER   = 0xFF1976D2  ; 진한 파란색&lt;br /&gt;
Global Const $FLAT_COLOR_PRESS   = 0xFF0D47A1  ; 더 진한 파란색&lt;br /&gt;
Global Const $FLAT_COLOR_TEXT    = 0xFFFFFFFF  ; 흰색&lt;br /&gt;
&lt;br /&gt;
Global $g_aBtns[0][6]  ; [n][CtrlID, X, Y, W, H, Text]&lt;br /&gt;
Global $g_iHoverIdx = -1&lt;br /&gt;
Global $g_iPressIdx = -1&lt;br /&gt;
Global $g_hGUI&lt;br /&gt;
&lt;br /&gt;
_GDIPlus_Startup()&lt;br /&gt;
&lt;br /&gt;
$g_hGUI = GUICreate(&amp;quot;GDI+ Flat Buttons&amp;quot;, 400, 300)&lt;br /&gt;
GUISetBkColor(0xF5F5F5)&lt;br /&gt;
&lt;br /&gt;
; GDI+ 그리기용 Pic 컨트롤 (전체 영역)&lt;br /&gt;
Global $g_hPic = GUICtrlCreatePic(&amp;quot;&amp;quot;, 0, 0, 400, 300)&lt;br /&gt;
GUICtrlSetState($g_hPic, $GUI_DISABLE)&lt;br /&gt;
&lt;br /&gt;
; 버튼 등록&lt;br /&gt;
_ADD_FLAT_BUTTON(30,   50, 150, 45, &amp;quot;저장&amp;quot;)&lt;br /&gt;
_ADD_FLAT_BUTTON(210,  50, 150, 45, &amp;quot;취소&amp;quot;)&lt;br /&gt;
_ADD_FLAT_BUTTON(30,  120, 150, 45, &amp;quot;설정&amp;quot;)&lt;br /&gt;
_ADD_FLAT_BUTTON(210, 120, 150, 45, &amp;quot;닫기&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
_DRAW_ALL_BUTTONS()&lt;br /&gt;
&lt;br /&gt;
GUISetState()&lt;br /&gt;
GUIRegisterMsg($WM_MOUSEMOVE, &amp;quot;_WM_MOUSEMOVE&amp;quot;)&lt;br /&gt;
GUIRegisterMsg($WM_LBUTTONDOWN, &amp;quot;_WM_LBUTTONDOWN&amp;quot;)&lt;br /&gt;
GUIRegisterMsg($WM_LBUTTONUP, &amp;quot;_WM_LBUTTONUP&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
While GUIGetMsg() &amp;lt;&amp;gt; $GUI_EVENT_CLOSE&lt;br /&gt;
WEnd&lt;br /&gt;
&lt;br /&gt;
_GDIPlus_Shutdown()&lt;br /&gt;
&lt;br /&gt;
; ── 버튼 추가 ──&lt;br /&gt;
Func _ADD_FLAT_BUTTON($iX, $iY, $iW, $iH, $sText)&lt;br /&gt;
    Local $iIdx = UBound($g_aBtns)&lt;br /&gt;
    ReDim $g_aBtns[$iIdx + 1][6]&lt;br /&gt;
    $g_aBtns[$iIdx][0] = $iIdx&lt;br /&gt;
    $g_aBtns[$iIdx][1] = $iX&lt;br /&gt;
    $g_aBtns[$iIdx][2] = $iY&lt;br /&gt;
    $g_aBtns[$iIdx][3] = $iW&lt;br /&gt;
    $g_aBtns[$iIdx][4] = $iH&lt;br /&gt;
    $g_aBtns[$iIdx][5] = $sText&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
; ── 전체 버튼 그리기 ──&lt;br /&gt;
Func _DRAW_ALL_BUTTONS()&lt;br /&gt;
    Local $hBitmap = _GDIPlus_BitmapCreateFromScan0(400, 300)&lt;br /&gt;
    Local $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap)&lt;br /&gt;
    _GDIPlus_GraphicsSetSmoothingMode($hGfx, 4)&lt;br /&gt;
    _GDIPlus_GraphicsSetTextRenderingHint($hGfx, 5)&lt;br /&gt;
    _GDIPlus_GraphicsClear($hGfx, 0xFFF5F5F5)&lt;br /&gt;
&lt;br /&gt;
    Local $hFontFamily = _GDIPlus_FontFamilyCreate(&amp;quot;맑은 고딕&amp;quot;)&lt;br /&gt;
    Local $hFont = _GDIPlus_FontCreate($hFontFamily, 12, 1)&lt;br /&gt;
    Local $hFormat = _GDIPlus_StringFormatCreate()&lt;br /&gt;
    _GDIPlus_StringFormatSetAlign($hFormat, 1)      ; 가로 중앙&lt;br /&gt;
    _GDIPlus_StringFormatSetLineAlign($hFormat, 1)   ; 세로 중앙&lt;br /&gt;
&lt;br /&gt;
    Local $hTextBrush = _GDIPlus_BrushCreateSolid($FLAT_COLOR_TEXT)&lt;br /&gt;
&lt;br /&gt;
    For $i = 0 To UBound($g_aBtns) - 1&lt;br /&gt;
        ; 상태별 색상 결정&lt;br /&gt;
        Local $iColor = $FLAT_COLOR_NORMAL&lt;br /&gt;
        If $i = $g_iPressIdx Then&lt;br /&gt;
            $iColor = $FLAT_COLOR_PRESS&lt;br /&gt;
        ElseIf $i = $g_iHoverIdx Then&lt;br /&gt;
            $iColor = $FLAT_COLOR_HOVER&lt;br /&gt;
        EndIf&lt;br /&gt;
&lt;br /&gt;
        ; 둥근 사각형 배경&lt;br /&gt;
        Local $hPath = _GDIPlus_PathCreate()&lt;br /&gt;
        Local $r = 8  ; 둥근 반지름&lt;br /&gt;
        Local $bX = $g_aBtns[$i][1], $bY = $g_aBtns[$i][2]&lt;br /&gt;
        Local $bW = $g_aBtns[$i][3], $bH = $g_aBtns[$i][4]&lt;br /&gt;
        _GDIPlus_PathAddArc($hPath, $bX, $bY, $r * 2, $r * 2, 180, 90)&lt;br /&gt;
        _GDIPlus_PathAddArc($hPath, $bX + $bW - $r * 2, $bY, $r * 2, $r * 2, 270, 90)&lt;br /&gt;
        _GDIPlus_PathAddArc($hPath, $bX + $bW - $r * 2, $bY + $bH - $r * 2, $r * 2, $r * 2, 0, 90)&lt;br /&gt;
        _GDIPlus_PathAddArc($hPath, $bX, $bY + $bH - $r * 2, $r * 2, $r * 2, 90, 90)&lt;br /&gt;
        _GDIPlus_PathCloseFigure($hPath)&lt;br /&gt;
&lt;br /&gt;
        Local $hBrush = _GDIPlus_BrushCreateSolid($iColor)&lt;br /&gt;
        _GDIPlus_GraphicsFillPath($hGfx, $hPath, $hBrush)&lt;br /&gt;
        _GDIPlus_BrushDispose($hBrush)&lt;br /&gt;
        _GDIPlus_PathDispose($hPath)&lt;br /&gt;
&lt;br /&gt;
        ; 텍스트&lt;br /&gt;
        Local $tRect = _GDIPlus_RectFCreate($bX, $bY, $bW, $bH)&lt;br /&gt;
        _GDIPlus_GraphicsDrawStringEx($hGfx, $g_aBtns[$i][5], $hFont, $tRect, $hFormat, $hTextBrush)&lt;br /&gt;
    Next&lt;br /&gt;
&lt;br /&gt;
    ; Pic에 적용&lt;br /&gt;
    Local $hHBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)&lt;br /&gt;
    _WinAPI_DeleteObject(GUICtrlSendMsg($g_hPic, 0x0172, 0, $hHBmp))  ; STM_SETIMAGE&lt;br /&gt;
    _WinAPI_DeleteObject($hHBmp)&lt;br /&gt;
&lt;br /&gt;
    _GDIPlus_BrushDispose($hTextBrush)&lt;br /&gt;
    _GDIPlus_FontDispose($hFont)&lt;br /&gt;
    _GDIPlus_FontFamilyDispose($hFontFamily)&lt;br /&gt;
    _GDIPlus_StringFormatDispose($hFormat)&lt;br /&gt;
    _GDIPlus_GraphicsDispose($hGfx)&lt;br /&gt;
    _GDIPlus_BitmapDispose($hBitmap)&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
; ── 마우스 위치로 버튼 인덱스 찾기 ──&lt;br /&gt;
Func _HIT_TEST($iMX, $iMY)&lt;br /&gt;
    For $i = 0 To UBound($g_aBtns) - 1&lt;br /&gt;
        If $iMX &amp;gt;= $g_aBtns[$i][1] And $iMX &amp;lt;= $g_aBtns[$i][1] + $g_aBtns[$i][3] And _&lt;br /&gt;
           $iMY &amp;gt;= $g_aBtns[$i][2] And $iMY &amp;lt;= $g_aBtns[$i][2] + $g_aBtns[$i][4] Then&lt;br /&gt;
            Return $i&lt;br /&gt;
        EndIf&lt;br /&gt;
    Next&lt;br /&gt;
    Return -1&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
; ── 마우스 이동 ──&lt;br /&gt;
Func _WM_MOUSEMOVE($hWnd, $iMsg, $wParam, $lParam)&lt;br /&gt;
    Local $iMX = BitAND($lParam, 0xFFFF)&lt;br /&gt;
    Local $iMY = BitShift(BitAND($lParam, 0xFFFF0000), 16)&lt;br /&gt;
    Local $iIdx = _HIT_TEST($iMX, $iMY)&lt;br /&gt;
    If $iIdx &amp;lt;&amp;gt; $g_iHoverIdx Then&lt;br /&gt;
        $g_iHoverIdx = $iIdx&lt;br /&gt;
        _DRAW_ALL_BUTTONS()&lt;br /&gt;
    EndIf&lt;br /&gt;
    Return $GUI_RUNDEFMSG&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
; ── 마우스 누름 ──&lt;br /&gt;
Func _WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)&lt;br /&gt;
    Local $iMX = BitAND($lParam, 0xFFFF)&lt;br /&gt;
    Local $iMY = BitShift(BitAND($lParam, 0xFFFF0000), 16)&lt;br /&gt;
    $g_iPressIdx = _HIT_TEST($iMX, $iMY)&lt;br /&gt;
    If $g_iPressIdx &amp;gt;= 0 Then _DRAW_ALL_BUTTONS()&lt;br /&gt;
    Return $GUI_RUNDEFMSG&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
; ── 마우스 뗌 ──&lt;br /&gt;
Func _WM_LBUTTONUP($hWnd, $iMsg, $wParam, $lParam)&lt;br /&gt;
    Local $iMX = BitAND($lParam, 0xFFFF)&lt;br /&gt;
    Local $iMY = BitShift(BitAND($lParam, 0xFFFF0000), 16)&lt;br /&gt;
    Local $iIdx = _HIT_TEST($iMX, $iMY)&lt;br /&gt;
    If $iIdx &amp;gt;= 0 And $iIdx = $g_iPressIdx Then&lt;br /&gt;
        ; 버튼 클릭 이벤트&lt;br /&gt;
        MsgBox(0, &amp;quot;클릭&amp;quot;, $g_aBtns[$iIdx][5] &amp;amp; &amp;quot; 버튼 클릭!&amp;quot;)&lt;br /&gt;
    EndIf&lt;br /&gt;
    $g_iPressIdx = -1&lt;br /&gt;
    _DRAW_ALL_BUTTONS()&lt;br /&gt;
    Return $GUI_RUNDEFMSG&lt;br /&gt;
EndFunc&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
세 방식의 차이를 정리하면 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
**방법 1 (BS_FLAT)** — 코드 한 줄이면 되지만 Windows 기본 버튼 렌더링에 의존하므로 완전한 플랫이 아닙니다. 마우스 오버 시 3D 테두리가 나타납니다.&lt;br /&gt;
&lt;br /&gt;
**방법 2 (Label 활용)** — Label에 배경색과 폰트색을 입히는 방식으로, 코드가 간결하면서도 완전 플랫합니다. 다만 호버/프레스 시 색상 변화를 주려면 타이머나 메시지 처리를 추가해야 합니다.&lt;br /&gt;
&lt;br /&gt;
**방법 3 (GDI+ Owner-Draw)** — 가장 자유도가 높습니다. 둥근 모서리, 호버 색상 변화, 프레스 효과까지 완전히 커스텀 가능합니다. 코드량이 많지만 SQL*KEY처럼 UI를 세밀하게 제어해야 하는 프로그램에 적합합니다.&lt;br /&gt;
&lt;br /&gt;
[[category:autoit]]&lt;/div&gt;</summary>
		<author><name>Devcafe</name></author>
	</entry>
</feed>