WTL Controls
Back to the WTL Controls Home Page.
Bevel.cpp
Go to the documentation of this file.
1 #include "StdAfx.h"
2 //--------------------------------------------------------------------------------------
3 //--------------------------------------------------------------------------------------
4 //
5 //
6 // WTL Control Library
7 // by
8 // Bright Ideas Software®
9 // Copyright © 2018 by Bright Ideas Software.
10 //
11 //
12 //
13 //--------------------------------------------------------------------------------------
14 //--------------------------------------------------------------------------------------
15 
16 
18 {
19  //----------------------------------------------------------------------------------------------
20  //----------------------------------------------------------------------------------------------
21  CBevel::CBevel() noexcept
22  {
23  m_bsBevel = CBevelStyle::bsSunken;
24  m_bmMode = CBevelMode::bmHorizontal;
25 
26  m_hLitePen = NULL;
27  m_hDarkPen = NULL;
28 
29  m_bMsgHandled = FALSE;
30  }
31  //----------------------------------------------------------------------------------------------
33  {
34  ATLASSERT( m_hWnd == NULL);
35  DeletePens();
36  }
37  //----------------------------------------------------------------------------------------------
38  //----------------------------------------------------------------------------------------------
50  void CBevel::SubclassStatic(HWND hwnd)
51  {
52  CWindowImpl<CBevel, CStatic>::SubclassWindow(hwnd);
53 
54  ModifyStyle(WS_BORDER | WS_DLGFRAME | SS_ETCHEDFRAME | SS_ETCHEDVERT |
55  SS_ETCHEDHORZ | SS_WHITEFRAME, 0);
56  ModifyStyleEx(0, WS_EX_TRANSPARENT);
57  UpdatePens();
58  }
59  //----------------------------------------------------------------------------------------------
66  {
67  UnsubclassWindow();
68  DeletePens();
69  }
70  //----------------------------------------------------------------------------------------------
71  //----------------------------------------------------------------------------------------------
80  {
81  return(m_bsBevel);
82  }
83  //----------------------------------------------------------------------------------------------
94  {
95  m_bsBevel = style;
96  }
97  //----------------------------------------------------------------------------------------------
98  //----------------------------------------------------------------------------------------------
107  {
108  return(m_bmMode);
109  }
110  //----------------------------------------------------------------------------------------------
121  {
122  m_bmMode = mode;
123  }
124  //----------------------------------------------------------------------------------------------
125  //----------------------------------------------------------------------------------------------
126  //
127  // Private Methods
128  //
129  //----------------------------------------------------------------------------------------------
130  //----------------------------------------------------------------------------------------------
136  void CBevel::UpdatePens()
137  {
138  if ((m_hLitePen != NULL) || (m_hDarkPen != NULL))
139  DeletePens();
140 
141  m_hLitePen = ::CreatePen(PS_SOLID, 1, ::GetSysColor(COLOR_BTNHIGHLIGHT));
142  m_hDarkPen = ::CreatePen(PS_SOLID, 1, ::GetSysColor(COLOR_3DDKSHADOW));
143 
144  }
145  //----------------------------------------------------------------------------------------------
146  void CBevel::DeletePens()
147  {
148  if (m_hLitePen != NULL)
149  {
150  ::DeleteObject(m_hLitePen);
151  m_hLitePen = NULL;
152  }
153 
154  if (m_hDarkPen != NULL)
155  {
156  ::DeleteObject(m_hDarkPen);
157  m_hDarkPen = NULL;
158  }
159  }
160  //----------------------------------------------------------------------------------------------
161  //----------------------------------------------------------------------------------------------
162  //
163  // Message Handlers
164  //
165  //----------------------------------------------------------------------------------------------
166  //----------------------------------------------------------------------------------------------
167  LRESULT CBevel::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
168  {
169 
170  CRect rect;
171 
172  HDC dc = NULL;
173  bool do_end_paint = false;
174  PAINTSTRUCT ps;
175 
176  if (wParam != NULL)
177  dc = (HDC)wParam;
178  else
179  {
180  RECT update_rect{ 0 };
181  if (GetUpdateRect(&update_rect) != 0)
182  {
183  dc = BeginPaint(&ps);
184  do_end_paint = true;
185  }
186  }
187 
188  if (dc == NULL)
189  return(0);
190 
191  GetWindowRect(&rect);
192  ScreenToClient(&rect);
193 
194  int w = rect.Width();
195  int h = rect.Height();
196 
197  if ((m_hLitePen == NULL)||(m_hDarkPen == NULL))
198  UpdatePens();
199 
200  if ((m_hLitePen == NULL) || (m_hDarkPen == NULL))
201  return(0);
202 
203  FillRect(dc, &rect, (HBRUSH)GetStockObject(HOLLOW_BRUSH));
204 
205  if (m_bsBevel > CBevelStyle::bsLine)
206  {
207 
208  HPEN oldpen = (HPEN)::SelectObject(dc, m_hDarkPen);
209 
210  if (m_bmMode == CBevelMode::bmHorizontal)
211  {
212  if (m_bsBevel == CBevelStyle::bsSunken)
213  {
214  ::MoveToEx(dc, 0, 0, NULL);
215  ::LineTo(dc, w, 0);
216  }
217  else
218  {
219  ::MoveToEx(dc, 0, 1, NULL);
220  ::LineTo(dc, w, 1);
221  }
222  }
223  else
224  {
225  if (m_bsBevel == CBevelStyle::bsSunken)
226  {
227  ::MoveToEx(dc, 0, 0, NULL);
228  ::LineTo(dc, 0, h);
229  }
230  else
231  {
232  ::MoveToEx(dc, 1, 0, NULL);
233  ::LineTo(dc, 1, h);
234  }
235  }
236 
237 
238  ::SelectObject(dc, oldpen);
239  oldpen = (HPEN)::SelectObject(dc, m_hLitePen);
240 
241  if (m_bmMode == CBevelMode::bmHorizontal)
242  {
243  if (m_bsBevel == CBevelStyle::bsRaised)
244  {
245  ::MoveToEx(dc, 0, 0, NULL);
246  ::LineTo(dc, w, 0);
247  }
248  else
249  {
250  ::MoveToEx(dc, 0, 1, NULL);
251  ::LineTo(dc, w, 1);
252  }
253  }
254  else
255  {
256  if (m_bsBevel == CBevelStyle::bsRaised)
257  {
258  ::MoveToEx(dc, 0, 0, NULL);
259  ::LineTo(dc, 0, h);
260  }
261  else
262  {
263  ::MoveToEx(dc, 1, 0, NULL);
264  ::LineTo(dc, 1, h);
265  }
266  }
267  ::SelectObject(dc, oldpen);
268 
269 
270  }
271  else if (m_bsBevel == CBevelStyle::bsLine)
272  {
273  ::MoveToEx(dc, 0, 0, NULL);
274  if (m_bmMode == CBevelMode::bmHorizontal)
275  ::LineTo(dc, w, 0);
276  else
277  ::LineTo(dc, 0, h);
278  }
279 
280  if (do_end_paint == true)
281  EndPaint(&ps);
282 
283  return(0);
284  }
285  //----------------------------------------------------------------------------------------------
286  BOOL CBevel::OnEraseBkgnd(CDCHandle dc)
287  {
288  return(TRUE);
289  }
290  //----------------------------------------------------------------------------------------------
291  void CBevel::OnSysColorChange()
292  {
293  UpdatePens();
294  Invalidate();
295  UpdateWindow();
296  }
297  //----------------------------------------------------------------------------------------------
298 };
void SetBevelStyle(CBevelStyle value)
Set a new CBevelStyle value.
Definition: Bevel.cpp:93
void UnSubclassStatic()
Un-subclass the window and release GDI resources.
Definition: Bevel.cpp:65
void SetBevelMode(CBevelMode mode)
Load a new bevel mode.
Definition: Bevel.cpp:120
CBevelMode GetBevelMode() const
Default: CBevelMode::bmHorizontal.
Definition: Bevel.cpp:106
CBevelStyle GetBevelStyle() const
Default: CBevelStyle::bsSunken.
Definition: Bevel.cpp:79
void SubclassStatic(HWND hwnd)
Subclass a static control window; modify window style to provide the intended graphical appearance...
Definition: Bevel.cpp:50