annotate foosdk/sdk/libPPUI/CButtonLite.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <functional>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <vsstyle.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "wtl-pp.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include "win32_op.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include "DarkMode.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 typedef CWinTraits<WS_CHILD|WS_TABSTOP,0> CButtonLiteTraits;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 class CButtonLite : public CWindowImpl<CButtonLite, CWindow, CButtonLiteTraits > {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 BEGIN_MSG_MAP_EX(CButtonLite)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 MESSAGE_RANGE_HANDLER_EX(WM_MOUSEFIRST, WM_MOUSELAST, MousePassThru)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 MSG_WM_MOUSELEAVE(OnMouseLeave)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 MSG_WM_SETTEXT(OnSetText)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 MSG_WM_PAINT( OnPaint )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 MSG_WM_MOUSEMOVE(OnMouseMove)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 MSG_WM_LBUTTONDOWN(OnLButtonDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 MSG_WM_SETFOCUS(OnSetFocus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 MSG_WM_KILLFOCUS(OnKillFocus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 MSG_WM_KEYDOWN(OnKeyDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 MSG_WM_KEYUP(OnKeyUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 MSG_WM_CHAR(OnChar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 MSG_WM_ENABLE(OnEnable)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 MESSAGE_HANDLER_EX(WM_GETDLGCODE, OnGetDlgCode)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 MSG_WM_SETFONT(OnSetFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 MSG_WM_GETFONT(OnGetFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 MSG_WM_CREATE(OnCreate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 std::function<void () > ClickHandler;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 unsigned Measure() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 auto font = myGetFont();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 LOGFONT lf;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 WIN32_OP_D(font.GetLogFont(lf));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 MakeBoldFont( lf );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 CFont bold;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 WIN32_OP_D(bold.CreateFontIndirect(&lf));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 CWindowDC dc(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 auto oldFont = dc.SelectFont( bold );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 CSize size (0,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 CString measure;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 measure = L"#";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 measure += m_textDrawMe;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 WIN32_OP_D(dc.GetTextExtent(measure, measure.GetLength(), &size));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 dc.SelectFont( oldFont );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 return size.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 std::function< void (HWND) > TabCycleHandler;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 std::function< HBRUSH (CDCHandle) > CtlColorHandler;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 std::function< bool (HWND) > WantTabCheck;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 CWindow WndCtlColorTarget;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 // Rationale: sometimes you want a different text to be presented to accessibility APIs than actually drawn
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 // For an example, a clear button looks best with a multiplication sign, but the narrator should say "clear" or so when focused
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 void DrawAlternateText( const wchar_t * textDrawMe ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 m_textDrawMe = textDrawMe;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 LRESULT MousePassThru(UINT cMsg, WPARAM cFlags, LPARAM lParam) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 CPoint cPoint(lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 const DWORD maskButtons = MK_LBUTTON | MK_RBUTTON | MK_MBUTTON | MK_XBUTTON1 | MK_XBUTTON2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 if (cMsg == WM_MOUSEWHEEL || cMsg == WM_MOUSEHWHEEL || (cFlags & maskButtons) != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 ToggleHot(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 if (cMsg == WM_MOUSEWHEEL || cMsg == WM_MOUSEHWHEEL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 TogglePressed(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 if (cMsg == WM_LBUTTONUP) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 bool wasPressed = m_pressed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 TogglePressed(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 if (wasPressed) OnClicked();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 SetMsgHandled(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 CFontHandle m_font;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 void OnSetFont(HFONT font, BOOL bRedraw) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 m_font = font; if (bRedraw) Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 HFONT OnGetFont() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 return m_font;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 LRESULT OnGetDlgCode(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 if ( wp == VK_TAB && TabCycleHandler != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 if ( WantTabCheck == NULL || WantTabCheck(m_hWnd) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 TabCycleHandler( m_hWnd );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 return DLGC_WANTTAB;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 SetMsgHandled(FALSE); return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 void OnChar(UINT, UINT, UINT) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 (void)nRepCnt; (void)nFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 switch(nChar) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 case VK_SPACE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 case VK_RETURN:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 TogglePressed(true); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 (void)nRepCnt; (void)nFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 switch(nChar) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 case VK_SPACE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 case VK_RETURN:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 TogglePressed(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 OnClicked();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 void OnSetFocus(CWindow) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 m_focused = true; Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 void OnKillFocus(CWindow) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 m_focused = false; Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 CFontHandle myGetFont() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 auto f = GetFont();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 if ( f == NULL ) f = (HFONT) GetStockObject(DEFAULT_GUI_FONT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 return f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 static void MakeBoldFont(LOGFONT & lf ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 lf.lfWeight += 300;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 if (lf.lfWeight > 1000 ) lf.lfWeight = 1000;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 CWindow GetCtlColorTarget() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 CWindow target = WndCtlColorTarget;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 if (target == NULL) target = GetParent();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 return target;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 virtual void DrawBackground( CDCHandle dc, CRect rcClient ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 HBRUSH brush = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 if (CtlColorHandler) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 brush = CtlColorHandler(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 brush = (HBRUSH)GetCtlColorTarget().SendMessage(WM_CTLCOLORBTN, (WPARAM)dc.m_hDC, (LPARAM)this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 if (brush != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 dc.FillRect(rcClient, brush);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 dc.SetBkMode(TRANSPARENT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 if ( IsPressed() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 CTheme theme;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 if (theme.OpenThemeData(*this, L"BUTTON" )) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 DrawThemeBackground(theme, dc, BP_PUSHBUTTON, PBS_PRESSED, rcClient, rcClient );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 DrawFrameControl( dc, rcClient, DFC_BUTTON, DFCS_PUSHED );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 } else if (m_hot) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 CTheme theme;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 if (theme.OpenThemeData(*this, L"BUTTON")) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 DrawThemeBackground(theme, dc, BP_PUSHBUTTON, PBS_HOT, rcClient, rcClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 DrawFrameControl(dc, rcClient, DFC_BUTTON, DFCS_HOT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 virtual void OnPaint(CDCHandle) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 CPaintDC pdc(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 CRect rcClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 if (! GetClientRect( &rcClient ) ) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 auto font = myGetFont();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 /*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 CFont fontOverride;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 if ( IsPressed() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 LOGFONT lf;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 font.GetLogFont( lf );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 MakeBoldFont( lf );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 fontOverride.CreateFontIndirect( & lf );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 font = fontOverride;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 HFONT oldFont = pdc.SelectFont( font );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 DrawBackground( pdc.m_hDC, rcClient );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 pdc.SetBkMode( TRANSPARENT );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 if ( !IsWindowEnabled() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 pdc.SetTextColor( DarkMode::GetSysColor(COLOR_GRAYTEXT) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 } else if ( m_focused ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 pdc.SetTextColor( DarkMode::GetSysColor(COLOR_HIGHLIGHT) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 pdc.DrawText( m_textDrawMe, m_textDrawMe.GetLength(), &rcClient, DT_VCENTER | DT_CENTER | DT_SINGLELINE | DT_NOPREFIX );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 pdc.SelectFont( oldFont );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 virtual void OnClicked() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 if ( ClickHandler ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 ClickHandler();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 GetParent().PostMessage( WM_COMMAND, MAKEWPARAM( this->GetDlgCtrlID(), BN_CLICKED ), (LPARAM) m_hWnd );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 bool IsPressed() {return m_pressed; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 int OnCreate(LPCREATESTRUCT lpCreateStruct) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 DarkMode::ApplyDarkThemeCtrl(*this, DarkMode::IsDialogDark(GetCtlColorTarget(), WM_CTLCOLORBTN));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 if ( lpCreateStruct->lpszName != nullptr ) this->m_textDrawMe = lpCreateStruct->lpszName;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 SetMsgHandled(FALSE); return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 void OnEnable(BOOL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 Invalidate(); SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 void ToggleHot( bool bHot ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 if ( bHot != m_hot ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 m_hot = bHot; Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 void OnMouseMove(UINT nFlags, CPoint) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 const DWORD maskButtons = MK_LBUTTON | MK_RBUTTON | MK_MBUTTON | MK_XBUTTON1 | MK_XBUTTON2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 if ((nFlags & maskButtons) != 0) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 ToggleHot(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 TrackMouseLeave();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 void OnLButtonDown(UINT nFlags, CPoint) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 const DWORD maskButtons = MK_LBUTTON | MK_RBUTTON | MK_MBUTTON | MK_XBUTTON1 | MK_XBUTTON2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 if ( ( nFlags & maskButtons ) != MK_LBUTTON ) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 TogglePressed( true );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 TrackMouseLeave();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 void TogglePressed( bool bPressed ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 if ( bPressed != m_pressed ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 m_pressed = bPressed; Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 int OnSetText(LPCTSTR lpstrText) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 m_textDrawMe = lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 Invalidate(); SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 void TrackMouseLeave() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 TRACKMOUSEEVENT tme = { sizeof(tme) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 tme.dwFlags = TME_LEAVE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 tme.hwndTrack = m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 TrackMouseEvent(&tme);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 void OnMouseLeave() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 ToggleHot(false); TogglePressed(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 bool m_pressed = false, m_focused = false, m_hot = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 CString m_textDrawMe;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 };