The Winamp Remote Control suite
a remote control client and plugin for Winamp 2.x, 5.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
GlassExtender.cpp
Go to the documentation of this file.
1 /*
2  * GlassExtender.cpp
3  *
4  *
5  * Created on: 10 Mar 2012
6  * Author: Patrick
7  */
8 
9 #include "GlassExtender.h"
10 
11 
12 void GlassExtender::DWMCompositionChanged(TMessage& /* Msg */)
13 {
14  // TODO handle and notify the parent form m_Form
15 }
16 
17 bool GlassExtender::glassWindow(TWinControl * winControl)
18 {
19  const MARGINS margins = { -1 };
20  if (!(SUCCEEDED ( m_ExtendFrameProc(winControl->Handle, &margins ) )))
21  return false;
22  for (int i = 0 ; i < winControl->ControlCount ; i++)
23  {
24  TControl * childControl = winControl->Controls[i];
25  TWinControl * childWinControl = dynamic_cast<TWinControl *>(childControl);
26  if ( childWinControl )
27  {
28  glassWindow(childWinControl);
29  return true;
30  }
31  }
32  return false;
33 
34 }
35 
36 
37 bool GlassExtender::extendIntoClientAll()
38 {
39  // Extend frame across entire window.
40  if (NULL != m_ExtendFrameProc)
41  {
42  return glassWindow(m_Form);
43  }
44  return false;
45 }
46 
47 
49 {
50 
51  if ( (NULL != m_dwmapi) &&
52  (NULL != m_DWMEnabledProc) )
53  {
54  BOOL enabled = FALSE;
55  if ( SUCCEEDED(m_DWMEnabledProc(&enabled)) )
56  return enabled;
57  }
58  return false;
59 }
60 
61 
62 
63 
64 /* WINDOW parts */
65 #define WP_CAPTION 1
66 
67 /* WINDOW CAPTION / SMALLCAPTION state */
68 #define CS_ACTIVE 1
69 
70 
71 
72 #define LBCP_ITEM 5
73 
74 #define LBPSI_HOT 1
75 #define LBPSI_HOTSELECTED 2
76 #define LBPSI_SELECTED 3
77 #define LBPSI_SELECTEDNOTFOCUS 4
78 
79 bool GlassExtender::drawGlowText(HDC dc, const AnsiString& item,const TRect &itemRect,
80  bool current)
81 {
82 
83  if (NULL == m_DrawThemeTextExProc)
84  return false;
85 
86  if (NULL == m_OpenThemeDataProc)
87  return false;
88 
89  if (NULL == m_CloseThemeDataProc)
90  return false;
91 
92  DTTOPTS dttOpts = {0};
93 
94  RECT R = Rect(itemRect.Left, itemRect.Top, itemRect.Right, itemRect.Bottom);
95 
96  dttOpts.dwSize = sizeof(DTTOPTS);
97  dttOpts.iGlowSize = 2;
98  dttOpts.dwFlags = /* DTT_GLOWSIZE |*/ DTT_STATEID;
99  dttOpts.crText = clWhite;
100  dttOpts.dwFlags |= DTT_TEXTCOLOR;
101 
102  HANDLE hTheme = m_OpenThemeDataProc(0, L"WINDOW");
103 
104  if (current)
105  {
106  dttOpts.crText = clWhite;
107  dttOpts.dwFlags |= DTT_TEXTCOLOR | DTT_GLOWSIZE ;
108  }
109 
110  HRESULT ret = m_DrawThemeTextExProc(hTheme, dc, LBCP_ITEM, 0,
111  WideString(item).c_bstr(), -1,
112  DT_LEFT | DT_TOP | DT_SINGLELINE | DT_NOPREFIX,
113  &R, &dttOpts);
114 
115  m_CloseThemeDataProc(hTheme);
116  return SUCCEEDED(ret);
117 }
118 
119 
120 __fastcall
122  TComponent(Owner),
123  m_ExtendFrameProc(NULL),
124  m_DWMEnabledProc(NULL),
125  m_DrawThemeTextExProc(NULL),
126  m_OpenThemeDataProc(NULL),
127  m_uxtheme(NULL),
128  m_dwmapi(NULL),
129  m_Form(NULL)
130 {
131 
132  if (Owner)
133  {
134  m_Form = Owner;
135  // used over the raw API call due to issues with FP mode conflicts
136  m_dwmapi = ::SafeLoadLibrary(AnsiString("dwmapi.dll"), SEM_NOOPENFILEERRORBOX);
137  m_uxtheme = ::SafeLoadLibrary(AnsiString("uxtheme.dll"), SEM_NOOPENFILEERRORBOX);
138  if (NULL != m_uxtheme)
139  {
140  m_OpenThemeDataProc = (OpenThemeDataProc)
141  ::GetProcAddress((HMODULE) m_uxtheme, "OpenThemeData");
142  m_CloseThemeDataProc = (CloseThemeDataProc)
143  ::GetProcAddress((HMODULE) m_uxtheme, "CloseThemeData");
144  m_DrawThemeTextExProc = (DrawThemeTextExProc)
145  ::GetProcAddress((HMODULE) m_uxtheme, "DrawThemeTextEx");
146 
147  }
148  if (NULL != m_dwmapi)
149  {
150  m_ExtendFrameProc = (ExtendFrameProc)
151  ::GetProcAddress((HMODULE) m_dwmapi, "DwmExtendFrameIntoClientArea");
152  m_DWMEnabledProc = (DWMEnabledProc)
153  ::GetProcAddress((HMODULE) m_dwmapi, "DwmIsCompositionEnabled");
154  extendIntoClientAll();
155  // fixups for any Glass display issues can only be done by UI classes
156  }
157  }
158 
159 }
160 
161 __fastcall
163 {
164  if (m_dwmapi)
165  ::FreeLibrary( (HMODULE) m_dwmapi);
166  if (m_uxtheme)
167  ::FreeLibrary( (HMODULE) m_uxtheme);
168 }
169