foobar2000 SDK  2015-01-14
win-objects.h
Go to the documentation of this file.
1 namespace pfc {
3 
4  // Prefix filesystem paths with \\?\ and \\?\UNC where appropriate.
5  void winPrefixPath(pfc::string_base & out, const char * p_path);
6  // Reverse winPrefixPath
7  void winUnPrefixPath(pfc::string_base & out, const char * p_path);
8 }
9 
10 
12 public:
13  LastErrorRevertScope() : m_val(GetLastError()) {}
14  ~LastErrorRevertScope() {SetLastError(m_val);}
15 
16 private:
17  const DWORD m_val;
18 };
19 
21 public:
22  format_win32_error(DWORD p_code);
23 
24  const char * get_ptr() const {return m_buffer.get_ptr();}
25  operator const char*() const {return m_buffer.get_ptr();}
26 private:
28 };
29 
31 public:
32  format_hresult(HRESULT p_code);
33  format_hresult(HRESULT p_code, const char * msgOverride);
34 
35  const char * get_ptr() const {return m_buffer.get_ptr();}
36  operator const char*() const {return m_buffer.get_ptr();}
37 private:
38  void stamp_hex(HRESULT p_code);
40 };
41 
43  exception_win32(DWORD p_code) : std::exception(format_win32_error(p_code)), m_code(p_code) {}
44  DWORD get_code() const {return m_code;}
45 private:
46  DWORD m_code;
47 };
48 
49 void uAddWindowStyle(HWND p_wnd,LONG p_style);
50 void uRemoveWindowStyle(HWND p_wnd,LONG p_style);
51 void uAddWindowExStyle(HWND p_wnd,LONG p_style);
52 void uRemoveWindowExStyle(HWND p_wnd,LONG p_style);
53 unsigned MapDialogWidth(HWND p_dialog,unsigned p_value);
54 bool IsKeyPressed(unsigned vk);
55 
57 unsigned GetHotkeyModifierFlags();
58 
60 public:
63  bool Open(HWND p_owner);
64  void Close();
65 private:
66  bool m_open;
67 
68  PFC_CLASS_NOT_COPYABLE_EX(CClipboardOpenScope)
69 };
70 
72 public:
73  CGlobalLockScope(HGLOBAL p_handle);
75  void * GetPtr() const {return m_ptr;}
76  t_size GetSize() const {return GlobalSize(m_handle);}
77 private:
78  void * m_ptr;
79  HGLOBAL m_handle;
80 
81  PFC_CLASS_NOT_COPYABLE_EX(CGlobalLockScope)
82 };
83 
84 template<typename TItem> class CGlobalLockScopeT {
85 public:
86  CGlobalLockScopeT(HGLOBAL handle) : m_scope(handle) {}
87  TItem * GetPtr() const {return reinterpret_cast<TItem*>(m_scope.GetPtr());}
88  t_size GetSize() const {
89  const t_size val = m_scope.GetSize();
90  PFC_ASSERT( val % sizeof(TItem) == 0 );
91  return val / sizeof(TItem);
92  }
93 private:
95 };
96 
97 
98 bool IsPointInsideControl(const POINT& pt, HWND wnd);
99 bool IsWindowChildOf(HWND child, HWND parent);
100 
101 class win32_menu {
102 public:
103  win32_menu(HMENU p_initval) : m_menu(p_initval) {}
104  win32_menu() : m_menu(NULL) {}
106  void release();
107  void set(HMENU p_menu) {release(); m_menu = p_menu;}
108  void create_popup();
109  HMENU get() const {return m_menu;}
110  HMENU detach() {return pfc::replace_t(m_menu,(HMENU)NULL);}
111 
112  bool is_valid() const {return m_menu != NULL;}
113 private:
114  win32_menu(const win32_menu &);
115  const win32_menu & operator=(const win32_menu &);
116 
117  HMENU m_menu;
118 };
119 
120 class win32_event {
121 public:
122  win32_event() : m_handle(NULL) {}
124 
125  void create(bool p_manualreset,bool p_initialstate);
126 
127  void set(HANDLE p_handle) {release(); m_handle = p_handle;}
128  HANDLE get() const {return m_handle;}
129  HANDLE get_handle() const {return m_handle;}
131  bool is_valid() const {return m_handle != NULL;}
132 
133  void release();
134 
136  bool wait_for(double p_timeout_seconds) {return g_wait_for(get(),p_timeout_seconds);}
137 
138  static DWORD g_calculate_wait_time(double p_seconds);
139 
141  static bool g_wait_for(HANDLE p_event,double p_timeout_seconds);
142 
143  void set_state(bool p_state);
144 
145  // Two-wait event functions, return 0 on timeout, 1 on evt1 set, 2 on evt2 set
146  static int g_twoEventWait( win32_event & ev1, win32_event & ev2, double timeout );
147  static int g_twoEventWait( HANDLE ev1, HANDLE ev2, double timeout );
148 private:
149  win32_event(const win32_event&);
150  const win32_event & operator=(const win32_event &);
151 
153 };
154 
155 void uSleepSeconds(double p_time,bool p_alertable);
156 
157 
158 class win32_icon {
159 public:
160  win32_icon(HICON p_initval) : m_icon(p_initval) {}
161  win32_icon() : m_icon(NULL) {}
163 
164  void release();
165 
166  void set(HICON p_icon) {release(); m_icon = p_icon;}
167  HICON get() const {return m_icon;}
168  HICON detach() {return pfc::replace_t(m_icon,(HICON)NULL);}
169 
170  bool is_valid() const {return m_icon != NULL;}
171 
172 private:
173  win32_icon(const win32_icon&) {throw pfc::exception_not_implemented();}
174  const win32_icon & operator=(const win32_icon &) {throw pfc::exception_not_implemented();}
175 
176  HICON m_icon;
177 };
178 
180 public:
183  HACCEL get() const {return m_accel;}
184 
185  void load(HINSTANCE p_inst,const TCHAR * p_id);
186  void release();
187 private:
188  HACCEL m_accel;
190 };
191 
192 
194 public:
195  SelectObjectScope(HDC p_dc,HGDIOBJ p_obj) throw() : m_dc(p_dc), m_obj(SelectObject(p_dc,p_obj)) {}
196  ~SelectObjectScope() throw() {SelectObject(m_dc,m_obj);}
197 private:
199  HDC m_dc;
200  HGDIOBJ m_obj;
201 };
202 
204 public:
205  OffsetWindowOrgScope(HDC dc, const POINT & pt) throw() : m_dc(dc), m_pt(pt) {
206  OffsetWindowOrgEx(m_dc, m_pt.x, m_pt.y, NULL);
207  }
209  OffsetWindowOrgEx(m_dc, -m_pt.x, -m_pt.y, NULL);
210  }
211 
212 private:
213  const HDC m_dc;
214  const POINT m_pt;
215 };
217 public:
218  DCStateScope(HDC p_dc) throw() : m_dc(p_dc) {
219  m_state = SaveDC(m_dc);
220  }
221  ~DCStateScope() throw() {
222  RestoreDC(m_dc,m_state);
223  }
224 private:
225  const HDC m_dc;
226  int m_state;
227 };
228 
229 
231 public:
232  exception_com(HRESULT p_code) : std::exception(format_hresult(p_code)), m_code(p_code) {}
233  exception_com(HRESULT p_code, const char * msg) : std::exception(format_hresult(p_code, msg)), m_code(p_code) {}
234  HRESULT get_code() const {return m_code;}
235 private:
236  HRESULT m_code;
237 };
238 
239 // Same format as _WIN32_WINNT macro.
240 WORD GetWindowsVersionCode() throw();
241 
243 template<typename TBase> class ImplementCOMRefCounter : public TBase {
244 public:
246  ULONG STDMETHODCALLTYPE AddRef() {
247  return ++m_refcounter;
248  }
249  ULONG STDMETHODCALLTYPE Release() {
250  long val = --m_refcounter;
251  if (val == 0) delete this;
252  return val;
253  }
254 protected:
256 private:
258 };
259 
260 
261 
262 template<typename TPtr>
264 public:
265  CoTaskMemObject() : m_ptr() {}
266 
267  ~CoTaskMemObject() {CoTaskMemFree(m_ptr);}
268  void Reset() {CoTaskMemFree(pfc::replace_null_t(m_ptr));}
269  TPtr * Receive() {Reset(); return &m_ptr;}
270 
271  TPtr m_ptr;
272  PFC_CLASS_NOT_COPYABLE(CoTaskMemObject, CoTaskMemObject<TPtr> );
273 };
274 
275 
276 namespace pfc {
277  bool isShiftKeyPressed();
278  bool isCtrlKeyPressed();
279  bool isAltKeyPressed();
280 }
void release()
void stamp_hex(HRESULT p_code)
Definition: win-objects.cpp:94
win32_menu(HMENU p_initval)
Definition: win-objects.h:103
pfc::refcounter m_refcounter
Definition: win-objects.h:257
pfc::string_formatter m_buffer
Definition: win-objects.h:39
const char * get_ptr() const
Definition: win-objects.h:24
t_size GetSize() const
Definition: win-objects.h:88
bool IsKeyPressed(unsigned vk)
CGlobalLockScope(HGLOBAL p_handle)
BOOL winFormatSystemErrorMessage(pfc::string_base &p_out, DWORD p_code)
Definition: win-objects.cpp:5
void load(HINSTANCE p_inst, const TCHAR *p_id)
void create_popup()
bool is_valid() const
Definition: win-objects.h:112
win32_icon(const win32_icon &)
Definition: win-objects.h:173
t_type replace_null_t(t_type &p_var)
Definition: primitives.h:688
CGlobalLockScopeT(HGLOBAL handle)
Definition: win-objects.h:86
HMENU detach()
Definition: win-objects.h:110
PFC_CLASS_NOT_COPYABLE(win32_accelerator, win32_accelerator)
bool isShiftKeyPressed()
Definition: obj-c.mm:32
typedef BOOL(WINAPI *pPowerSetRequest_t)(__in HANDLE PowerRequest
HANDLE get_handle() const
Definition: win-objects.h:129
DCStateScope(HDC p_dc)
Definition: win-objects.h:218
STL namespace.
HICON detach()
Definition: win-objects.h:168
bool isCtrlKeyPressed()
Definition: obj-c.mm:39
void uRemoveWindowStyle(HWND p_wnd, LONG p_style)
const HDC m_dc
Definition: win-objects.h:225
OffsetWindowOrgScope(HDC dc, const POINT &pt)
Definition: win-objects.h:205
const win32_icon & operator=(const win32_icon &)
Definition: win-objects.h:174
void release()
WORD GetWindowsVersionCode()
void uRemoveWindowExStyle(HWND p_wnd, LONG p_style)
bool isAltKeyPressed()
Definition: obj-c.mm:46
void * GetPtr() const
Definition: win-objects.h:75
bool IsWindowChildOf(HWND child, HWND parent)
t_type replace_t(t_type &p_var, const t_newval &p_newval)
Definition: primitives.h:682
void winPrefixPath(pfc::string_base &out, const char *p_path)
Definition: win-objects.cpp:53
PFC_CLASS_NOT_COPYABLE_EX(SelectObjectScope) HDC m_dc
bool is_valid() const
Definition: win-objects.h:170
TEMPLATE_CONSTRUCTOR_FORWARD_FLOOD(ImplementCOMRefCounter, TBase) ULONG STDMETHODCALLTYPE AddRef()
Definition: win-objects.h:245
typedef HANDLE(WINAPI *pPowerCreateRequest_t)(__in void *Context)
HGLOBAL m_handle
Definition: win-objects.h:79
void set(HMENU p_menu)
Definition: win-objects.h:107
static int g_twoEventWait(win32_event &ev1, win32_event &ev2, double timeout)
CGlobalLockScope m_scope
Definition: win-objects.h:94
void uSleepSeconds(double p_time, bool p_alertable)
const char * get_ptr() const
Definition: string_base.h:381
format_hresult(HRESULT p_code)
Definition: win-objects.cpp:85
const win32_menu & operator=(const win32_menu &)
static bool g_wait_for(HANDLE p_event, double p_timeout_seconds)
Returns true when signaled, false on timeout.
void set(HANDLE p_handle)
Definition: win-objects.h:127
void winUnPrefixPath(pfc::string_base &out, const char *p_path)
Definition: win-objects.cpp:65
format_win32_error(DWORD p_code)
Definition: win-objects.cpp:79
size_t t_size
Definition: int_types.h:48
string8_fastalloc string_formatter
Definition: string_base.h:614
void set(HICON p_icon)
Definition: win-objects.h:166
exception_com(HRESULT p_code, const char *msg)
Definition: win-objects.h:233
exception_com(HRESULT p_code)
Definition: win-objects.h:232
HANDLE m_handle
Definition: win-objects.h:152
HMENU m_menu
Definition: win-objects.h:117
bool IsPointInsideControl(const POINT &pt, HWND wnd)
const DWORD m_val
Definition: win-objects.h:17
void release()
HRESULT get_code() const
Definition: win-objects.h:234
Simple implementation of a COM reference counter. The initial reference count is zero, so it can be used with pfc::com_ptr_t<> with plain operator=/constructor rather than attach().
Definition: win-objects.h:243
TItem * GetPtr() const
Definition: win-objects.h:87
std::exception exception
Definition: primitives.h:193
HRESULT m_code
Definition: win-objects.h:236
static DWORD g_calculate_wait_time(double p_seconds)
SelectObjectScope(HDC p_dc, HGDIOBJ p_obj)
Definition: win-objects.h:195
const char * get_ptr() const
Definition: win-objects.h:35
HANDLE detach()
Definition: win-objects.h:130
exception_win32(DWORD p_code)
Definition: win-objects.h:43
void uAddWindowStyle(HWND p_wnd, LONG p_style)
Definition: win-objects.cpp:99
bool is_valid() const
Definition: win-objects.h:131
t_size GetSize() const
Definition: win-objects.h:76
HICON m_icon
Definition: win-objects.h:176
bool Open(HWND p_owner)
void create(bool p_manualreset, bool p_initialstate)
unsigned GetHotkeyModifierFlags()
Returns current modifier keys pressed, using win32 MOD_* flags.
DWORD get_code() const
Definition: win-objects.h:44
win32_icon(HICON p_initval)
Definition: win-objects.h:160
bool wait_for(double p_timeout_seconds)
Returns true when signaled, false on timeout.
Definition: win-objects.h:136
const win32_event & operator=(const win32_event &)
virtual ~ImplementCOMRefCounter()
Definition: win-objects.h:255
TPtr * Receive()
Definition: win-objects.h:269
ULONG STDMETHODCALLTYPE Release()
Definition: win-objects.h:249
void uAddWindowExStyle(HWND p_wnd, LONG p_style)
pfc::string8 m_buffer
Definition: win-objects.h:27
void set_state(bool p_state)
unsigned MapDialogWidth(HWND p_dialog, unsigned p_value)