OLD | NEW |
| (Empty) |
1 // Windows Template Library - WTL version 8.0 | |
2 // Copyright (C) Microsoft Corporation. All rights reserved. | |
3 // | |
4 // This file is a part of the Windows Template Library. | |
5 // The use and distribution terms for this software are covered by the | |
6 // Microsoft Permissive License (Ms-PL) which can be found in the file | |
7 // Ms-PL.txt at the root of this distribution. | |
8 | |
9 #ifndef __ATLWINCE_H__ | |
10 #define __ATLWINCE_H__ | |
11 | |
12 #pragma once | |
13 | |
14 #ifndef __cplusplus | |
15 #error ATL requires C++ compilation (use a .cpp suffix) | |
16 #endif | |
17 | |
18 #ifndef __ATLAPP_H__ | |
19 #error atlwince.h requires atlapp.h to be included first | |
20 #endif | |
21 | |
22 #ifndef __ATLWIN_H__ | |
23 #error atlwince.h requires atlwin.h to be included first | |
24 #endif | |
25 | |
26 #ifndef _WIN32_WCE | |
27 #error atlwince.h compiles under Windows CE only | |
28 #elif (_WIN32_WCE < 300) | |
29 #error atlwince.h requires Windows CE 3.0 or higher. | |
30 #endif | |
31 | |
32 #if defined(WIN32_PLATFORM_WFSP) && _MSC_VER < 1400 // EVC compiling SmartPhone
code | |
33 #if (WIN32_PLATFORM_WFSP < 200) | |
34 #error atlwince.h requires Smartphone 2003 or higher | |
35 #endif | |
36 #endif // WIN32_PLATFORM_WFSP | |
37 | |
38 #if defined(WIN32_PLATFORM_PSPC) && _MSC_VER < 1400 // EVC compiling Pocket PC
code | |
39 #if (WIN32_PLATFORM_PSPC < 310) | |
40 #error atlwince.h requires Pocket PC 2002 or higher | |
41 #endif | |
42 #endif // WIN32_PLATFORM_PSPC | |
43 | |
44 #if !defined(_AYGSHELL_H_) && !defined(__AYGSHELL_H__) | |
45 #error atlwince.h requires aygshell.h to be included first | |
46 #else | |
47 #if defined(WIN32_PLATFORM_WFSP) && !defined(_TPCSHELL_H_) | |
48 #error SmartPhone dialog classes require tpcshell.h to be included first | |
49 #endif | |
50 #endif | |
51 | |
52 #if (_MSC_VER >= 1400) // VS2005 | |
53 #include <DeviceResolutionAware.h> | |
54 #define _WTL_CE_DRA | |
55 #endif // (_MSC_VER >= 1400) | |
56 | |
57 #if !defined(_WTL_CE_NO_DIALOGS) && !defined(__ATLFRAME_H__) | |
58 #error Orientation aware dialog classes require atlframe.h to be include
d first | |
59 #endif | |
60 | |
61 #if !defined(_WTL_CE_NO_APPWINDOW) && !defined(__ATLFRAME_H__) | |
62 #error Application window class require atlframe.h to be included first | |
63 #endif | |
64 | |
65 #if !defined(_WTL_CE_NO_ZOOMSCROLL) && !defined(__ATLSCRL_H__) | |
66 #error ZoomScroll implementation requires atlscrl.h to be included first | |
67 #endif | |
68 | |
69 #if !defined(_WTL_CE_NO_ZOOMSCROLL) | |
70 #if !(defined(__ATLTYPES_H__) || (defined(__ATLMISC_H__) && !defined(_WTL_NO_W
TYPES))) | |
71 #error ZoomScroll requires _WTL_NO_WTYPES not to be defined and either a
tlmisc.h or atltypes.h to be included first | |
72 #endif // !(defined(__ATLTYPES_H__) || (defined(__ATLMISC_H__) && !defined(_WT
L_NO_WTYPES))) | |
73 #endif // !defined(_WTL_CE_NO_ZOOMSCROLL) | |
74 | |
75 #if !defined(WIN32_PLATFORM_WFSP) && !defined(WIN32_PLATFORM_PSPC) | |
76 #define _WTL_CE_NO_CONTROLS | |
77 #endif // !defined(WIN32_PLATFORM_WFSP) && !defined(WIN32_PLATFORM_PSPC) | |
78 | |
79 #ifndef _WTL_CE_NO_CONTROLS | |
80 #ifndef __ATLCTRLS_H__ | |
81 #error The PPC/SmartPhone controls classes require atlctrls.h to be incl
uded first | |
82 #endif | |
83 | |
84 #include <htmlctrl.h> | |
85 #pragma comment(lib, "htmlview.lib") | |
86 | |
87 #include <voicectl.h> | |
88 #pragma comment(lib, "voicectl.lib") | |
89 | |
90 #ifdef WIN32_PLATFORM_PSPC | |
91 #include <richink.h> | |
92 #pragma comment(lib, "richink.lib") | |
93 | |
94 #include <inkx.h> | |
95 #pragma comment(lib, "inkx.lib") | |
96 | |
97 #include <doclist.h> | |
98 #pragma comment(lib, "doclist.lib") | |
99 #endif | |
100 #endif | |
101 | |
102 | |
103 /////////////////////////////////////////////////////////////////////////////// | |
104 // Classes in this file: | |
105 // | |
106 // CStdDialogBase<T, t_shidiFlags, t_bModal> : Standard PPC/SmartPhone dialog ba
se class | |
107 // CStdDialogImplBase - Base implementation of standard dialog | |
108 // CStdDialogImpl<T, t_shidiFlags, t_bModal> : Standard dialog implementation | |
109 // CStdIndirectDialogImpl - implementation of standard indirect PPC/SmartPhone d
ialog | |
110 // CStdAxDialogImpl<T, t_shidiFlags, t_bModal> : Standard AxDialog implementatio
n | |
111 // CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags> : Standard simple dialog | |
112 // CStdDialogResizeImplBase - Base implementation of orientation resizing standa
rd dialog | |
113 // CStdDialogResizeImpl<T, t_shidiFlags, t_bModal> : Orientation resizing standa
rd dialog implementation | |
114 // CStdAxDialogResizeImpl - implementation of orientation resizing standard AxDi
alog | |
115 // CStdSimpleDialogResizeImpl<T, t_wDlgTemplateID, t_shidiFlags> : Standard resi
zing simple dialog implementation | |
116 // CStdOrientedDialogBase - Oriented PPC standard dialog base class | |
117 // CStdOrientedDialogImplBase - Oriented PPC standard dialog base implementation | |
118 // CStdOrientedDialogImpl<T, t_shidiFlags, t_bModal> : Oriented PPC standard dia
log implementation | |
119 // CStdAxOrientedDialogImpl - Oriented PPC standard AxDialog implementation | |
120 // CStdSimpleOrientedDialog<t_wDlgTemplateID, t_wDlgLandscapeID, t_shidiFlags> :
Standard simple orientable dialog | |
121 // | |
122 // CAppInfoBase : Helper for application state save/restore to registry | |
123 // CAppInfoT<T> : CAppInfoBase constructed from a CAppWindow<T> | |
124 // CAppWindowBase<T> : Base class for PPC/SmartPhone well-behaved application wi
ndow or dialog | |
125 // CAppWindow<T> : PPC/SmartPhone well-behaved application window class | |
126 // CAppDialog<T> : PPC/SmartPhone well-behaved application dialog class | |
127 // CAppStdDialogImplBase - Base implementation of standard application dialogs | |
128 // CAppStdDialogImpl<T, t_shidiFlags, t_bModal> : Implementation of standard app
lication dialog | |
129 // CAppStdDialogResizeImpl - implementation of orientation resizing standard app
lication dialog | |
130 // CAppStdAxDialogImpl - Implementation of standard application AxDialog | |
131 // CAppStdAxDialogResizeImpl - implementation of orientation resizing standard a
pplication AxDialog | |
132 // CAppStdOrientedDialogImpl - implementation of oriented PPC standard applicati
on dialog | |
133 // CAppStdAxOrientedDialogImpl - implementation of oriented PPC standard applica
tion AxDialog | |
134 // | |
135 // CFullScreenFrame<T, t_bHasSip> : Full screen frame class | |
136 // | |
137 // CZoomScrollImpl<T> : WinCE zooming implementation | |
138 // | |
139 // CBottomTabViewImpl<T, TBase, TWinTraits> - CBottomTabView | |
140 // CHtmlCtrlT<TBase> - CHtmlCtrl | |
141 // CRichInkCtrlT<TBase> - CRichInkCtrl | |
142 // CInkXCtrlT<TBase> - CInkXCtrl | |
143 // CVoiceRecorderCtrlT<TBase> - CVoiceRecorderCtrl | |
144 // CDocListCtrlT<TBase> - CDocListCtrl | |
145 // CCapEditT<TBase> - CCapEdit | |
146 // CTTStaticT<TBase> - CTTStatic | |
147 // CTTButtonT<TBase> - CTTButton | |
148 // | |
149 // CSpinCtrlT<TBase> - CSpinCtrl : SmartPhone specific UpDown control | |
150 // CSpinned<TBase, t_bExpandOnly> : SmartPhone association of control and Spin | |
151 // CSpinListBox : SmartPhone spinned ListBox control | |
152 // CExpandListBox : SmartPhone expandable ListBox control | |
153 // CExpandEdit : SmartPhone expandable Edit control | |
154 // CExpandCapEdit : SmartPhone expandable CapEdit control | |
155 // | |
156 // Global functions: | |
157 // AtlCreateMenuBar() | |
158 // AtlCreateEmptyMenuBar() | |
159 // AtlIsEditFocus() | |
160 // AtlActivateBackKey() | |
161 | |
162 namespace WTL | |
163 { | |
164 | |
165 /////////////////////////////////////////////////////////////////////////////// | |
166 // MenuBar creation functions for property sheets and dialogs | |
167 // Frame windows use CreateSimpleCEMenuBar | |
168 | |
169 inline HWND AtlCreateMenuBar(SHMENUBARINFO& mbi) | |
170 { | |
171 ATLASSERT(::IsWindow(mbi.hwndParent)); | |
172 ATLVERIFY(::SHCreateMenuBar(&mbi) != FALSE); | |
173 return mbi.hwndMB; | |
174 }; | |
175 | |
176 inline HWND AtlCreateMenuBar(HWND hWnd, UINT nToolBarId = ATL_IDW_TOOLBAR, DWORD
dwFlags = 0, int nBmpId = 0, int cBmpImages = 0, COLORREF clrBk = 0) | |
177 { | |
178 SHMENUBARINFO mbi = { sizeof(mbi), hWnd, dwFlags, nToolBarId, ModuleHelp
er::GetResourceInstance(), nBmpId, cBmpImages, 0, clrBk }; | |
179 return AtlCreateMenuBar(mbi); | |
180 } | |
181 | |
182 inline HWND AtlCreateEmptyMenuBar(HWND hWnd, bool bSip = true) | |
183 { | |
184 SHMENUBARINFO embi = { sizeof(SHMENUBARINFO), hWnd, SHCMBF_EMPTYBAR }; | |
185 if (!bSip) | |
186 embi.dwFlags |= SHCMBF_HIDESIPBUTTON; | |
187 | |
188 return AtlCreateMenuBar(embi); | |
189 } | |
190 | |
191 /////////////////////////////////////////////////////////////////////////////// | |
192 // Helper functions for SmartPhone back key handling | |
193 | |
194 inline bool AtlIsEditFocus() | |
195 { | |
196 ATL::CWindow wCtrl = GetFocus(); | |
197 if (wCtrl.IsWindow()) | |
198 { | |
199 TCHAR szClassName[8] = {0}; | |
200 ATLVERIFY(::GetClassName(wCtrl.m_hWnd, szClassName, 8)); | |
201 return !_tcscmp(szClassName, _T("Edit")) || !_tcscmp(szClassName
, WC_CAPEDIT); | |
202 } | |
203 return false; | |
204 } | |
205 | |
206 #if defined WIN32_PLATFORM_WFSP | |
207 inline void AtlActivateBackKey(HWND hMenuBar) | |
208 { | |
209 ATLASSERT(::IsWindow(hMenuBar)); | |
210 ::SendMessage(hMenuBar, SHCMBM_OVERRIDEKEY, VK_TBACK, | |
211 MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, SHMBOF_NODEFAULT |
SHMBOF_NOTIFY)); | |
212 } | |
213 #endif // WIN32_PLATFORM_WFSP | |
214 | |
215 // --- Standard PPC/SmartPhone dialogs --- | |
216 | |
217 #ifndef _WTL_CE_NO_DIALOGS | |
218 | |
219 /////////////////////////////////////////////////////////////////////////////// | |
220 // CStdDialogBase - base class for standard PPC/SmartPhone dialogs | |
221 | |
222 #define WTL_STD_SHIDIF SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULL
SCREEN | |
223 #define WTL_SP_SHIDIF SHIDIF_SIZEDLGFULLSCREEN | |
224 | |
225 // Title setting macros | |
226 #define WTL_DLG_TITLEHEIGHT(iHeight) static const int GetTitleHeight(){return iH
eight;} | |
227 #define WTL_DLG_NOTITLE WTL_DLG_TITLEHEIGHT(0) | |
228 | |
229 /////////////////////////////////////////////////////////////////////////////// | |
230 // CStdDialogBase - Base class for standard PPC/SmartPhone dialog | |
231 | |
232 template <class T, UINT t_shidiFlags, bool t_bModal = true> | |
233 class CStdDialogBase | |
234 { | |
235 public: | |
236 #ifdef WIN32_PLATFORM_PSPC | |
237 // Pocket PC only Dialog title handling | |
238 const int nTitleHeight; | |
239 | |
240 CStdDialogBase() : nTitleHeight(T::GetTitleHeight()) | |
241 { } | |
242 | |
243 // Overloads | |
244 BOOL GetClientRect(LPRECT lpRect) | |
245 { | |
246 T* pT = static_cast<T*>(this); | |
247 ATLASSERT(pT->IsWindow()); | |
248 BOOL bRes = ::GetClientRect(pT->m_hWnd, lpRect); | |
249 lpRect->top += nTitleHeight; | |
250 return bRes; | |
251 } | |
252 | |
253 BOOL SetWindowText(LPCTSTR lpszString) | |
254 { | |
255 T* pT = static_cast<T*>(this); | |
256 ATLASSERT(pT->IsWindow()); | |
257 BOOL bRes = ::SetWindowText(pT->m_hWnd, lpszString); | |
258 if (nTitleHeight != 0) | |
259 pT->DoPaintTitle(); | |
260 return bRes; | |
261 } | |
262 | |
263 // Overrideables | |
264 static const int GetTitleHeight() | |
265 { | |
266 #ifdef _WTL_CE_DRA | |
267 return DRA::SCALEY(24); | |
268 #else // !_WTL_CE_DRA | |
269 CWindowDC dc(NULL); | |
270 return dc.GetDeviceCaps(LOGPIXELSY) >> 2; // LOGPIXELSY * 24 / 9
6, | |
271 #endif // !_WTL_CE_DRA | |
272 } | |
273 | |
274 // Title painting | |
275 bool DoPaintTitle() | |
276 { | |
277 T* pT = static_cast<T*>(this); | |
278 ATLASSERT(pT->IsWindow()); | |
279 TCHAR sTitle[48]; | |
280 | |
281 // Preparation | |
282 CPaintDC dc(pT->m_hWnd); | |
283 CFont fontTitle = AtlCreateBoldFont(); | |
284 CFontHandle fontOld = dc.SelectFont(fontTitle); | |
285 dc.SetTextColor(GetSysColor(COLOR_HIGHLIGHT)); | |
286 int nLen = pT->GetWindowText(sTitle, 48); | |
287 int nWidth = dc.GetDeviceCaps(HORZRES); | |
288 | |
289 // Display title text | |
290 RECT rTitle = { 0, 0, nWidth, nTitleHeight }; | |
291 dc.FillRect(&rTitle, COLOR_3DHIGHLIGHT); | |
292 #ifdef _WTL_CE_DRA | |
293 rTitle.left = DRA::SCALEX(8); | |
294 #else // !_WTL_CE_DRA | |
295 rTitle.left = nTitleHeight / 3; // 8 == 24 / 3 | |
296 #endif // !_WTL_CE_DRA | |
297 dc.DrawText(sTitle, nLen, &rTitle, DT_VCENTER | DT_SINGLELINE); | |
298 dc.SelectFont(fontOld); | |
299 | |
300 // Draw bottom line, 2 pixels thick if HI_RES_AWARE | |
301 CPenHandle penOld = dc.SelectStockPen(BLACK_PEN); | |
302 POINT line[4] = {{0, nTitleHeight}, {nWidth, nTitleHeight}, {0,
nTitleHeight - 1}, {nWidth, nTitleHeight - 1}}; | |
303 | |
304 #ifdef _WTL_CE_DRA | |
305 int nSeg = DRA::SCALEY(1); | |
306 #else // !_WTL_CE_DRA | |
307 int nSeg = nTitleHeight / 24; | |
308 #endif // !_WTL_CE_DRA | |
309 | |
310 dc.Polyline(line, nSeg <= 2 ? nSeg * 2 : 4); | |
311 dc.SelectPen(penOld); | |
312 | |
313 return false; | |
314 } | |
315 | |
316 // Title preparation: move the dialog controls down to make room for tit
le | |
317 void DialogTitleInit() | |
318 { | |
319 T* pT = static_cast<T*>(this); | |
320 ATLASSERT(pT->IsWindow()); | |
321 | |
322 ATL::CWindow wCtl = pT->GetWindow(GW_CHILD); | |
323 while (wCtl.IsWindow()) | |
324 { | |
325 RECT rCtl = { 0 }; | |
326 wCtl.GetWindowRect(&rCtl); | |
327 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rCtl, 2); | |
328 ::OffsetRect(&rCtl, 0, nTitleHeight); | |
329 wCtl.MoveWindow(&rCtl, FALSE); | |
330 wCtl = wCtl.GetWindow(GW_HWNDNEXT); | |
331 } | |
332 } | |
333 | |
334 // SIP management | |
335 void DoSipInfo() | |
336 { | |
337 T* pT = static_cast<T*>(this); | |
338 ATLASSERT(pT->IsWindow()); | |
339 | |
340 SIPINFO si = {sizeof(SIPINFO)}; | |
341 SipGetInfo(&si); | |
342 if ((si.fdwFlags & SIPF_ON) ^ SIPF_ON) | |
343 si.rcVisibleDesktop.bottom = si.rcSipRect.bottom; | |
344 pT->MoveWindow(&si.rcVisibleDesktop, FALSE); | |
345 } | |
346 | |
347 // Title painting handler | |
348 LRESULT OnPaintTitle(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/
, BOOL& bHandled) | |
349 { | |
350 T* pT = static_cast<T*>(this); | |
351 return bHandled = nTitleHeight ? pT->DoPaintTitle() : FALSE; | |
352 } | |
353 | |
354 // SIP handler | |
355 LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/,
BOOL& bHandled) | |
356 { | |
357 T* pT = static_cast<T*>(this); | |
358 if (wParam == SPI_SETSIPINFO) | |
359 { | |
360 pT->DoSipInfo(); | |
361 return TRUE; | |
362 } | |
363 return bHandled = FALSE; | |
364 } | |
365 | |
366 #elif defined WIN32_PLATFORM_WFSP | |
367 // SmartPhone VK_TBACK key standard management | |
368 LRESULT OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandl
ed*/) | |
369 { | |
370 T* pT = static_cast<T*>(this); | |
371 const UINT uModif = (UINT)LOWORD(lParam); | |
372 const UINT uVirtKey = (UINT)HIWORD(lParam); | |
373 | |
374 if(uVirtKey == VK_TBACK) | |
375 if (AtlIsEditFocus()) | |
376 ::SHSendBackToFocusWindow(uMsg, wParam, lParam); | |
377 else if (uModif & MOD_KEYUP) | |
378 pT->StdCloseDialog(IDCANCEL); | |
379 return 1; | |
380 } | |
381 | |
382 // SmartPhone MenuBar and VK_TBACK key initialization | |
383 void StdSPInit() | |
384 { | |
385 T* pT = static_cast<T*>(this); | |
386 HWND hMenuBar = ::SHFindMenuBar(pT->m_hWnd); | |
387 | |
388 if (!hMenuBar && (t_shidiFlags & SHIDIF_DONEBUTTON)) | |
389 hMenuBar = CreateMenuBar(ATL_IDM_MENU_DONE); | |
390 | |
391 if(hMenuBar != NULL) | |
392 AtlActivateBackKey(hMenuBar); | |
393 } | |
394 | |
395 void SetStaticBold() | |
396 { | |
397 T* pT = static_cast<T*>(this); | |
398 ATLASSERT(pT->IsWindow()); | |
399 | |
400 CFontHandle fontBold = AtlCreateBoldFont(pT->GetFont()); | |
401 | |
402 ATL::CWindow wCtl = pT->GetWindow(GW_CHILD); | |
403 | |
404 while (wCtl.IsWindow()) | |
405 { | |
406 if ((short int)wCtl.GetDlgCtrlID() == IDC_STATIC) | |
407 wCtl.SetFont(fontBold); | |
408 wCtl = wCtl.GetWindow(GW_HWNDNEXT); | |
409 } | |
410 } | |
411 #endif // WIN32_PLATFORM_WFSP | |
412 | |
413 // Platform dependant initialization | |
414 void StdPlatformInit() | |
415 { | |
416 T* pT = static_cast<T*>(this); | |
417 #ifdef WIN32_PLATFORM_PSPC // Pocket PC title initialization | |
418 if (nTitleHeight != 0) | |
419 pT->DialogTitleInit(); | |
420 #elif defined(WIN32_PLATFORM_WFSP) | |
421 pT->StdSPInit(); | |
422 SetStaticBold(); | |
423 #endif // WIN32_PLATFORM_WFSP | |
424 } | |
425 | |
426 // Menu bar creation | |
427 HWND CreateMenuBar(UINT uiMB = T::IDD, int nBmpImages = 0) | |
428 { | |
429 T* pT = static_cast<T*>(this); | |
430 return AtlCreateMenuBar(pT->m_hWnd, uiMB, 0, nBmpImages ? uiMB :
0, nBmpImages); | |
431 } | |
432 | |
433 // Dialog closing | |
434 void StdCloseDialog(WORD wID) | |
435 { | |
436 T* pT = static_cast<T*>(this); | |
437 if (t_bModal) | |
438 ::EndDialog(pT->m_hWnd, wID); | |
439 else | |
440 pT->DestroyWindow(); | |
441 } | |
442 | |
443 // Shell dialog layout initialization | |
444 void StdShidInit() | |
445 { | |
446 T* pT = static_cast<T*>(this); | |
447 SHINITDLGINFO shidi = { SHIDIM_FLAGS, pT->m_hWnd, t_shidiFlags }
; | |
448 ::SHInitDialog(&shidi); | |
449 } | |
450 | |
451 // IDC_INFOSTATIC background setting | |
452 LRESULT OnColorStatic(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL&
bHandled) | |
453 { | |
454 if (::GetDlgCtrlID((HWND)lParam) == IDC_INFOSTATIC) | |
455 { | |
456 ::SetBkMode((HDC)wParam, TRANSPARENT); | |
457 return (LRESULT)::GetSysColorBrush(COLOR_INFOBK); | |
458 } | |
459 return bHandled = FALSE; | |
460 } | |
461 | |
462 // Menu dialog ending | |
463 LRESULT OnMenuClose(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BO
OL& /*bHandled*/) | |
464 { | |
465 T* pT = static_cast<T*>(this); | |
466 pT->StdCloseDialog((WORD)(wID - ID_MENU_OK + IDOK)); | |
467 return 0; | |
468 } | |
469 | |
470 // Standard dialog ending: may be used with any command | |
471 LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOO
L& /*bHandled*/) | |
472 { | |
473 T* pT = static_cast<T*>(this); | |
474 pT->StdCloseDialog(wID); | |
475 return 0; | |
476 } | |
477 }; | |
478 | |
479 | |
480 /////////////////////////////////////////////////////////////////////////////// | |
481 // CStdDialogImplBase - Base implementation of standard PPC/SmartPhone dialog | |
482 | |
483 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true, cla
ss TBase = ATL::CDialogImpl< T > > | |
484 class ATL_NO_VTABLE CStdDialogImplBase : | |
485 public TBase, | |
486 public CStdDialogBase<T, t_shidiFlags, t_bModal> | |
487 { | |
488 public: | |
489 #ifdef WIN32_PLATFORM_PSPC | |
490 BOOL GetClientRect(LPRECT lpRect) | |
491 { | |
492 return CStdDialogBase<T, t_shidiFlags, t_bModal>::GetClientRect(
lpRect); | |
493 } | |
494 | |
495 BOOL SetWindowText(LPCTSTR lpszString) | |
496 { | |
497 return CStdDialogBase<T, t_shidiFlags, t_bModal>::SetWindowText(
lpszString); | |
498 } | |
499 #endif | |
500 | |
501 BEGIN_MSG_MAP(CStdDialogImplBase) | |
502 #ifdef WIN32_PLATFORM_PSPC // Pocket PC title and SIP | |
503 MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) | |
504 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) | |
505 #elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key | |
506 MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) | |
507 #endif | |
508 MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) | |
509 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) | |
510 COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd) | |
511 COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) | |
512 END_MSG_MAP() | |
513 | |
514 LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/
, BOOL& bHandled) | |
515 { | |
516 #ifdef _DEBUG | |
517 T* pT = static_cast<T*>(this); | |
518 ATLASSERT(t_bModal == pT->m_bModal); | |
519 #endif | |
520 StdPlatformInit(); | |
521 StdShidInit(); | |
522 return bHandled = FALSE; | |
523 } | |
524 }; | |
525 | |
526 /////////////////////////////////////////////////////////////////////////////// | |
527 // CStdDialogImpl - implementation of standard PPC/SmartPhone dialog | |
528 | |
529 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true > | |
530 class ATL_NO_VTABLE CStdDialogImpl : public CStdDialogImplBase< T, t_shidiFlags,
t_bModal> | |
531 {}; | |
532 | |
533 /////////////////////////////////////////////////////////////////////////////// | |
534 // CStdIndirectDialogImpl - implementation of standard indirect PPC/SmartPhone d
ialog | |
535 | |
536 #if defined __ATLDLGS_H__ | |
537 | |
538 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true> | |
539 class ATL_NO_VTABLE CStdIndirectDialogImpl : | |
540 public CIndirectDialogImpl< T, CMemDlgTemplate, CStdDialogImpl<T, t_shid
iFlags, t_bModal> > | |
541 { | |
542 public: | |
543 typedef CIndirectDialogImpl< T, CMemDlgTemplate, CStdDialogImpl<T, t_shi
diFlags, t_bModal> > _baseClass; | |
544 typedef CStdDialogImpl<T, t_shidiFlags, t_bModal> _baseStd; | |
545 | |
546 INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow(), LPARAM dwInitPara
m = NULL) | |
547 { | |
548 ATLASSERT(t_bModal); | |
549 | |
550 if (!m_Template.IsValid()) | |
551 CreateTemplate(); | |
552 | |
553 if (m_Template.IsTemplateEx()) | |
554 { | |
555 if (m_Template.GetTemplateExPtr()->style & DS_CENTER) | |
556 { | |
557 ATLASSERT(m_Template.GetTemplateExPtr()->style ^
WS_CHILD); | |
558 GetTemplateExPtr()->style |= WS_POPUP; | |
559 } | |
560 } | |
561 else | |
562 { | |
563 if (m_Template.GetTemplatePtr()->style & DS_CENTER) | |
564 { | |
565 ATLASSERT(m_Template.GetTemplatePtr()->style ^ W
S_CHILD); | |
566 m_Template.GetTemplatePtr()->style |= WS_POPUP; | |
567 } | |
568 } | |
569 | |
570 return _baseClass::DoModal(hWndParent, dwInitParam); | |
571 } | |
572 | |
573 HWND Create(HWND hWndParent, LPARAM dwInitParam = NULL) | |
574 { | |
575 ATLASSERT(!t_bModal); | |
576 | |
577 if (!m_Template.IsValid()) | |
578 CreateTemplate(); | |
579 | |
580 if (m_Template.IsTemplateEx()) | |
581 { | |
582 if (GetTemplateExPtr()->style & DS_CENTER) | |
583 { | |
584 ATLASSERT(GetTemplateExPtr()->style ^ WS_CHILD); | |
585 GetTemplateExPtr()->style |= WS_POPUP; | |
586 } | |
587 } | |
588 else | |
589 { | |
590 if (GetTemplatePtr()->style & DS_CENTER) | |
591 { | |
592 ATLASSERT(GetTemplatePtr()->style ^ WS_CHILD); | |
593 GetTemplatePtr()->style |= WS_POPUP; | |
594 } | |
595 } | |
596 | |
597 return _baseClass::Create(hWndParent, dwInitParam); | |
598 } | |
599 | |
600 BEGIN_MSG_MAP(CStdIndirectDialogImpl) | |
601 CHAIN_MSG_MAP(_baseStd) | |
602 END_MSG_MAP() | |
603 | |
604 }; | |
605 | |
606 #endif // defined __ATLDLGS_H__ | |
607 | |
608 #ifndef _ATL_NO_HOSTING | |
609 | |
610 /////////////////////////////////////////////////////////////////////////////// | |
611 // CStdAxDialogImpl - implementation of standard PPC/SmartPhone AxDialog | |
612 | |
613 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true > | |
614 class ATL_NO_VTABLE CStdAxDialogImpl : public CStdDialogImplBase< T, t_shidiFlag
s, t_bModal, ATL::CAxDialogImpl< T > > | |
615 {}; | |
616 #endif // _ATL_NO_HOSTING | |
617 | |
618 /////////////////////////////////////////////////////////////////////////////// | |
619 // CStdSimpleDialog - standard PPC/SmartPhone simple dialog with SHIDIF_xxx flag
s | |
620 | |
621 template <WORD t_wDlgTemplateID, UINT t_shidiFlags = WTL_STD_SHIDIF> | |
622 class CStdSimpleDialog : | |
623 public ATL::CSimpleDialog<t_wDlgTemplateID, FALSE>, | |
624 public CStdDialogBase<CStdSimpleDialog<t_wDlgTemplateID, t_shidi
Flags>, t_shidiFlags> | |
625 { | |
626 public: | |
627 typedef CStdDialogBase<CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>,
t_shidiFlags> baseClass; | |
628 | |
629 #ifdef WIN32_PLATFORM_PSPC | |
630 BOOL GetClientRect(LPRECT lpRect) | |
631 { | |
632 return baseClass::GetClientRect(lpRect); | |
633 } | |
634 | |
635 BOOL SetWindowText(LPCTSTR lpszString) | |
636 { | |
637 return baseClass::SetWindowText(lpszString); | |
638 } | |
639 #endif | |
640 | |
641 BEGIN_MSG_MAP(CStdSimpleDialog) | |
642 #ifdef WIN32_PLATFORM_PSPC // Pocket PC title and SIP | |
643 MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) | |
644 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) | |
645 #elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key | |
646 MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) | |
647 #endif | |
648 MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) | |
649 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) | |
650 COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) | |
651 COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd) | |
652 END_MSG_MAP() | |
653 | |
654 LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/
, BOOL& bHandled) | |
655 { | |
656 StdPlatformInit(); | |
657 StdShidInit(); | |
658 return bHandled = FALSE; | |
659 } | |
660 }; | |
661 | |
662 /////////////////////////////////////////////////////////////////////////////// | |
663 // CStdDialogResizeImplBase - Base implementation of orientation resizing standa
rd PPC/SmartPhone dialog | |
664 | |
665 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true, cla
ss TBase = ATL::CDialogImpl<T> > | |
666 class ATL_NO_VTABLE CStdDialogResizeImplBase : | |
667 public CStdDialogImplBase< T, t_shidiFlags, t_bModal, TBase>, | |
668 public CDialogResize<T> | |
669 { | |
670 public: | |
671 // Note: BEGIN_DLGRESIZE_MAP is required in the derived class. | |
672 | |
673 BEGIN_MSG_MAP(CStdResizeDialogImplBase) | |
674 #ifdef WIN32_PLATFORM_PSPC // Pocket PC title | |
675 MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) | |
676 #elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key | |
677 MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) | |
678 #endif | |
679 MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) | |
680 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) | |
681 COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd) | |
682 COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) | |
683 CHAIN_MSG_MAP(CDialogResize< T >) | |
684 END_MSG_MAP() | |
685 | |
686 LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/
, BOOL& bHandled) | |
687 { | |
688 #ifdef _DEBUG | |
689 T* pT = static_cast<T*>(this); | |
690 ATLASSERT(t_bModal == pT->m_bModal); | |
691 #endif | |
692 StdPlatformInit(); | |
693 DlgResize_Init(FALSE); | |
694 StdShidInit(); | |
695 return bHandled = FALSE; | |
696 } | |
697 }; | |
698 | |
699 /////////////////////////////////////////////////////////////////////////////// | |
700 // CStdDialogResizeImpl - implementation of orientation resizing standard PPC/Sm
artPhone dialog | |
701 | |
702 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true > | |
703 class ATL_NO_VTABLE CStdDialogResizeImpl : public CStdDialogResizeImplBase< T, t
_shidiFlags, t_bModal> | |
704 {}; | |
705 | |
706 #ifndef _ATL_NO_HOSTING | |
707 | |
708 /////////////////////////////////////////////////////////////////////////////// | |
709 // CStdAxDialogResizeImpl - implementation of orientation resizing standard PPC/
SmartPhone AxDialog | |
710 | |
711 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true > | |
712 class ATL_NO_VTABLE CStdAxDialogResizeImpl : public CStdDialogResizeImplBase< T,
t_shidiFlags, t_bModal, ATL::CAxDialogImpl<T> > | |
713 {}; | |
714 #endif // _ATL_NO_HOSTING | |
715 | |
716 /////////////////////////////////////////////////////////////////////////////// | |
717 // CStdSimpleDialogResizeImpl - implementation of standard resizing simple dialo
g with SHIDIF_xxx flags | |
718 | |
719 // Usage: | |
720 // class CMyDlg : public CStdSimpleDialogResize<CMyDlg, | |
721 // IDD_MYDLG, SHIDIF_DONEBUTTON | SHIDIF_FULLSCREENNOMENUBAR> | |
722 // { | |
723 // public: | |
724 // BEGIN_DLGRESIZE_MAP(CMyDlg) | |
725 // ... | |
726 // END_DLGRESIZE_MAP() | |
727 // }; | |
728 | |
729 template <class T, WORD t_wDlgTemplateID, UINT t_shidiFlags = WTL_STD_SHIDIF> | |
730 class ATL_NO_VTABLE CStdSimpleDialogResizeImpl : | |
731 public CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>, | |
732 public CDialogResize< T > | |
733 { | |
734 public: | |
735 typedef CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>::baseClass base
Class; | |
736 | |
737 BEGIN_MSG_MAP(CStdSimpleDialogResizeImpl) | |
738 #ifdef WIN32_PLATFORM_PSPC // Pocket PC title | |
739 MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) | |
740 #elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key | |
741 MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) | |
742 #endif | |
743 MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) | |
744 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) | |
745 COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd) | |
746 COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) | |
747 CHAIN_MSG_MAP(CDialogResize< T >) | |
748 END_MSG_MAP() | |
749 | |
750 LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/
, BOOL& bHandled) | |
751 { | |
752 StdPlatformInit(); | |
753 DlgResize_Init(FALSE); | |
754 StdShidInit(); | |
755 return bHandled = FALSE; | |
756 } | |
757 }; | |
758 | |
759 #if defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC) | |
760 | |
761 /////////////////////////////////////////////////////////////////////////////// | |
762 // CStdOrientedDialogBase - Oriented PPC standard dialog base class | |
763 | |
764 template <class T> | |
765 class CStdOrientedDialogBase | |
766 { | |
767 public: | |
768 // Operation | |
769 BOOL SetOrientation(DRA::DisplayMode mode) | |
770 { | |
771 T* pT = static_cast<T*>(this); | |
772 ATLASSERT(pT->IsWindow()); | |
773 ATLASSERT(mode == DRA::GetDisplayMode()); | |
774 | |
775 // Derived dialog must enumerate TWO dialog templates with the s
ame control ids and types ie: | |
776 // enum { IDD = IDD_MYDLG, IDD_LANDSCAPE = IDD_MYDLG_L }; | |
777 UINT iResource = (mode == DRA::Landscape)? T::IDD_LANDSCAPE : T:
:IDD; | |
778 | |
779 BOOL bRes = DRA::RelayoutDialog(ModuleHelper::GetResourceInstanc
e(), pT->m_hWnd, MAKEINTRESOURCE(iResource)); | |
780 pT->OnOrientation(mode); | |
781 return bRes; | |
782 } | |
783 | |
784 // Override | |
785 void OnOrientation(DRA::DisplayMode /*mode*/) | |
786 {} | |
787 | |
788 // Message handlers | |
789 LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/,
BOOL& bHandled) | |
790 { | |
791 T* pT = static_cast<T*>(this); | |
792 ATLASSERT(pT->IsWindow()); | |
793 if (wParam == SETTINGCHANGE_RESET) | |
794 { | |
795 SetOrientation(DRA::GetDisplayMode()); | |
796 pT->StdPlatformInit(); | |
797 pT->StdShidInit(); | |
798 } | |
799 else if (wParam == SPI_SETSIPINFO) | |
800 { | |
801 pT->DoSipInfo(); | |
802 return TRUE; | |
803 } | |
804 return bHandled = FALSE; | |
805 } | |
806 }; | |
807 | |
808 /////////////////////////////////////////////////////////////////////////////// | |
809 // CStdOrientedDialogImplBase - Oriented PPC standard dialog base implementation | |
810 | |
811 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true, cla
ss TBase = ATL::CDialogImpl<T> > | |
812 class ATL_NO_VTABLE CStdOrientedDialogImplBase : | |
813 public CStdDialogImplBase< T, t_shidiFlags, t_bModal, TBase>, | |
814 public CStdOrientedDialogBase<T> | |
815 { | |
816 public: | |
817 BEGIN_MSG_MAP(CStdOrientedDialogImpl) | |
818 MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) | |
819 MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) | |
820 MESSAGE_HANDLER(WM_SETTINGCHANGE, CStdOrientedDialogBase<T>::OnS
ettingChange) | |
821 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) | |
822 COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd) | |
823 COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) | |
824 END_MSG_MAP() | |
825 | |
826 LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/
, BOOL& bHandled) | |
827 { | |
828 T* pT = static_cast<T*>(this); | |
829 #ifdef _DEBUG | |
830 ATLASSERT(t_bModal == pT->m_bModal); | |
831 #endif | |
832 if (DRA::GetDisplayMode() == DRA::Landscape) | |
833 SetOrientation(DRA::Landscape); | |
834 pT->StdPlatformInit(); | |
835 pT->StdShidInit(); | |
836 return bHandled = FALSE; | |
837 } | |
838 }; | |
839 | |
840 /////////////////////////////////////////////////////////////////////////////// | |
841 // CStdOrientedDialogImpl - Oriented PPC standard dialog implementation | |
842 | |
843 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true > | |
844 class ATL_NO_VTABLE CStdOrientedDialogImpl : public CStdOrientedDialogImplBase<
T, t_shidiFlags, t_bModal> | |
845 {}; | |
846 | |
847 #ifndef _ATL_NO_HOSTING | |
848 /////////////////////////////////////////////////////////////////////////////// | |
849 // CStdAxOrientedDialogImpl - Oriented PPC standard AxDialog implementation | |
850 | |
851 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true > | |
852 class ATL_NO_VTABLE CStdAxOrientedDialogImpl : public CStdOrientedDialogImplBase
< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl<T> > | |
853 {}; | |
854 #endif // _ATL_NO_HOSTING | |
855 | |
856 /////////////////////////////////////////////////////////////////////////////// | |
857 // CStdSimpleOrientedDialog - Standard simple orientable dialog | |
858 | |
859 template <WORD t_wDlgTemplateID, WORD t_wDlgLandscapeID, UINT t_shidiFlags = WTL
_STD_SHIDIF> | |
860 class CStdSimpleOrientedDialog : | |
861 public CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>, | |
862 public CStdOrientedDialogBase<CStdSimpleOrientedDialog<t_wDlgTem
plateID, t_wDlgLandscapeID, t_shidiFlags> > | |
863 { | |
864 public: | |
865 typedef CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>::baseClass base
Class; | |
866 typedef CStdOrientedDialogBase<CStdSimpleOrientedDialog<t_wDlgTemplateID
, t_wDlgLandscapeID, t_shidiFlags> > baseOriented; | |
867 | |
868 enum {IDD = t_wDlgTemplateID, IDD_LANDSCAPE = t_wDlgLandscapeID}; | |
869 | |
870 BEGIN_MSG_MAP(CStdSimpleDialog) | |
871 MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) | |
872 MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) | |
873 MESSAGE_HANDLER(WM_SETTINGCHANGE, baseOriented::OnSettingChange) | |
874 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) | |
875 COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd) | |
876 COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) | |
877 END_MSG_MAP() | |
878 | |
879 LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*
lParam*/, BOOL& bHandled) | |
880 { | |
881 if (DRA::GetDisplayMode() == DRA::Landscape) | |
882 SetOrientation(DRA::Landscape); | |
883 StdPlatformInit(); | |
884 StdShidInit(); | |
885 return bHandled = FALSE; | |
886 } | |
887 }; | |
888 | |
889 #endif // _WTL_CE_DRA | |
890 | |
891 | |
892 #endif // _WTL_CE_NO_DIALOGS | |
893 | |
894 | |
895 // --- PPC/SmartPhone application window and helpers --- | |
896 | |
897 #ifndef _WTL_CE_NO_APPWINDOW | |
898 | |
899 /////////////////////////////////////////////////////////////////////////////// | |
900 // CAppInfoBase - Helper for application state save/restore to registry | |
901 | |
902 class CAppInfoBase | |
903 { | |
904 public: | |
905 ATL::CRegKey m_Key; | |
906 | |
907 CAppInfoBase(ATL::_U_STRINGorID sAppKey) | |
908 { | |
909 m_Key.Create(HKEY_CURRENT_USER, sAppKey.m_lpstr); | |
910 ATLASSERT(m_Key.m_hKey); | |
911 } | |
912 | |
913 template <class V> | |
914 LONG Save(V& val, ATL::_U_STRINGorID sName) | |
915 { | |
916 return ::RegSetValueEx(m_Key, sName.m_lpstr, 0, REG_BINARY, (LPB
YTE)&val, sizeof(V)); | |
917 } | |
918 | |
919 template <class V> | |
920 LONG Save(int nb, V& val0, ATL::_U_STRINGorID sName) | |
921 { | |
922 return ::RegSetValueEx(m_Key, sName.m_lpstr, 0, REG_BINARY, (LPB
YTE)&val0, nb * sizeof(V)); | |
923 } | |
924 | |
925 template <class V> | |
926 LONG Restore(V& val, ATL::_U_STRINGorID sName) | |
927 { | |
928 DWORD valtype; | |
929 DWORD bufSize = sizeof(V); | |
930 return ::RegQueryValueEx(m_Key, sName.m_lpstr, 0, &valtype, (LPB
YTE)&val, &bufSize); | |
931 } | |
932 | |
933 template <class V> | |
934 LONG Restore(int nb, V& val0, ATL::_U_STRINGorID sName) | |
935 { | |
936 DWORD valtype; | |
937 DWORD bufSize = nb * sizeof(V); | |
938 return ::RegQueryValueEx(m_Key, sName.m_lpstr, 0, &valtype, (LPB
YTE)&val0, &bufSize); | |
939 } | |
940 | |
941 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | |
942 #if (_ATL_VER < 0x0800) | |
943 LONG Save(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName) | |
944 { | |
945 return m_Key.SetValue(sval, sName.m_lpstr); | |
946 } | |
947 | |
948 LONG Restore(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName) | |
949 { | |
950 DWORD size = MAX_PATH; | |
951 LONG res = m_Key.QueryValue(sval.GetBuffer(size), sName.m_lpstr,
&size); | |
952 sval.ReleaseBuffer(); | |
953 return res; | |
954 } | |
955 #else // !(_ATL_VER < 0x0800) | |
956 LONG Save(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName) | |
957 { | |
958 return m_Key.SetStringValue(sName.m_lpstr, sval); | |
959 } | |
960 | |
961 LONG Restore(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName) | |
962 { | |
963 DWORD size = MAX_PATH; | |
964 LONG res = m_Key.QueryStringValue(sName.m_lpstr, sval.GetBuffer(
size), &size); | |
965 sval.ReleaseBuffer(); | |
966 return res; | |
967 } | |
968 #endif // !(_ATL_VER < 0x0800) | |
969 #else | |
970 #pragma message("Warning: CAppInfoBase compiles without CString support. Do no
t use CString in Save or Restore.") | |
971 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) | |
972 | |
973 #if (_ATL_VER < 0x0800) | |
974 LONG Save(LPCTSTR sval, ATL::_U_STRINGorID sName) | |
975 { | |
976 return m_Key.SetValue(sval, sName.m_lpstr); | |
977 } | |
978 | |
979 LONG Restore(LPTSTR sval, ATL::_U_STRINGorID sName, DWORD *plength) | |
980 { | |
981 return m_Key.QueryValue(sval, sName.m_lpstr, plength); | |
982 } | |
983 #else // !(_ATL_VER < 0x0800) | |
984 LONG Save(LPCTSTR sval, ATL::_U_STRINGorID sName) | |
985 { | |
986 return m_Key.SetStringValue(sName.m_lpstr, sval); | |
987 } | |
988 | |
989 LONG Restore(LPTSTR sval, ATL::_U_STRINGorID sName, DWORD *plength) | |
990 { | |
991 return m_Key.QueryStringValue(sName.m_lpstr, sval, plength); | |
992 } | |
993 #endif // !(_ATL_VER < 0x0800) | |
994 | |
995 LONG Delete(ATL::_U_STRINGorID sName) | |
996 { | |
997 return m_Key.DeleteValue(sName.m_lpstr); | |
998 } | |
999 }; | |
1000 | |
1001 | |
1002 /////////////////////////////////////////////////////////////////////////////// | |
1003 // CAppInfoT - CAppInfoBase constructed from a class with T::GetAppKey() | |
1004 | |
1005 // Macro for declaring AppKey | |
1006 #define DECLARE_APPKEY(uAppKey) \ | |
1007 static LPCTSTR GetAppKey() \ | |
1008 { \ | |
1009 static LPCTSTR sAppKey = ATL::_U_STRINGorID(uAppKey).m_lpstr; \ | |
1010 return sAppKey; \ | |
1011 } | |
1012 | |
1013 template <class T> | |
1014 class CAppInfoT : public CAppInfoBase | |
1015 { | |
1016 public: | |
1017 CAppInfoT() : CAppInfoBase(T::GetAppKey()){} | |
1018 }; | |
1019 | |
1020 | |
1021 /////////////////////////////////////////////////////////////////////////////// | |
1022 // CAppWindowBase - Base class for PPC/SmartPhone "well-behaved" application win
dow or dialog | |
1023 | |
1024 // Macros for declaring frame WNDCLASS and AppKey | |
1025 #define DECLARE_APP_FRAME_CLASS(WndClassName, uCommonResourceID, uAppKey) \ | |
1026 DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \ | |
1027 DECLARE_APPKEY(uAppKey) | |
1028 | |
1029 #define DECLARE_APP_FRAME_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd
, uAppKey) \ | |
1030 DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd
) \ | |
1031 DECLARE_APPKEY(uAppKey) | |
1032 | |
1033 template <class T> | |
1034 class CAppWindowBase | |
1035 { | |
1036 public: | |
1037 typedef class CAppInfoT< T > CAppInfo; | |
1038 | |
1039 #ifndef WIN32_PLATFORM_WFSP | |
1040 SHACTIVATEINFO m_sai; // NoOp on SmartPhones | |
1041 #endif // WIN32_PLATFORM_WFSP | |
1042 | |
1043 bool m_bHibernate; | |
1044 | |
1045 CAppWindowBase< T >() : m_bHibernate(false) | |
1046 { | |
1047 #ifndef WIN32_PLATFORM_WFSP | |
1048 SHACTIVATEINFO sai = { sizeof(SHACTIVATEINFO) }; | |
1049 m_sai = sai; | |
1050 #endif // WIN32_PLATFORM_WFSP | |
1051 }; | |
1052 | |
1053 // Same as WTL 7.1 AppWizard generated ActivatePreviousInstance + SendMe
ssage WM_COPYDATA | |
1054 static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR lp
strCmdLine, bool bDialog) | |
1055 { | |
1056 // requires T does DECLARE_APP_FRAME_CLASS, DECLARE_APP_FRAME_CL
ASS_EX or DECLARE_APP_DLG_CLASS | |
1057 CFrameWndClassInfo& classInfo = T::GetWndClassInfo(); | |
1058 | |
1059 ATLVERIFY(::LoadString(hInstance, classInfo.m_uCommonResourceID,
classInfo.m_szAutoName, sizeof(classInfo.m_szAutoName)/sizeof(classInfo.m_szAut
oName[0])) != 0); | |
1060 | |
1061 classInfo.m_wc.lpszClassName = classInfo.m_szAutoName; | |
1062 | |
1063 const TCHAR* pszClass = classInfo.m_wc.lpszClassName; | |
1064 | |
1065 if(NULL == pszClass || '\0' == *pszClass) | |
1066 { | |
1067 return E_FAIL; | |
1068 } | |
1069 | |
1070 const DWORD dRetryInterval = 100; | |
1071 const int iMaxRetries = 25; | |
1072 | |
1073 for(int i = 0; i < iMaxRetries; ++i) | |
1074 { | |
1075 HANDLE hMutex = CreateMutex(NULL, FALSE, pszClass); | |
1076 | |
1077 DWORD dw = GetLastError(); | |
1078 | |
1079 if(NULL == hMutex) | |
1080 { | |
1081 HRESULT hr; | |
1082 | |
1083 switch(dw) | |
1084 { | |
1085 case ERROR_INVALID_HANDLE: | |
1086 // A non-mutext object with this name al
ready exists. | |
1087 hr = E_INVALIDARG; | |
1088 break; | |
1089 default: | |
1090 // This should never happen... | |
1091 hr = E_FAIL; | |
1092 } | |
1093 | |
1094 return hr; | |
1095 } | |
1096 | |
1097 // If the mutex already exists, then there should be ano
ther instance running | |
1098 if(dw == ERROR_ALREADY_EXISTS) | |
1099 { | |
1100 CloseHandle(hMutex); | |
1101 | |
1102 HWND hwnd = NULL; | |
1103 if (bDialog) | |
1104 hwnd = FindWindow(NULL, pszClass); | |
1105 else | |
1106 hwnd = FindWindow(pszClass, NULL); | |
1107 | |
1108 if(hwnd == NULL) | |
1109 { | |
1110 Sleep(dRetryInterval); | |
1111 continue; | |
1112 } | |
1113 else | |
1114 { | |
1115 // Transmit our params to previous insta
nce | |
1116 if (lpstrCmdLine && *lpstrCmdLine) | |
1117 { | |
1118 COPYDATASTRUCT cd = { NULL, size
of(TCHAR) * (wcslen(lpstrCmdLine) + 1), (PVOID)lpstrCmdLine }; | |
1119 ::SendMessage(hwnd, WM_COPYDATA,
NULL, (LPARAM)&cd); | |
1120 } | |
1121 // Set the previous instance as the fore
ground window | |
1122 if(0 != SetForegroundWindow(reinterpret_
cast<HWND>(reinterpret_cast<ULONG>(hwnd) | 0x1))) | |
1123 return S_FALSE; | |
1124 } | |
1125 } | |
1126 else | |
1127 { | |
1128 return S_OK; | |
1129 } | |
1130 } | |
1131 return S_OK; | |
1132 } | |
1133 | |
1134 // Operations overriden in derived class | |
1135 bool AppHibernate(bool /*bHibernate*/) | |
1136 { | |
1137 return false; | |
1138 } | |
1139 | |
1140 bool AppNewInstance(LPCTSTR /*lpstrCmdLine*/) | |
1141 { | |
1142 return false; | |
1143 } | |
1144 | |
1145 void AppSave() | |
1146 { | |
1147 } | |
1148 | |
1149 #ifdef WIN32_PLATFORM_WFSP | |
1150 void AppBackKey() | |
1151 { | |
1152 ::SHNavigateBack(); | |
1153 } | |
1154 #endif | |
1155 | |
1156 // Message map and handlers | |
1157 BEGIN_MSG_MAP(CAppWindowBase) | |
1158 MESSAGE_HANDLER(WM_ACTIVATE, OnActivate) | |
1159 #ifdef WIN32_PLATFORM_WFSP | |
1160 MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) | |
1161 #else | |
1162 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) | |
1163 #endif // WIN32_PLATFORM_WFSP | |
1164 MESSAGE_HANDLER(WM_HIBERNATE, OnHibernate) | |
1165 MESSAGE_HANDLER(WM_COPYDATA, OnNewInstance) | |
1166 MESSAGE_HANDLER(WM_CLOSE, OnClose) | |
1167 END_MSG_MAP() | |
1168 | |
1169 LRESULT OnActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bH
andled) | |
1170 { | |
1171 T* pT = static_cast<T*>(this); | |
1172 if (m_bHibernate) | |
1173 m_bHibernate = pT->AppHibernate(false); | |
1174 #ifndef WIN32_PLATFORM_WFSP | |
1175 ::SHHandleWMActivate(pT->m_hWnd, wParam, lParam, &m_sai, 0); | |
1176 #else | |
1177 wParam; | |
1178 lParam; | |
1179 #endif // WIN32_PLATFORM_WFSP | |
1180 return bHandled = FALSE; | |
1181 } | |
1182 | |
1183 #ifdef WIN32_PLATFORM_WFSP | |
1184 // SmartPhone VK_TBACK key standard management | |
1185 LRESULT OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandl
ed*/) | |
1186 { | |
1187 T* pT = static_cast<T*>(this); | |
1188 const UINT uModif = (UINT)LOWORD(lParam); | |
1189 const UINT uVirtKey = (UINT)HIWORD(lParam); | |
1190 if(uVirtKey == VK_TBACK) | |
1191 if (AtlIsEditFocus()) | |
1192 ::SHSendBackToFocusWindow(uMsg, wParam, lParam); | |
1193 else if (uModif & MOD_KEYUP) | |
1194 pT->AppBackKey(); | |
1195 return 1; | |
1196 } | |
1197 | |
1198 #else // !WIN32_PLATFORM_WFSP | |
1199 // PPC SIP handling | |
1200 LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOO
L& bHandled) | |
1201 { | |
1202 T* pT = static_cast<T*>(this); | |
1203 bHandled = FALSE; | |
1204 return ::SHHandleWMSettingChange(pT->m_hWnd, wParam, lParam, &m_
sai); | |
1205 } | |
1206 #endif // !WIN32_PLATFORM_WFSP | |
1207 | |
1208 LRESULT OnHibernate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/,
BOOL& /*bHandled*/) | |
1209 { | |
1210 T* pT = static_cast<T*>(this); | |
1211 return m_bHibernate = pT->AppHibernate(true); | |
1212 } | |
1213 | |
1214 LRESULT OnNewInstance(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, B
OOL& /*bHandled*/) | |
1215 { | |
1216 T* pT = static_cast<T*>(this); | |
1217 PCOPYDATASTRUCT pcds = (PCOPYDATASTRUCT)lParam; | |
1218 return pT->AppNewInstance((LPCTSTR)pcds->lpData); | |
1219 } | |
1220 | |
1221 LRESULT OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOO
L& bHandled) | |
1222 { | |
1223 T* pT = static_cast<T*>(this); | |
1224 pT->AppSave(); | |
1225 bHandled = FALSE; | |
1226 return 1; | |
1227 } | |
1228 }; | |
1229 | |
1230 | |
1231 /////////////////////////////////////////////////////////////////////////////// | |
1232 // CAppWindow - PPC/SmartPhone "well-behaved" application window class | |
1233 | |
1234 template <class T> | |
1235 class CAppWindow : public CAppWindowBase< T > | |
1236 { | |
1237 public: | |
1238 // Same as WTL 7.1 AppWizard generated Run + lpstrCmdLine in CreateEx | |
1239 static int AppRun(LPTSTR lpstrCmdLine = NULL, int nCmdShow = SW_SHOWNORM
AL) | |
1240 { | |
1241 CMessageLoop theLoop; | |
1242 _Module.AddMessageLoop(&theLoop); | |
1243 | |
1244 T wndMain; | |
1245 | |
1246 if(wndMain.CreateEx(NULL, NULL, 0, 0, lpstrCmdLine) == NULL) | |
1247 { | |
1248 ATLTRACE2(atlTraceUI, 0, _T("Main window creation failed
!\n")); | |
1249 return 0; | |
1250 } | |
1251 | |
1252 wndMain.ShowWindow(nCmdShow); | |
1253 | |
1254 int nRet = theLoop.Run(); | |
1255 | |
1256 _Module.RemoveMessageLoop(); | |
1257 return nRet; | |
1258 } | |
1259 | |
1260 static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR lp
strCmdLine) | |
1261 { | |
1262 return CAppWindowBase< T >::ActivatePreviousInstance(hInstance,
lpstrCmdLine, false); | |
1263 } | |
1264 }; | |
1265 | |
1266 | |
1267 #ifndef _WTL_CE_NO_DIALOGS | |
1268 | |
1269 /////////////////////////////////////////////////////////////////////////////// | |
1270 // CAppDialog - PPC/SmartPhone "well-behaved" dialog application class | |
1271 | |
1272 // Macro for declaring dialog WNDCLASS and AppKey | |
1273 #define DECLARE_APP_DLG_CLASS(WndClassName, uCommonResourceID, uAppKey) \ | |
1274 static WTL::CFrameWndClassInfo& GetWndClassInfo() \ | |
1275 { \ | |
1276 static WTL::CFrameWndClassInfo wc = \ | |
1277 { \ | |
1278 { 0, (WNDPROC)StartDialogProc, \ | |
1279 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL
, WndClassName }, \ | |
1280 NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceI
D \ | |
1281 }; \ | |
1282 return wc; \ | |
1283 }; \ | |
1284 DECLARE_APPKEY(uAppKey) | |
1285 | |
1286 template <class T> | |
1287 class CAppDialog : public CAppWindowBase< T > | |
1288 { | |
1289 public: | |
1290 static int AppRun(LPTSTR lpstrCmdLine = NULL, int nCmdShow = SW_SHOWNORM
AL) | |
1291 { | |
1292 CMessageLoop theLoop; | |
1293 _Module.AddMessageLoop(&theLoop); | |
1294 | |
1295 T dlgMain; | |
1296 | |
1297 if(dlgMain.Create(NULL, (LPARAM)lpstrCmdLine) == NULL) | |
1298 { | |
1299 ATLTRACE2(atlTraceUI, 0, _T("Main dialog creation failed
!\n")); | |
1300 return 0; | |
1301 } | |
1302 | |
1303 dlgMain.ShowWindow(nCmdShow); | |
1304 | |
1305 int nRet = theLoop.Run(); | |
1306 | |
1307 _Module.RemoveMessageLoop(); | |
1308 return nRet; | |
1309 } | |
1310 | |
1311 static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR lp
strCmdLine) | |
1312 { | |
1313 return CAppWindowBase< T >::ActivatePreviousInstance(hInstance,
lpstrCmdLine, true); | |
1314 }; | |
1315 }; | |
1316 | |
1317 // PPC/SmartPhone standard application dialogs | |
1318 | |
1319 #ifdef WIN32_PLATFORM_WFSP | |
1320 #define WTL_APP_SHIDIF WTL_SP_SHIDIF | |
1321 #else | |
1322 #define WTL_APP_SHIDIF WTL_STD_SHIDIF | |
1323 #endif | |
1324 | |
1325 /////////////////////////////////////////////////////////////////////////////// | |
1326 // CAppStdDialogImplBase - Base implementation of standard application dialogs | |
1327 | |
1328 template <class T, class TImplBase, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_b
Modal = false> | |
1329 class ATL_NO_VTABLE CAppStdDialogImplBase : | |
1330 public TImplBase, | |
1331 public CAppDialog< T > | |
1332 { | |
1333 public: | |
1334 WTL_DLG_NOTITLE; | |
1335 | |
1336 void StdCloseDialog(int nVal) | |
1337 { | |
1338 T* pT = static_cast<T*>(this); | |
1339 if (nVal != IDCANCEL) | |
1340 pT->AppSave(); | |
1341 if (t_bModal == false) | |
1342 { | |
1343 pT->DestroyWindow(); | |
1344 ::PostQuitMessage(nVal); | |
1345 } | |
1346 else | |
1347 ::EndDialog(pT->m_hWnd, nVal); | |
1348 } | |
1349 | |
1350 BEGIN_MSG_MAP(CAppStdDialogImplBase) | |
1351 MESSAGE_HANDLER(WM_CLOSE, OnSystemClose) | |
1352 CHAIN_MSG_MAP(TImplBase) | |
1353 CHAIN_MSG_MAP(CAppDialog< T >) | |
1354 END_MSG_MAP() | |
1355 | |
1356 LRESULT OnSystemClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*
/, BOOL& /*bHandled*/) | |
1357 { | |
1358 T* pT = static_cast<T*>(this); | |
1359 pT->StdCloseDialog(IDCANCEL); | |
1360 return 0; | |
1361 } | |
1362 }; | |
1363 | |
1364 /////////////////////////////////////////////////////////////////////////////// | |
1365 // CAppStdDialogImpl - Implementation of standard application dialog | |
1366 | |
1367 template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false> | |
1368 class ATL_NO_VTABLE CAppStdDialogImpl : | |
1369 public CAppStdDialogImplBase<T, CStdDialogImpl<T, t_shidiFlags,
t_bModal>, t_shidiFlags, t_bModal> | |
1370 {}; | |
1371 | |
1372 /////////////////////////////////////////////////////////////////////////////// | |
1373 // CAppStdDialogResizeImpl - implementation of orientation resizing standard app
lication dialog | |
1374 | |
1375 template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false> | |
1376 class ATL_NO_VTABLE CAppStdDialogResizeImpl : | |
1377 public CAppStdDialogImplBase<T, CStdDialogResizeImpl<T, t_shidiF
lags, t_bModal>, t_shidiFlags, t_bModal> | |
1378 {}; | |
1379 | |
1380 #ifndef _ATL_NO_HOSTING | |
1381 /////////////////////////////////////////////////////////////////////////////// | |
1382 // CAppStdAxDialogImpl - Implementation of standard application AxDialog | |
1383 | |
1384 template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false> | |
1385 class ATL_NO_VTABLE CAppStdAxDialogImpl : | |
1386 public CAppStdDialogImplBase<T, CStdAxDialogImpl<T, t_shidiFlags
, t_bModal>, t_shidiFlags, t_bModal> | |
1387 {}; | |
1388 | |
1389 /////////////////////////////////////////////////////////////////////////////// | |
1390 // CAppStdAxDialogResizeImpl - implementation of orientation resizing standard a
pplication AxDialog | |
1391 | |
1392 template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false> | |
1393 class ATL_NO_VTABLE CAppStdAxDialogResizeImpl : | |
1394 public CAppStdDialogImplBase<T, CStdAxDialogResizeImpl<T, t_shid
iFlags, t_bModal>, t_shidiFlags, t_bModal> | |
1395 {}; | |
1396 #endif // _ATL_NO_HOSTING | |
1397 | |
1398 #if defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC) | |
1399 /////////////////////////////////////////////////////////////////////////////// | |
1400 // CAppStdOrientedDialogImpl - implementation of oriented PPC standard applicati
on dialog | |
1401 | |
1402 template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false> | |
1403 class ATL_NO_VTABLE CAppStdOrientedDialogImpl : | |
1404 public CAppStdDialogImplBase<T, CStdOrientedDialogImpl<T, t_shid
iFlags, t_bModal>, t_shidiFlags, t_bModal> | |
1405 {}; | |
1406 | |
1407 #ifndef _ATL_NO_HOSTING | |
1408 /////////////////////////////////////////////////////////////////////////////// | |
1409 // CAppStdAxOrientedDialogImpl - implementation of oriented PPC standard applica
tion AxDialog | |
1410 | |
1411 template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false> | |
1412 class ATL_NO_VTABLE CAppStdAxOrientedDialogImpl : | |
1413 public CAppStdDialogImplBase<T, CStdAxOrientedDialogImpl<T, t_sh
idiFlags, t_bModal>, t_shidiFlags, t_bModal> | |
1414 {}; | |
1415 #endif // _ATL_NO_HOSTING | |
1416 | |
1417 #endif // defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC) | |
1418 | |
1419 #endif // _WTL_CE_NO_DIALOGS | |
1420 | |
1421 #endif // _WTL_CE_NO_APPWINDOW | |
1422 | |
1423 | |
1424 // --- Full screen support --- | |
1425 | |
1426 #ifndef _WTL_CE_NO_FULLSCREEN | |
1427 | |
1428 /////////////////////////////////////////////////////////////////////////////// | |
1429 // CFullScreenFrame - full screen frame implementation | |
1430 | |
1431 template <class T, bool t_bHasSip = true> | |
1432 class CFullScreenFrame | |
1433 { | |
1434 public: | |
1435 bool m_bFullScreen; | |
1436 | |
1437 CFullScreenFrame() : m_bFullScreen(false) | |
1438 { } | |
1439 | |
1440 // Operation | |
1441 void SetFullScreen(bool bFull) | |
1442 { | |
1443 m_bFullScreen = bFull; | |
1444 ShowTaskBar(!bFull, false); | |
1445 ShowMenuBar(!bFull); | |
1446 } | |
1447 | |
1448 // Manage TaskBar for modal dialogs and property sheets | |
1449 template <class D> | |
1450 int FSDoModal(D& dlg) | |
1451 { | |
1452 T* pT = static_cast<T*>(this); | |
1453 pT; // avoid level 4 warning | |
1454 ATLASSERT(pT->IsWindow()); | |
1455 if (m_bFullScreen) // Show taskbar if hidden | |
1456 ShowTaskBar(true, false); | |
1457 int iRet = dlg.DoModal(); | |
1458 if (m_bFullScreen) // Hide taskbar if restored | |
1459 ShowTaskBar(false); | |
1460 return iRet; | |
1461 } | |
1462 | |
1463 // Implementation | |
1464 void ShowMenuBar(bool bShow) | |
1465 { | |
1466 T* pT = static_cast<T*>(this); | |
1467 ATLASSERT(pT->IsWindow()); | |
1468 ATL::CWindow MenuBar = pT->m_hWndCECommandBar; | |
1469 ATLASSERT(MenuBar.IsWindow()); | |
1470 MenuBar.ShowWindow(bShow ? SW_SHOWNORMAL : SW_HIDE); | |
1471 pT->SizeToMenuBar(); | |
1472 } | |
1473 | |
1474 void ShowTaskBar(bool bShow, bool bRepaint = true) | |
1475 { | |
1476 T* pT = static_cast<T*>(this); | |
1477 ATLASSERT(pT->IsWindow()); | |
1478 RECT rect = { 0 }; | |
1479 SystemParametersInfo(SPI_GETWORKAREA, NULL, &rect, FALSE); | |
1480 if (!bShow) | |
1481 rect.top = 0; | |
1482 | |
1483 #ifdef WIN32_PLATFORM_PSPC // Pocket PC code | |
1484 UINT uShow = t_bHasSip ? SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON :
SHFS_SHOWTASKBAR | SHFS_HIDESIPBUTTON; | |
1485 SHFullScreen(pT->m_hWnd, bShow ? uShow : SHFS_HIDETASKBAR | SHFS
_HIDESIPBUTTON); | |
1486 #elif _WIN32_WCE > 0x500 // Smartphone 2005 code | |
1487 SHFullScreen(pT->m_hWnd, bShow ? SHFS_SHOWTASKBAR : SHFS_HIDETAS
KBAR); | |
1488 #else // Smartphone 2003 | |
1489 HWND hTaskBar = FindWindow(_T("tray"), NULL); | |
1490 ATLASSERT(::IsWindow(hTaskBar)); | |
1491 ::ShowWindow(hTaskBar, bShow ? SW_SHOW : SW_HIDE); | |
1492 #endif // WIN32_PLATFORM_PSPC | |
1493 | |
1494 pT->MoveWindow(&rect, bRepaint); | |
1495 } | |
1496 | |
1497 // Message map and handler | |
1498 BEGIN_MSG_MAP(CFullScreenFrame) | |
1499 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) | |
1500 MESSAGE_HANDLER(WM_ACTIVATE, OnActivate) | |
1501 END_MSG_MAP() | |
1502 | |
1503 LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/,
BOOL& bHandled) | |
1504 { | |
1505 #ifndef SETTINGCHANGE_RESET // not defined for PPC 2002 | |
1506 #define SETTINGCHANGE_RESET SPI_SETWORKAREA | |
1507 #endif | |
1508 if (m_bFullScreen && (wParam & SETTINGCHANGE_RESET)) | |
1509 SetFullScreen(m_bFullScreen); | |
1510 return bHandled = FALSE; | |
1511 } | |
1512 | |
1513 LRESULT OnActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL
& bHandled) | |
1514 { | |
1515 if (m_bFullScreen) | |
1516 { | |
1517 ShowTaskBar(!wParam); | |
1518 ShowMenuBar(!wParam); | |
1519 } | |
1520 return bHandled = FALSE; | |
1521 } | |
1522 }; | |
1523 | |
1524 #endif // _WTL_CE_NO_FULLSCREEN | |
1525 | |
1526 | |
1527 // --- WinCE zoom support --- | |
1528 | |
1529 #ifndef _WTL_CE_NO_ZOOMSCROLL | |
1530 | |
1531 /////////////////////////////////////////////////////////////////////////////// | |
1532 // CZoomScrollImpl - WinCE zooming implementation on top of CScrollImpl | |
1533 | |
1534 template <class T> | |
1535 class CZoomScrollImpl: public CScrollImpl< T > | |
1536 { | |
1537 public: | |
1538 // Data members | |
1539 _WTYPES_NS::CSize m_sizeTrue; | |
1540 double m_fzoom; | |
1541 | |
1542 // Creation | |
1543 CZoomScrollImpl() : m_sizeTrue(0), m_fzoom(1.) | |
1544 { } | |
1545 | |
1546 // Zoom operations and access | |
1547 void SetZoomScrollSize(_WTYPES_NS::CSize sizeTrue, double fzoom = 1., BO
OL bRedraw = TRUE) | |
1548 { | |
1549 ATLASSERT(fzoom > 0.); | |
1550 m_sizeTrue = sizeTrue; | |
1551 m_fzoom = fzoom; | |
1552 | |
1553 CScrollImpl< T >::SetScrollSize(sizeTrue / fzoom, bRedraw); | |
1554 } | |
1555 | |
1556 void SetZoomScrollSize(int cx, int cy, double fzoom=1., BOOL bRedraw = T
RUE) | |
1557 { | |
1558 SetZoomScrollSize(_WTYPES_NS::CSize(cx, cy), fzoom, bRedraw); | |
1559 } | |
1560 | |
1561 void SetZoom(double fzoom, BOOL bRedraw = TRUE) | |
1562 { | |
1563 _WTYPES_NS::CPoint ptCenter = WndtoTrue(m_sizeClient / 2); | |
1564 _WTYPES_NS::CSize sizePage = GetScrollPage(); | |
1565 _WTYPES_NS::CSize sizeLine = GetScrollLine(); | |
1566 | |
1567 SetZoomScrollSize(GetScrollSize(), fzoom, bRedraw); | |
1568 | |
1569 SetScrollLine(sizeLine); | |
1570 SetScrollPage(sizePage); | |
1571 _WTYPES_NS::CPoint ptOffset = ptCenter - (m_sizeClient / 2) * fz
oom; | |
1572 SetScrollOffset(ptOffset, bRedraw); | |
1573 } | |
1574 | |
1575 double GetZoom() | |
1576 { | |
1577 return m_fzoom; | |
1578 } | |
1579 | |
1580 // CScrollImpl overrides | |
1581 void SetScrollOffset(int x, int y, BOOL bRedraw = TRUE) | |
1582 { | |
1583 CScrollImpl< T >::SetScrollOffset((int)(x / m_fzoom), (int)(y /
m_fzoom), bRedraw); | |
1584 } | |
1585 | |
1586 void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE) | |
1587 { | |
1588 SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw); | |
1589 } | |
1590 | |
1591 void GetScrollOffset(POINT& ptOffset) | |
1592 { | |
1593 ptOffset.x = (LONG)(m_ptOffset.x * m_fzoom); | |
1594 ptOffset.y = (LONG)(m_ptOffset.y * m_fzoom); | |
1595 } | |
1596 | |
1597 void SetScrollSize(int cx, int cy, BOOL bRedraw = TRUE) | |
1598 { | |
1599 SetZoomScrollSize(cx, cy, GetZoom(), bRedraw); | |
1600 } | |
1601 | |
1602 void SetScrollSize(SIZE sizeTrue, BOOL bRedraw = TRUE) | |
1603 { | |
1604 SetZoomScrollSize(sizeTrue, GetZoom(), bRedraw); | |
1605 } | |
1606 | |
1607 void GetScrollSize(SIZE& sizeTrue) const | |
1608 { | |
1609 sizeTrue = m_sizeTrue; | |
1610 } | |
1611 | |
1612 void SetScrollPage(int cxPage, int cyPage) | |
1613 { | |
1614 SetScrollPage(_WTYPES_NS::CSize(cxPage, cyPage)); | |
1615 } | |
1616 | |
1617 void SetScrollPage(SIZE sizePage) | |
1618 { | |
1619 CScrollImpl< T >::SetScrollPage(sizePage / m_fzoom); | |
1620 } | |
1621 | |
1622 void GetScrollPage(SIZE& sizePage) const | |
1623 { | |
1624 sizePage = m_sizePage * m_fzoom; | |
1625 } | |
1626 | |
1627 void SetScrollLine(int cxLine, int cyLine) | |
1628 { | |
1629 SetScrollLine(_WTYPES_NS::CSize(cxLine, cyLine)); | |
1630 } | |
1631 | |
1632 void SetScrollLine(SIZE sizeLine) | |
1633 { | |
1634 CScrollImpl< T >::SetScrollLine(sizeLine / m_fzoom); | |
1635 } | |
1636 | |
1637 void GetScrollLine(SIZE& sizeLine) const | |
1638 { | |
1639 sizeLine = m_sizeLine * m_fzoom; | |
1640 } | |
1641 | |
1642 // Data access complements | |
1643 _WTYPES_NS::CSize GetScrollSize() | |
1644 { | |
1645 return m_sizeTrue; | |
1646 } | |
1647 | |
1648 _WTYPES_NS::CSize GetScrollPage() | |
1649 { | |
1650 return m_sizePage * m_fzoom; | |
1651 } | |
1652 | |
1653 _WTYPES_NS::CSize GetScrollLine() | |
1654 { | |
1655 return m_sizeLine * m_fzoom; | |
1656 } | |
1657 | |
1658 _WTYPES_NS::CPoint GetScrollOffset() | |
1659 { | |
1660 return (_WTYPES_NS::CSize)m_ptOffset * m_fzoom; | |
1661 } | |
1662 | |
1663 // Helper coordinate functions | |
1664 _WTYPES_NS::CPoint WndtoTrue(CPoint ptW) | |
1665 { | |
1666 return (_WTYPES_NS::CSize)ptW * GetZoom() + GetScrollOffset(); | |
1667 } | |
1668 | |
1669 void WndtoTrue(LPPOINT aptW, int nPts) // in place coord transformatio
n | |
1670 { | |
1671 for (int i = 0 ; i < nPts ; i++) | |
1672 aptW[i] = WndtoTrue(aptW[i]); | |
1673 } | |
1674 | |
1675 void WndtoTrue(LPRECT prectW) // in place coord transformation | |
1676 { | |
1677 WndtoTrue((LPPOINT)prectW, 2); | |
1678 } | |
1679 | |
1680 _WTYPES_NS::CPoint TruetoWnd(CPoint ptT) | |
1681 { | |
1682 return (ptT - GetScrollOffset()) / GetZoom(); | |
1683 } | |
1684 | |
1685 void TruetoWnd(LPPOINT aptT, int nPts) // in place coord transformatio
n | |
1686 { | |
1687 for (int i = 0 ; i < nPts ; i++) | |
1688 aptT[i] = TruetoWnd(aptT[i]); | |
1689 } | |
1690 | |
1691 void TruetoWnd(LPRECT prectT) // in place coord transformation | |
1692 { | |
1693 TruetoWnd((LPPOINT)prectT, 2); | |
1694 } | |
1695 | |
1696 // Drawing operations : assume adequate setting of data members | |
1697 BOOL Draw(HBITMAP hbm, HDC hdestDC, DWORD dwROP = SRCCOPY) | |
1698 { | |
1699 CDC memDC = CreateCompatibleDC(hdestDC); | |
1700 CBitmapHandle bmpOld = memDC.SelectBitmap(hbm); | |
1701 BOOL bRes = Draw(memDC, hdestDC, dwROP); | |
1702 memDC.SelectBitmap(bmpOld); | |
1703 return bRes; | |
1704 } | |
1705 | |
1706 BOOL Draw(HDC hsourceDC, HDC hdestDC, DWORD dwROP = SRCCOPY) | |
1707 { | |
1708 CDCHandle destDC = hdestDC; | |
1709 destDC.SetViewportOrg(0,0); | |
1710 _WTYPES_NS::CPoint ptOffset = GetScrollOffset(); | |
1711 _WTYPES_NS::CSize sizeZClient = m_sizeClient * GetZoom(); | |
1712 return destDC.StretchBlt(0, 0, m_sizeClient.cx, m_sizeClient.cy,
hsourceDC, ptOffset.x, ptOffset.y, sizeZClient.cx, sizeZClient.cy, dwROP); | |
1713 } | |
1714 | |
1715 #ifdef _IMAGING_H | |
1716 BOOL Draw(IImage* pIImage, HDC hdestDC) | |
1717 { | |
1718 CDCHandle destDC = hdestDC; | |
1719 destDC.SetViewportOrg(0,0); | |
1720 return SUCCEEDED(pIImage->Draw(destDC, _WTYPES_NS::CRect(-_WTYPE
S_NS::CPoint(m_ptOffset), m_sizeAll), NULL)); | |
1721 } | |
1722 #endif | |
1723 | |
1724 // Message map and handlers | |
1725 BEGIN_MSG_MAP(CZoomScrollImpl< T >) | |
1726 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) | |
1727 CHAIN_MSG_MAP(CScrollImpl< T >) | |
1728 END_MSG_MAP() | |
1729 | |
1730 LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BO
OL& bHandled) | |
1731 { | |
1732 T* pT = static_cast<T*>(this); | |
1733 ATLASSERT(::IsWindow(pT->m_hWnd)); | |
1734 if ((GetScrollExtendedStyle() & SCRL_ERASEBACKGROUND)) | |
1735 { | |
1736 _WTYPES_NS::CRect rect; | |
1737 pT->GetClientRect(rect); | |
1738 _WTYPES_NS::CSize sizeClient=rect.Size(); | |
1739 | |
1740 if (m_sizeAll.cx < sizeClient.cx || m_sizeAll.cy < sizeC
lient.cy) | |
1741 { | |
1742 CDCHandle hdc = (HDC)wParam; | |
1743 HBRUSH hbr = GetSysColorBrush((int)T::GetWndClas
sInfo().m_wc.hbrBackground - 1); | |
1744 | |
1745 if (m_sizeAll.cx < sizeClient.cx) | |
1746 { | |
1747 _WTYPES_NS::CRect rectBG(_WTYPES_NS::CPo
int(m_sizeAll.cx, 0), sizeClient); | |
1748 hdc.FillRect(rectBG, hbr); | |
1749 } | |
1750 | |
1751 if (m_sizeAll.cy < sizeClient.cy) | |
1752 { | |
1753 _WTYPES_NS::CRect rectBG(_WTYPES_NS::CPo
int(0, m_sizeAll.cy), sizeClient); | |
1754 hdc.FillRect(rectBG, hbr); | |
1755 } | |
1756 } | |
1757 } | |
1758 else | |
1759 { | |
1760 bHandled = FALSE; | |
1761 } | |
1762 | |
1763 return 1; | |
1764 } | |
1765 }; | |
1766 | |
1767 #endif // _WTL_CE_NO_ZOOMSCROLL | |
1768 | |
1769 #ifndef _WTL_CE_NO_CONTROLS | |
1770 | |
1771 // --- PPC bottom TabView control --- | |
1772 | |
1773 #if defined(__ATLCTRLX_H__) && defined(WIN32_PLATFORM_PSPC) | |
1774 | |
1775 /////////////////////////////////////////////////////////////////////////////// | |
1776 // CBottomTabViewImpl | |
1777 | |
1778 template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlW
inTraits> | |
1779 class ATL_NO_VTABLE CBottomTabViewImpl : public CTabViewImpl<T, TBase, TWinTrait
s> | |
1780 { | |
1781 public: | |
1782 DECLARE_WND_CLASS_EX(NULL, 0, COLOR_APPWORKSPACE) | |
1783 | |
1784 // Implementation overrideables | |
1785 bool CreateTabControl() | |
1786 { | |
1787 m_tab.Create(m_hWnd, rcDefault, NULL, WS_CHILD | TCS_BOTTOM, 0,
m_nTabID); | |
1788 | |
1789 ATLASSERT(m_tab.m_hWnd != NULL); | |
1790 if(m_tab.m_hWnd == NULL) | |
1791 return false; | |
1792 | |
1793 m_tab.SendMessage(CCM_SETVERSION, COMCTL32_VERSION); | |
1794 m_tab.SetItemExtra(sizeof(TABVIEWPAGE)); | |
1795 | |
1796 T* pT = static_cast<T*>(this); | |
1797 m_cyTabHeight = pT->CalcTabHeight(); | |
1798 | |
1799 return true; | |
1800 } | |
1801 | |
1802 int CalcTabHeight() | |
1803 { | |
1804 int nCount = m_tab.GetItemCount(); | |
1805 TCITEMEXTRA tcix = { 0 }; | |
1806 tcix.tciheader.mask = TCIF_TEXT; | |
1807 tcix.tciheader.pszText = _T("NS"); | |
1808 int nIndex = m_tab.InsertItem(nCount, tcix); | |
1809 | |
1810 RECT rect = { 0 }; | |
1811 SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0); | |
1812 RECT rcWnd = rect; | |
1813 | |
1814 m_tab.AdjustRect(FALSE, &rect); | |
1815 rcWnd.top = rect.bottom; | |
1816 ::AdjustWindowRectEx(&rcWnd, m_tab.GetStyle(), FALSE, m_tab.GetE
xStyle()); | |
1817 m_tab.DeleteItem(nIndex); | |
1818 | |
1819 return rcWnd.bottom - rcWnd.top; | |
1820 } | |
1821 | |
1822 void UpdateLayout() | |
1823 { | |
1824 RECT rect; | |
1825 GetClientRect(&rect); | |
1826 | |
1827 if(m_tab.IsWindow() && ((m_tab.GetStyle() & WS_VISIBLE) != 0)) | |
1828 m_tab.SetWindowPos(NULL, 0, rect.bottom - m_cyTabHeight,
rect.right - rect.left, m_cyTabHeight, SWP_NOZORDER /*| SWP_SHOWWINDOW*/); | |
1829 | |
1830 if(m_nActivePage != -1) | |
1831 ::SetWindowPos(GetPageHWND(m_nActivePage), NULL,
0, 0, rect.right - rect.left, rect.bottom - m_cyTabHeight, SWP_NOZORDER); | |
1832 } | |
1833 | |
1834 }; | |
1835 | |
1836 class CBottomTabView : public CBottomTabViewImpl<CBottomTabView> | |
1837 { | |
1838 public: | |
1839 DECLARE_WND_CLASS_EX(_T("WTL_BottomTabView"), 0, COLOR_APPWORKSPACE) | |
1840 }; | |
1841 | |
1842 #endif // defined(__ATLCTRLX_H__) && defined(WIN32_PLATFORM_PSPC) | |
1843 | |
1844 | |
1845 // --- PPC/SmartPhone controls --- | |
1846 | |
1847 //////////////////////////////////////////////////////////////////////////////// | |
1848 // These are wrapper classes for the Pocket PC 2002/2003 and SmartPhone 2003 con
trols | |
1849 // To implement a window based on a control, use following: | |
1850 // Example: Implementing a window based on a Html control | |
1851 // | |
1852 // class CMyHtml : CWindowImpl<CMyHtml, CHtmlCtrl> | |
1853 // { | |
1854 // public: | |
1855 // BEGIN_MSG_MAP(CMyHtml) | |
1856 // // put your message handler entries here | |
1857 // END_MSG_MAP() | |
1858 // }; | |
1859 /////////////////////////////////////////////////////////////////////////////// | |
1860 | |
1861 /////////////////////////////////////////////////////////////////////////////// | |
1862 // CHtmlCtrl | |
1863 | |
1864 template <class TBase> | |
1865 class CHtmlCtrlT : public TBase | |
1866 { | |
1867 public: | |
1868 // Constructors | |
1869 CHtmlCtrlT(HWND hWnd = NULL) : TBase(hWnd) | |
1870 { } | |
1871 | |
1872 CHtmlCtrlT< TBase >& operator =(HWND hWnd) | |
1873 { | |
1874 m_hWnd = hWnd; | |
1875 return *this; | |
1876 } | |
1877 | |
1878 HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowN
ame = NULL, | |
1879 DWORD dwStyle = 0, DWORD dwExStyle = 0, | |
1880 ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = N
ULL) | |
1881 { | |
1882 HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_
lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | |
1883 ATLASSERT(hWnd != NULL); // Did you remember to call InitHTMLC
ontrol(hInstance) ?? | |
1884 return hWnd; | |
1885 } | |
1886 | |
1887 // Attributes | |
1888 static LPCTSTR GetWndClassName() | |
1889 { | |
1890 return WC_HTML; | |
1891 } | |
1892 | |
1893 #if (_WIN32_WCE >= 400) | |
1894 void AddStyle(LPCWSTR pszStyle) | |
1895 { | |
1896 ATLASSERT(::IsWindow(m_hWnd)); | |
1897 ::SendMessage(m_hWnd, DTM_ADDSTYLE, 0, (LPARAM)pszStyle); | |
1898 } | |
1899 #endif // (_WIN32_WCE >= 400) | |
1900 | |
1901 void AddText(BOOL bPlainText, LPCSTR pszText) | |
1902 { | |
1903 ATLASSERT(::IsWindow(m_hWnd)); | |
1904 ::SendMessage(m_hWnd, DTM_ADDTEXT, (WPARAM)bPlainText, (LPARAM)p
szText); | |
1905 } | |
1906 | |
1907 void AddHTML(LPCSTR pszHTML) | |
1908 { | |
1909 ATLASSERT(::IsWindow(m_hWnd)); | |
1910 ::SendMessage(m_hWnd, DTM_ADDTEXT, (WPARAM)FALSE, (LPARAM)pszHTM
L); | |
1911 } | |
1912 | |
1913 void AddText(BOOL bPlainText, LPCWSTR pszText) | |
1914 { | |
1915 ATLASSERT(::IsWindow(m_hWnd)); | |
1916 ::SendMessage(m_hWnd, DTM_ADDTEXTW, (WPARAM)bPlainText, (LPARAM)
pszText); | |
1917 } | |
1918 | |
1919 void AddHTML(LPCWSTR pszHTML) | |
1920 { | |
1921 ATLASSERT(::IsWindow(m_hWnd)); | |
1922 ::SendMessage(m_hWnd, DTM_ADDTEXTW, (WPARAM)FALSE, (LPARAM)pszHT
ML); | |
1923 } | |
1924 | |
1925 void Anchor(LPCSTR pszAnchor) | |
1926 { | |
1927 ATLASSERT(::IsWindow(m_hWnd)); | |
1928 ::SendMessage(m_hWnd, DTM_ANCHOR, 0, (LPARAM)pszAnchor); | |
1929 } | |
1930 | |
1931 void Anchor(LPCWSTR pszAnchor) | |
1932 { | |
1933 ATLASSERT(::IsWindow(m_hWnd)); | |
1934 ::SendMessage(m_hWnd, DTM_ANCHORW, 0, (LPARAM)pszAnchor); | |
1935 } | |
1936 | |
1937 #if (_WIN32_WCE >= 420) | |
1938 void GetBrowserDispatch(IDispatch** ppDispatch) | |
1939 { | |
1940 ATLASSERT(::IsWindow(m_hWnd)); | |
1941 ATLASSERT(ppDispatch); | |
1942 ATLASSERT(*ppDispatch==NULL); | |
1943 ::SendMessage(m_hWnd, DTM_BROWSERDISPATCH, 0, (LPARAM)ppDispatch
); | |
1944 } | |
1945 void GetDocumentDispatch(IDispatch** ppDispatch) | |
1946 { | |
1947 ATLASSERT(::IsWindow(m_hWnd)); | |
1948 ATLASSERT(ppDispatch); | |
1949 ATLASSERT(*ppDispatch==NULL); | |
1950 ::SendMessage(m_hWnd, DTM_DOCUMENTDISPATCH , 0, (LPARAM)ppDispat
ch); | |
1951 } | |
1952 #endif // (_WIN32_WCE >= 420) | |
1953 | |
1954 void Clear() | |
1955 { | |
1956 ATLASSERT(::IsWindow(m_hWnd)); | |
1957 ::SendMessage(m_hWnd, DTM_CLEAR, 0, 0L); | |
1958 } | |
1959 | |
1960 void EnableClearType(BOOL bEnable = TRUE) | |
1961 { | |
1962 ATLASSERT(::IsWindow(m_hWnd)); | |
1963 ::SendMessage(m_hWnd, DTM_ENABLECLEARTYPE, 0, (LPARAM)bEnable); | |
1964 } | |
1965 | |
1966 void EnableContextMenu(BOOL bEnable = TRUE) | |
1967 { | |
1968 ATLASSERT(::IsWindow(m_hWnd)); | |
1969 ::SendMessage(m_hWnd, DTM_ENABLECONTEXTMENU, 0, (LPARAM)bEnable)
; | |
1970 } | |
1971 | |
1972 void EnableScripting(BOOL bEnable = TRUE) | |
1973 { | |
1974 ATLASSERT(::IsWindow(m_hWnd)); | |
1975 ::SendMessage(m_hWnd, DTM_ENABLESCRIPTING, 0, (LPARAM)bEnable); | |
1976 } | |
1977 | |
1978 void EnableShrink(BOOL bEnable = TRUE) | |
1979 { | |
1980 ATLASSERT(::IsWindow(m_hWnd)); | |
1981 ::SendMessage(m_hWnd, DTM_ENABLESHRINK, 0, (LPARAM)bEnable); | |
1982 } | |
1983 | |
1984 void EndOfSource() | |
1985 { | |
1986 ATLASSERT(::IsWindow(m_hWnd)); | |
1987 ::SendMessage(m_hWnd, DTM_ENDOFSOURCE, 0, 0L); | |
1988 } | |
1989 | |
1990 void ImageFail(DWORD dwCookie) | |
1991 { | |
1992 ATLASSERT(::IsWindow(m_hWnd)); | |
1993 ::SendMessage(m_hWnd, DTM_IMAGEFAIL, 0, (LPARAM)dwCookie); | |
1994 } | |
1995 | |
1996 int GetLayoutHeight() const | |
1997 { | |
1998 ATLASSERT(::IsWindow(m_hWnd)); | |
1999 return (int)::SendMessage(m_hWnd, DTM_LAYOUTHEIGHT, 0, 0L); | |
2000 } | |
2001 | |
2002 int GetLayoutWidth() const | |
2003 { | |
2004 ATLASSERT(::IsWindow(m_hWnd)); | |
2005 return (int)::SendMessage(m_hWnd, DTM_LAYOUTWIDTH, 0, 0L); | |
2006 } | |
2007 | |
2008 void Navigate(LPCTSTR pstrURL, UINT uFlags = 0) | |
2009 { | |
2010 ATLASSERT(::IsWindow(m_hWnd)); | |
2011 ATLASSERT(pstrURL); | |
2012 ::SendMessage(m_hWnd, DTM_NAVIGATE, (WPARAM)uFlags, (LPARAM)pstr
URL); | |
2013 } | |
2014 | |
2015 void SelectAll() | |
2016 { | |
2017 ATLASSERT(::IsWindow(m_hWnd)); | |
2018 ::SendMessage(m_hWnd, DTM_SELECTALL, 0, 0L); | |
2019 } | |
2020 | |
2021 void SetImage(INLINEIMAGEINFO* pImageInfo) | |
2022 { | |
2023 ATLASSERT(::IsWindow(m_hWnd)); | |
2024 ATLASSERT(pImageInfo); | |
2025 ::SendMessage(m_hWnd, DTM_SETIMAGE, 0, (LPARAM)pImageInfo); | |
2026 } | |
2027 | |
2028 void ZoomLevel(int iLevel) | |
2029 { | |
2030 ATLASSERT(::IsWindow(m_hWnd)); | |
2031 ::SendMessage(m_hWnd, DTM_ZOOMLEVEL, 0, (LPARAM)iLevel); | |
2032 } | |
2033 | |
2034 #if (_WIN32_WCE >= 400) | |
2035 void Stop() | |
2036 { | |
2037 ATLASSERT(::IsWindow(m_hWnd)); | |
2038 ::SendMessage(m_hWnd, DTM_STOP, 0, 0L); | |
2039 } | |
2040 #endif // (_WIN32_WCE >= 400) | |
2041 | |
2042 void GetScriptDispatch(IDispatch** ppDispatch) | |
2043 { | |
2044 ATLASSERT(::IsWindow(m_hWnd)); | |
2045 ATLASSERT(ppDispatch); | |
2046 ATLASSERT(*ppDispatch==NULL); | |
2047 ::SendMessage(m_hWnd, DTM_SCRIPTDISPATCH, 0, (LPARAM)ppDispatch)
; | |
2048 } | |
2049 }; | |
2050 | |
2051 typedef CHtmlCtrlT<ATL::CWindow> CHtmlCtrl; | |
2052 | |
2053 | |
2054 #ifdef WIN32_PLATFORM_PSPC | |
2055 | |
2056 /////////////////////////////////////////////////////////////////////////////// | |
2057 // CRichInkCtrl | |
2058 | |
2059 template <class TBase> | |
2060 class CRichInkCtrlT : public TBase | |
2061 { | |
2062 public: | |
2063 // Constructors | |
2064 CRichInkCtrlT(HWND hWnd = NULL) : TBase(hWnd) | |
2065 { } | |
2066 | |
2067 CRichInkCtrlT< TBase >& operator =(HWND hWnd) | |
2068 { | |
2069 m_hWnd = hWnd; | |
2070 return *this; | |
2071 } | |
2072 | |
2073 HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowN
ame = NULL, | |
2074 DWORD dwStyle = 0, DWORD dwExStyle = 0, | |
2075 ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = N
ULL) | |
2076 { | |
2077 HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_
lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | |
2078 ATLASSERT(hWnd != NULL); // Did you remember to call InitRichI
nkDLL() ?? | |
2079 return hWnd; | |
2080 } | |
2081 | |
2082 // Attributes | |
2083 static LPCTSTR GetWndClassName() | |
2084 { | |
2085 return WC_RICHINK; | |
2086 } | |
2087 | |
2088 BOOL CanPaste(UINT uFormat = 0) const | |
2089 { | |
2090 ATLASSERT(::IsWindow(m_hWnd)); | |
2091 return (BOOL)::SendMessage(m_hWnd, EM_CANPASTE, (WPARAM)uFormat,
0L); | |
2092 } | |
2093 | |
2094 BOOL CanRedo() const | |
2095 { | |
2096 ATLASSERT(::IsWindow(m_hWnd)); | |
2097 return (BOOL)::SendMessage(m_hWnd, EM_CANREDO, 0, 0L); | |
2098 } | |
2099 | |
2100 BOOL CanUndo() const | |
2101 { | |
2102 ATLASSERT(::IsWindow(m_hWnd)); | |
2103 return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L); | |
2104 } | |
2105 | |
2106 void ClearAll(BOOL bRepaint = TRUE) const | |
2107 { | |
2108 ATLASSERT(::IsWindow(m_hWnd)); | |
2109 ::SendMessage(m_hWnd, EM_CLEARALL, (WPARAM)bRepaint, 0L); | |
2110 } | |
2111 | |
2112 BOOL GetModify() const | |
2113 { | |
2114 ATLASSERT(::IsWindow(m_hWnd)); | |
2115 return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L); | |
2116 } | |
2117 | |
2118 UINT GetPageStyle() const | |
2119 { | |
2120 ATLASSERT(::IsWindow(m_hWnd)); | |
2121 return (UINT)::SendMessage(m_hWnd, EM_GETPAGESTYLE, 0, 0L); | |
2122 } | |
2123 | |
2124 UINT GetPenMode() const | |
2125 { | |
2126 ATLASSERT(::IsWindow(m_hWnd)); | |
2127 return (UINT)::SendMessage(m_hWnd, EM_GETPENMODE, 0, 0L); | |
2128 } | |
2129 | |
2130 UINT GetViewStyle() const | |
2131 { | |
2132 ATLASSERT(::IsWindow(m_hWnd)); | |
2133 return (UINT)::SendMessage(m_hWnd, EM_GETVIEW, 0, 0L); | |
2134 } | |
2135 | |
2136 UINT GetWrapMode() const | |
2137 { | |
2138 ATLASSERT(::IsWindow(m_hWnd)); | |
2139 return (UINT)::SendMessage(m_hWnd, EM_GETWRAPMODE, 0, 0L); | |
2140 } | |
2141 | |
2142 UINT GetZoomPercent() const | |
2143 { | |
2144 ATLASSERT(::IsWindow(m_hWnd)); | |
2145 return (UINT)::SendMessage(m_hWnd, EM_GETZOOMPERCENT, 0, 0L); | |
2146 } | |
2147 | |
2148 void InsertLinks(LPWSTR lpString, int cchLength = -1) | |
2149 { | |
2150 ATLASSERT(::IsWindow(m_hWnd)); | |
2151 if(cchLength == -1) | |
2152 cchLength = lstrlen(lpString); | |
2153 ::SendMessage(m_hWnd, EM_INSERTLINKS, (WPARAM)cchLength, (LPARAM
)lpString); | |
2154 } | |
2155 | |
2156 void RedoEvent() | |
2157 { | |
2158 ATLASSERT(::IsWindow(m_hWnd)); | |
2159 ::SendMessage(m_hWnd, EM_REDOEVENT, 0, 0L); | |
2160 } | |
2161 | |
2162 UINT SetInkLayer(UINT uLayer) | |
2163 { | |
2164 ATLASSERT(::IsWindow(m_hWnd)); | |
2165 return (UINT)::SendMessage(m_hWnd, EM_SETINKLAYER, (WPARAM)uLaye
r, 0L); | |
2166 } | |
2167 | |
2168 void SetPageStyle(UINT uStyle) | |
2169 { | |
2170 ATLASSERT(::IsWindow(m_hWnd)); | |
2171 ::SendMessage(m_hWnd, EM_SETPAGESTYLE, (WPARAM)uStyle, 0L); | |
2172 } | |
2173 | |
2174 void SetPenMode(UINT uMode) | |
2175 { | |
2176 ATLASSERT(::IsWindow(m_hWnd)); | |
2177 ::SendMessage(m_hWnd, EM_SETPENMODE, (WPARAM)uMode, 0L); | |
2178 } | |
2179 | |
2180 void SetViewStyle(UINT uStyle) | |
2181 { | |
2182 ATLASSERT(::IsWindow(m_hWnd)); | |
2183 ::SendMessage(m_hWnd, EM_SETVIEW, (WPARAM)uStyle, 0L); | |
2184 } | |
2185 | |
2186 void SetViewAttributes(VIEWATTRIBUTES* pAttribs) | |
2187 { | |
2188 ATLASSERT(::IsWindow(m_hWnd)); | |
2189 ATLASSERT(pAttribs); | |
2190 ::SendMessage(m_hWnd, EM_SETVIEWATTRIBUTES, 0, (LPARAM)pAttribs)
; | |
2191 } | |
2192 | |
2193 void SetWrapMode(UINT uMode) | |
2194 { | |
2195 ATLASSERT(::IsWindow(m_hWnd)); | |
2196 ::SendMessage(m_hWnd, EM_SETWRAPMODE, (WPARAM)uMode, 0L); | |
2197 } | |
2198 | |
2199 void SetZoomPercent(UINT uPercent) | |
2200 { | |
2201 ATLASSERT(::IsWindow(m_hWnd)); | |
2202 ::SendMessage(m_hWnd, EM_SETZOOMPERCENT, (WPARAM)uPercent, 0L); | |
2203 } | |
2204 | |
2205 LONG StreamIn(UINT uFormat, EDITSTREAM& es) | |
2206 { | |
2207 ATLASSERT(::IsWindow(m_hWnd)); | |
2208 return (LONG)::SendMessage(m_hWnd, EM_STREAMIN, (WPARAM)uFormat,
(LPARAM)&es); | |
2209 } | |
2210 | |
2211 LONG StreamOut(UINT uFormat, EDITSTREAM& es) | |
2212 { | |
2213 ATLASSERT(::IsWindow(m_hWnd)); | |
2214 return (LONG)::SendMessage(m_hWnd, EM_STREAMOUT, (WPARAM)uFormat
, (LPARAM)&es); | |
2215 } | |
2216 | |
2217 void UndoEvent() | |
2218 { | |
2219 ATLASSERT(::IsWindow(m_hWnd)); | |
2220 ::SendMessage(m_hWnd, EM_UNDOEVENT, 0, 0L); | |
2221 } | |
2222 | |
2223 // Standard EM_xxx messages | |
2224 DWORD GetSel() const | |
2225 { | |
2226 ATLASSERT(::IsWindow(m_hWnd)); | |
2227 return (DWORD)::SendMessage(m_hWnd, EM_GETSEL, 0, 0L); | |
2228 } | |
2229 | |
2230 void GetSel(int& nStartChar, int& nEndChar) const | |
2231 { | |
2232 ATLASSERT(::IsWindow(m_hWnd)); | |
2233 ::SendMessage(m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&n
EndChar); | |
2234 } | |
2235 | |
2236 void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE) | |
2237 { | |
2238 ATLASSERT(::IsWindow(m_hWnd)); | |
2239 ::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM)bCanUndo, (LPARAM)l
pszNewText); | |
2240 } | |
2241 | |
2242 void SetModify(BOOL bModified = TRUE) | |
2243 { | |
2244 ATLASSERT(::IsWindow(m_hWnd)); | |
2245 ::SendMessage(m_hWnd, EM_SETMODIFY, (WPARAM)bModified, 0L); | |
2246 } | |
2247 | |
2248 int GetTextLength() const | |
2249 { | |
2250 ATLASSERT(::IsWindow(m_hWnd)); | |
2251 return (int)::SendMessage(m_hWnd, WM_GETTEXTLENGTH, 0, 0L); | |
2252 } | |
2253 | |
2254 // Clipboard operations | |
2255 void Clear() | |
2256 { | |
2257 ATLASSERT(::IsWindow(m_hWnd)); | |
2258 ::SendMessage(m_hWnd, WM_CLEAR, 0, 0L); | |
2259 } | |
2260 | |
2261 void Copy() | |
2262 { | |
2263 ATLASSERT(::IsWindow(m_hWnd)); | |
2264 ::SendMessage(m_hWnd, WM_COPY, 0, 0L); | |
2265 } | |
2266 | |
2267 void Cut() | |
2268 { | |
2269 ATLASSERT(::IsWindow(m_hWnd)); | |
2270 ::SendMessage(m_hWnd, WM_CUT, 0, 0L); | |
2271 } | |
2272 | |
2273 void Paste() | |
2274 { | |
2275 ATLASSERT(::IsWindow(m_hWnd)); | |
2276 ::SendMessage(m_hWnd, WM_PASTE, 0, 0L); | |
2277 } | |
2278 }; | |
2279 | |
2280 typedef CRichInkCtrlT<ATL::CWindow> CRichInkCtrl; | |
2281 | |
2282 | |
2283 /////////////////////////////////////////////////////////////////////////////// | |
2284 // CInkXCtrl | |
2285 | |
2286 template <class TBase> | |
2287 class CInkXCtrlT : public TBase | |
2288 { | |
2289 public: | |
2290 // Constructors | |
2291 CInkXCtrlT(HWND hWnd = NULL) : TBase(hWnd) | |
2292 { } | |
2293 | |
2294 CInkXCtrlT< TBase >& operator =(HWND hWnd) | |
2295 { | |
2296 m_hWnd = hWnd; | |
2297 return *this; | |
2298 } | |
2299 | |
2300 HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowN
ame = NULL, | |
2301 DWORD dwStyle = 0, DWORD dwExStyle = 0, | |
2302 ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = N
ULL) | |
2303 { | |
2304 HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_
lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | |
2305 ATLASSERT(hWnd != NULL); // Did you remember to call InitInkX(
) ?? | |
2306 return hWnd; | |
2307 } | |
2308 | |
2309 // Attributes | |
2310 static LPCTSTR GetWndClassName() | |
2311 { | |
2312 return WC_INKX; | |
2313 } | |
2314 | |
2315 static UINT GetHotRecordingMessage() | |
2316 { | |
2317 return ::RegisterWindowMessage(szHotRecording); | |
2318 } | |
2319 | |
2320 void ClearAll() | |
2321 { | |
2322 ATLASSERT(::IsWindow(m_hWnd)); | |
2323 ::SendMessage(m_hWnd, IM_CLEARALL, 0, 0L); | |
2324 } | |
2325 | |
2326 int GetData(BYTE* lpBuffer, INT cbBuffer) const | |
2327 { | |
2328 ATLASSERT(::IsWindow(m_hWnd)); | |
2329 ATLASSERT(lpBuffer); | |
2330 return (int)::SendMessage(m_hWnd, IM_GETDATA, (WPARAM)cbBuffer,
(LPARAM)lpBuffer); | |
2331 } | |
2332 | |
2333 int GetDataLen() const | |
2334 { | |
2335 ATLASSERT(::IsWindow(m_hWnd)); | |
2336 return (int)::SendMessage(m_hWnd, IM_GETDATALEN, 0, 0L); | |
2337 } | |
2338 | |
2339 CRichInkCtrl GetRichInk() const | |
2340 { | |
2341 ATLASSERT(::IsWindow(m_hWnd)); | |
2342 return (HWND)::SendMessage(m_hWnd, IM_GETRICHINK, 0, 0L); | |
2343 } | |
2344 | |
2345 BOOL IsRecording() const | |
2346 { | |
2347 ATLASSERT(::IsWindow(m_hWnd)); | |
2348 return (BOOL)::SendMessage(m_hWnd, IM_RECORDING, 0, 0L); | |
2349 } | |
2350 | |
2351 void ReInit() | |
2352 { | |
2353 ATLASSERT(::IsWindow(m_hWnd)); | |
2354 ::SendMessage(m_hWnd, IM_REINIT, 0, 0L); | |
2355 } | |
2356 | |
2357 void SetData(const BYTE* lpInkData, INT cbInkData) | |
2358 { | |
2359 ATLASSERT(::IsWindow(m_hWnd)); | |
2360 ATLASSERT(lpInkData); | |
2361 ::SendMessage(m_hWnd, IM_SETDATA, (WPARAM)cbInkData, (LPARAM)lpI
nkData); | |
2362 } | |
2363 | |
2364 void VoicePlay() | |
2365 { | |
2366 ATLASSERT(::IsWindow(m_hWnd)); | |
2367 ::SendMessage(m_hWnd, IM_VOICE_PLAY, 0, 0L); | |
2368 } | |
2369 | |
2370 BOOL IsVoicePlaying() const | |
2371 { | |
2372 ATLASSERT(::IsWindow(m_hWnd)); | |
2373 return (BOOL)::SendMessage(m_hWnd, IM_VOICE_PLAYING, 0, 0L); | |
2374 } | |
2375 | |
2376 BOOL VoiceRecord() | |
2377 { | |
2378 ATLASSERT(::IsWindow(m_hWnd)); | |
2379 return (BOOL)::SendMessage(m_hWnd, IM_VOICE_RECORD, 0, 0L); | |
2380 } | |
2381 | |
2382 void VoiceStop() | |
2383 { | |
2384 ATLASSERT(::IsWindow(m_hWnd)); | |
2385 ::SendMessage(m_hWnd, IM_VOICE_STOP, 0, 0L); | |
2386 } | |
2387 | |
2388 void ShowVoiceBar(BOOL bShow = TRUE) | |
2389 { | |
2390 ATLASSERT(::IsWindow(m_hWnd)); | |
2391 ::SendMessage(m_hWnd, IM_VOICEBAR, (WPARAM)bShow, 0L); | |
2392 } | |
2393 }; | |
2394 | |
2395 typedef CInkXCtrlT<ATL::CWindow> CInkXCtrl; | |
2396 | |
2397 #endif // WIN32_PLATFORM_PSPC | |
2398 | |
2399 | |
2400 /////////////////////////////////////////////////////////////////////////////// | |
2401 // CVoiceRecorderCtrl | |
2402 | |
2403 template <class TBase> | |
2404 class CVoiceRecorderCtrlT : public TBase | |
2405 { | |
2406 public: | |
2407 // Constructors | |
2408 CVoiceRecorderCtrlT(HWND hWnd = NULL) : TBase(hWnd) | |
2409 { } | |
2410 | |
2411 CVoiceRecorderCtrlT< TBase >& operator =(HWND hWnd) | |
2412 { | |
2413 m_hWnd = hWnd; | |
2414 return *this; | |
2415 } | |
2416 | |
2417 HWND Create(HWND hWndParent, const POINT pt, LPTSTR pstrFileName, UINT n
ID, DWORD dwStyle = 0) | |
2418 { | |
2419 ATLASSERT(pstrFileName != NULL); | |
2420 CM_VOICE_RECORDER cmvr = { 0 }; | |
2421 cmvr.cb = sizeof(CM_VOICE_RECORDER); | |
2422 cmvr.dwStyle = dwStyle; | |
2423 cmvr.xPos = pt.x; | |
2424 cmvr.yPos = pt.y; | |
2425 cmvr.hwndParent = hWndParent; | |
2426 cmvr.id = nID; | |
2427 cmvr.lpszRecordFileName = pstrFileName; | |
2428 m_hWnd = VoiceRecorder_Create(&cmvr); | |
2429 return m_hWnd; | |
2430 } | |
2431 | |
2432 HWND Create(LPCM_VOICE_RECORDER pAttribs) | |
2433 { | |
2434 ATLASSERT(pAttribs); | |
2435 m_hWnd = VoiceRecorder_Create(pAttribs); | |
2436 return m_hWnd; | |
2437 } | |
2438 | |
2439 // Attributes | |
2440 void Record() | |
2441 { | |
2442 ATLASSERT(::IsWindow(m_hWnd)); | |
2443 ::SendMessage(m_hWnd, VRM_RECORD, 0, 0L); | |
2444 } | |
2445 | |
2446 void Play() | |
2447 { | |
2448 ATLASSERT(::IsWindow(m_hWnd)); | |
2449 ::SendMessage(m_hWnd, VRM_PLAY, 0, 0L); | |
2450 } | |
2451 | |
2452 void Stop() | |
2453 { | |
2454 ATLASSERT(::IsWindow(m_hWnd)); | |
2455 ::SendMessage(m_hWnd, VRM_STOP, 0, 0L); | |
2456 } | |
2457 | |
2458 void Cancel() | |
2459 { | |
2460 ATLASSERT(::IsWindow(m_hWnd)); | |
2461 ::SendMessage(m_hWnd, VRM_CANCEL, 0, 0L); | |
2462 } | |
2463 | |
2464 void Done() | |
2465 { | |
2466 ATLASSERT(::IsWindow(m_hWnd)); | |
2467 ::SendMessage(m_hWnd, VRM_OK, 0, 0L); | |
2468 } | |
2469 }; | |
2470 | |
2471 typedef CVoiceRecorderCtrlT<ATL::CWindow> CVoiceRecorderCtrl; | |
2472 | |
2473 | |
2474 #ifdef WIN32_PLATFORM_PSPC | |
2475 | |
2476 /////////////////////////////////////////////////////////////////////////////// | |
2477 // CDocListCtrl | |
2478 | |
2479 template <class TBase> | |
2480 class CDocListCtrlT : public TBase | |
2481 { | |
2482 public: | |
2483 // Attributes | |
2484 DOCLISTCREATE m_dlc; | |
2485 TCHAR m_szPath[MAX_PATH]; | |
2486 | |
2487 // Constructors | |
2488 CDocListCtrlT(HWND hWnd = NULL) : TBase(hWnd) | |
2489 { } | |
2490 | |
2491 CDocListCtrlT< TBase >& operator =(HWND hWnd) | |
2492 { | |
2493 m_hWnd = hWnd; | |
2494 return *this; | |
2495 } | |
2496 | |
2497 HWND Create(HWND hWndParent, WORD wId, LPCTSTR pszFolder = NULL, LPCTSTR
pstrFilter = NULL, | |
2498 WORD wFilterIndex = 0, DWORD dwFlags = DLF_SHOWEXTENSION
) | |
2499 { | |
2500 ATLASSERT(pstrFilter != NULL); // It seems to need a filter ba
dly!! | |
2501 ::ZeroMemory(&m_dlc, sizeof(DOCLISTCREATE)); | |
2502 ::ZeroMemory(m_szPath, sizeof(m_szPath)); | |
2503 if(pszFolder != NULL) | |
2504 ::lstrcpyn(m_szPath, pszFolder, MAX_PATH - 1); | |
2505 m_dlc.dwStructSize = sizeof(DOCLISTCREATE); | |
2506 m_dlc.hwndParent = hWndParent; | |
2507 m_dlc.pszFolder = m_szPath; | |
2508 m_dlc.pstrFilter = pstrFilter; | |
2509 m_dlc.wFilterIndex = wFilterIndex; | |
2510 m_dlc.wId = wId; | |
2511 m_dlc.dwFlags = dwFlags; | |
2512 m_hWnd = DocList_Create(&m_dlc); | |
2513 return m_hWnd; | |
2514 } | |
2515 | |
2516 HWND Create(DOCLISTCREATE* pDlc) | |
2517 { | |
2518 m_dlc = *pDlc; | |
2519 m_hWnd = DocList_Create(&m_dlc); | |
2520 return m_hWnd; | |
2521 } | |
2522 | |
2523 // Attributes | |
2524 void DeleteSel() | |
2525 { | |
2526 ATLASSERT(::IsWindow(m_hWnd)); | |
2527 ::SendMessage(m_hWnd, DLM_DELETESEL, 0, 0L); | |
2528 } | |
2529 | |
2530 void DisableUpdates() | |
2531 { | |
2532 ATLASSERT(::IsWindow(m_hWnd)); | |
2533 ::SendMessage(m_hWnd, DLM_DISABLEUPDATES, 0, 0L); | |
2534 } | |
2535 | |
2536 void EnableUpdates() | |
2537 { | |
2538 ATLASSERT(::IsWindow(m_hWnd)); | |
2539 ::SendMessage(m_hWnd, DLM_ENABLEUPDATES, 0, 0L); | |
2540 } | |
2541 | |
2542 int GetFilterIndex() const | |
2543 { | |
2544 ATLASSERT(::IsWindow(m_hWnd)); | |
2545 return (int)::SendMessage(m_hWnd, DLM_GETFILTERINDEX, 0, 0L); | |
2546 } | |
2547 | |
2548 int GetItemCount() const | |
2549 { | |
2550 ATLASSERT(::IsWindow(m_hWnd)); | |
2551 return (int)::SendMessage(m_hWnd, DLM_GETITEMCOUNT, 0, 0L); | |
2552 } | |
2553 | |
2554 int GetNextItem(int iIndex, DWORD dwRelation = LVNI_ALL) const | |
2555 { | |
2556 ATLASSERT(::IsWindow(m_hWnd)); | |
2557 return (int)::SendMessage(m_hWnd, DLM_GETNEXTITEM, (WPARAM)iInde
x, (LPARAM)dwRelation); | |
2558 } | |
2559 | |
2560 int GetFirstItem(DWORD dwRelation = LVNI_ALL) const | |
2561 { | |
2562 ATLASSERT(::IsWindow(m_hWnd)); | |
2563 return (int)::SendMessage(m_hWnd, DLM_GETNEXTITEM, (WPARAM)-1, (
LPARAM)dwRelation); | |
2564 } | |
2565 | |
2566 BOOL GetNextWave(int* pIndex) const | |
2567 { | |
2568 ATLASSERT(::IsWindow(m_hWnd)); | |
2569 ATLASSERT(pIndex); | |
2570 return (BOOL)::SendMessage(m_hWnd, DLM_GETNEXTWAVE, 0, (LPARAM)p
Index); | |
2571 } | |
2572 | |
2573 BOOL GetPrevWave(int* pIndex) const | |
2574 { | |
2575 ATLASSERT(::IsWindow(m_hWnd)); | |
2576 ATLASSERT(pIndex); | |
2577 return (BOOL)::SendMessage(m_hWnd, DLM_GETPREVWAVE, 0, (LPARAM)p
Index); | |
2578 } | |
2579 | |
2580 int GetSelCount() const | |
2581 { | |
2582 ATLASSERT(::IsWindow(m_hWnd)); | |
2583 return (int)::SendMessage(m_hWnd, DLM_GETSELCOUNT, 0, 0L); | |
2584 } | |
2585 | |
2586 BOOL GetSelPathName(LPTSTR pstrPath, int cchMax) const | |
2587 { | |
2588 ATLASSERT(::IsWindow(m_hWnd)); | |
2589 ATLASSERT(pstrPath); | |
2590 return (BOOL)::SendMessage(m_hWnd, DLM_GETSELPATHNAME, (WPARAM)c
chMax, (LPARAM)pstrPath); | |
2591 } | |
2592 | |
2593 void ReceiveIR(LPCTSTR pstrPath) const | |
2594 { | |
2595 ATLASSERT(::IsWindow(m_hWnd)); | |
2596 ATLASSERT(pstrPath); | |
2597 ::SendMessage(m_hWnd, DLM_RECEIVEIR, 0, (LPARAM)pstrPath); | |
2598 } | |
2599 | |
2600 void Refresh() | |
2601 { | |
2602 ATLASSERT(::IsWindow(m_hWnd)); | |
2603 ::SendMessage(m_hWnd, DLM_REFRESH, 0, 0L); | |
2604 } | |
2605 | |
2606 BOOL RenameMoveSelectedItems() | |
2607 { | |
2608 ATLASSERT(::IsWindow(m_hWnd)); | |
2609 return (BOOL)::SendMessage(m_hWnd, DLM_RENAMEMOVE, 0, 0L); | |
2610 } | |
2611 | |
2612 int SelectAll() | |
2613 { | |
2614 ATLASSERT(::IsWindow(m_hWnd)); | |
2615 return (int)::SendMessage(m_hWnd, DLM_SELECTALL, 0, 0L); | |
2616 } | |
2617 | |
2618 HRESULT SelectItem(LPCTSTR pstrPath, BOOL bVisible = TRUE) | |
2619 { | |
2620 ATLASSERT(::IsWindow(m_hWnd)); | |
2621 ATLASSERT(pstrPath); | |
2622 return (HRESULT)::SendMessage(m_hWnd, DLM_SELECTITEM, (WPARAM)bV
isible, (LPARAM)pstrPath); | |
2623 } | |
2624 | |
2625 void SendEMail(LPCTSTR pstrAttachment) | |
2626 { | |
2627 ATLASSERT(::IsWindow(m_hWnd)); | |
2628 ::SendMessage(m_hWnd, DLM_SENDEMAIL, 0, (LPARAM)pstrAttachment); | |
2629 } | |
2630 | |
2631 void SendIR(LPCTSTR pstrPath) | |
2632 { | |
2633 ATLASSERT(::IsWindow(m_hWnd)); | |
2634 ::SendMessage(m_hWnd, DLM_SENDIR, 0, (LPARAM)pstrPath); | |
2635 } | |
2636 | |
2637 HRESULT SetFilterIndex(int iIndex) | |
2638 { | |
2639 ATLASSERT(::IsWindow(m_hWnd)); | |
2640 return (HRESULT)::SendMessage(m_hWnd, DLM_SETFILTERINDEX, (WPARA
M)iIndex, 0L); | |
2641 } | |
2642 | |
2643 void SetFolder(LPCTSTR pstrPath) | |
2644 { | |
2645 ATLASSERT(::IsWindow(m_hWnd)); | |
2646 ATLASSERT(pstrPath); | |
2647 ::SendMessage(m_hWnd, DLM_SETFOLDER, 0, (LPARAM)pstrPath); | |
2648 } | |
2649 | |
2650 BOOL SetItemState(int iIndex, const LVITEM* pItem) | |
2651 { | |
2652 ATLASSERT(::IsWindow(m_hWnd)); | |
2653 ATLASSERT(pItem); | |
2654 return (BOOL)::SendMessage(m_hWnd, DLM_SETITEMSTATE, (WPARAM)iIn
dex, (LPARAM)pItem); | |
2655 } | |
2656 | |
2657 BOOL SetItemState(int iIndex, UINT uState, UINT uMask) | |
2658 { | |
2659 ATLASSERT(::IsWindow(m_hWnd)); | |
2660 LV_ITEM lvi = { 0 }; | |
2661 lvi.stateMask = uMask; | |
2662 lvi.state = uState; | |
2663 return (BOOL)::SendMessage(m_hWnd, DLM_SETITEMSTATE, (WPARAM)iIn
dex, (LPARAM)&lvi); | |
2664 } | |
2665 | |
2666 void SetOneItem(int iIndex, LPCVOID pPA) | |
2667 { | |
2668 ATLASSERT(::IsWindow(m_hWnd)); | |
2669 ::SendMessage(m_hWnd, DLM_SETONEITEM, (WPARAM)iIndex, (LPARAM)pP
A); | |
2670 } | |
2671 | |
2672 void SetSelect(int iIndex) | |
2673 { | |
2674 ATLASSERT(::IsWindow(m_hWnd)); | |
2675 ::SendMessage(m_hWnd, DLM_SETSELECT, (WPARAM)iIndex, 0L); | |
2676 } | |
2677 | |
2678 void SetSelPathName(LPCTSTR pstrPath) | |
2679 { | |
2680 ATLASSERT(::IsWindow(m_hWnd)); | |
2681 ATLASSERT(pstrPath); | |
2682 ::SendMessage(m_hWnd, DLM_SETSELPATHNAME, 0, (LPARAM)pstrPath); | |
2683 } | |
2684 | |
2685 BOOL SetSortOrder() | |
2686 { | |
2687 ATLASSERT(::IsWindow(m_hWnd)); | |
2688 return (BOOL)::SendMessage(m_hWnd, DLM_SETSORTORDER, 0, 0L); | |
2689 } | |
2690 | |
2691 HRESULT Update() | |
2692 { | |
2693 ATLASSERT(::IsWindow(m_hWnd)); | |
2694 return (HRESULT)::SendMessage(m_hWnd, DLM_UPDATE, 0, 0L); | |
2695 } | |
2696 | |
2697 BOOL ValidateFolder() | |
2698 { | |
2699 ATLASSERT(::IsWindow(m_hWnd)); | |
2700 return (BOOL)::SendMessage(m_hWnd, DLM_VALIDATEFOLDER, 0, 0L); | |
2701 } | |
2702 | |
2703 // Functions | |
2704 BOOL GetFirstSelectedWaveFile(int* pIndex, LPTSTR szPath, const size_t c
chPath) | |
2705 { | |
2706 ATLASSERT(::IsWindow(m_hWnd)); | |
2707 return DocList_GetFirstSelectedWaveFile(m_hWnd, pIndex, szPath,
cchPath); | |
2708 } | |
2709 | |
2710 BOOL GetNextSelectedWaveFile(int* pIndex, LPTSTR szPath, const size_t cc
hPath) | |
2711 { | |
2712 ATLASSERT(::IsWindow(m_hWnd)); | |
2713 return DocList_GetNextSelectedWaveFile(m_hWnd, pIndex, szPath, c
chPath); | |
2714 } | |
2715 }; | |
2716 | |
2717 typedef CDocListCtrlT<ATL::CWindow> CDocListCtrl; | |
2718 | |
2719 #endif // WIN32_PLATFORM_PSPC | |
2720 | |
2721 | |
2722 /////////////////////////////////////////////////////////////////////////////// | |
2723 // CCapEdit | |
2724 | |
2725 template <class TBase> | |
2726 class CCapEditT : public TBase | |
2727 { | |
2728 public: | |
2729 // Constructors | |
2730 CCapEditT(HWND hWnd = NULL) : TBase(hWnd) | |
2731 { } | |
2732 | |
2733 CCapEditT< TBase >& operator =(HWND hWnd) | |
2734 { | |
2735 m_hWnd = hWnd; | |
2736 return *this; | |
2737 } | |
2738 | |
2739 HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowN
ame = NULL, | |
2740 DWORD dwStyle = 0, DWORD dwExStyle = 0, | |
2741 ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = N
ULL) | |
2742 { | |
2743 HWND hWnd = /*TBase*/CWindow::Create(GetWndClassName(), hWndPare
nt, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateP
aram); | |
2744 ATLASSERT(hWnd != NULL); // Did you remember to call SHInitExt
raControls() ?? | |
2745 return hWnd; | |
2746 } | |
2747 | |
2748 // Attributes | |
2749 static LPCTSTR GetWndClassName() | |
2750 { | |
2751 return WC_CAPEDIT; | |
2752 } | |
2753 }; | |
2754 | |
2755 typedef CCapEditT<WTL::CEdit> CCapEdit; | |
2756 | |
2757 /////////////////////////////////////////////////////////////////////////////// | |
2758 // CTTStatic | |
2759 | |
2760 #ifndef WIN32_PLATFORM_WFSP // Tooltips not supported on SmartPhone | |
2761 | |
2762 template <class TBase> | |
2763 class CTTStaticT : public TBase | |
2764 { | |
2765 public: | |
2766 // Constructors | |
2767 CTTStaticT(HWND hWnd = NULL) : TBase(hWnd) | |
2768 { } | |
2769 | |
2770 CTTStaticT< TBase >& operator =(HWND hWnd) | |
2771 { | |
2772 m_hWnd = hWnd; | |
2773 return *this; | |
2774 } | |
2775 | |
2776 HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowN
ame = NULL, | |
2777 DWORD dwStyle = 0, DWORD dwExStyle = 0, | |
2778 ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = N
ULL) | |
2779 { | |
2780 HWND hWnd = TBase::Create(hWndParent, rect.m_lpRect, szWindowNam
e, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | |
2781 ATLASSERT(hWnd != NULL); // Did you remember to call SHInitExt
raControls() ?? | |
2782 return hWnd; | |
2783 } | |
2784 | |
2785 // Attributes | |
2786 static LPCTSTR GetWndClassName() | |
2787 { | |
2788 return WC_TSTATIC; | |
2789 } | |
2790 | |
2791 // Operations | |
2792 BOOL SetToolTipText(LPCTSTR pstrTipText) | |
2793 { | |
2794 ATLASSERT(::IsWindow(m_hWnd)); | |
2795 ATLASSERT(pstrTipText); | |
2796 ATLASSERT(lstrlen(pstrTipText)<= 253); | |
2797 CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff; | |
2798 LPTSTR pstr = buff.Allocate(lstrlen(pstrTipText) + 3); | |
2799 if(pstr == NULL) | |
2800 return FALSE; | |
2801 ::lstrcpy(pstr, _T("~~")); | |
2802 ::lstrcat(pstr, pstrTipText); | |
2803 return SetWindowText(pstr); | |
2804 } | |
2805 }; | |
2806 | |
2807 typedef CTTStaticT<WTL::CStatic> CTTStatic; | |
2808 | |
2809 | |
2810 /////////////////////////////////////////////////////////////////////////////// | |
2811 // CTTButton | |
2812 | |
2813 template <class TBase> | |
2814 class CTTButtonT : public TBase | |
2815 { | |
2816 public: | |
2817 // Constructors | |
2818 CTTButtonT(HWND hWnd = NULL) : TBase(hWnd) | |
2819 { } | |
2820 | |
2821 CTTButtonT< TBase >& operator =(HWND hWnd) | |
2822 { | |
2823 m_hWnd = hWnd; | |
2824 return *this; | |
2825 } | |
2826 | |
2827 HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowN
ame = NULL, | |
2828 DWORD dwStyle = 0, DWORD dwExStyle = 0, | |
2829 ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = N
ULL) | |
2830 { | |
2831 HWND hWnd = TBase::Create(hWndParent, rect.m_lpRect, szWindowNam
e, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); | |
2832 ATLASSERT(hWnd != NULL); // Did you remember to call SHInitExt
raControls() ?? | |
2833 return hWnd; | |
2834 } | |
2835 | |
2836 // Attributes | |
2837 static LPCTSTR GetWndClassName() | |
2838 { | |
2839 return WC_TBUTTON; | |
2840 } | |
2841 | |
2842 // Operations | |
2843 BOOL SetToolTipText(LPCTSTR pstrTipText) | |
2844 { | |
2845 ATLASSERT(::IsWindow(m_hWnd)); | |
2846 ATLASSERT(pstrTipText); | |
2847 ATLASSERT(lstrlen(pstrTipText)<= 253); | |
2848 CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff; | |
2849 LPTSTR pstr = buff.Allocate(lstrlen(pstrTipText) + 3); | |
2850 if(pstr == NULL) | |
2851 return FALSE; | |
2852 ::lstrcpy(pstr, _T("~~")); | |
2853 ::lstrcat(pstr, pstrTipText); | |
2854 return SetWindowText(pstr); | |
2855 } | |
2856 }; | |
2857 | |
2858 typedef CTTButtonT<WTL::CButton> CTTButton; | |
2859 | |
2860 #endif // !WIN32_PLATFORM_WFSP | |
2861 | |
2862 | |
2863 // --- SmartPhone specific controls --- | |
2864 | |
2865 #ifdef WIN32_PLATFORM_WFSP | |
2866 | |
2867 /////////////////////////////////////////////////////////////////////////////// | |
2868 // CSpinCtrlT - CSpinCtrl : SmartPhone adapted UpDown control | |
2869 | |
2870 template <class TBase> | |
2871 class CSpinCtrlT : public CUpDownCtrlT< TBase > | |
2872 { | |
2873 public: | |
2874 // Constructors | |
2875 CSpinCtrlT(HWND hWnd = NULL) : CUpDownCtrlT< TBase >(hWnd) | |
2876 { } | |
2877 | |
2878 CSpinCtrlT< TBase >& operator =(HWND hWnd) | |
2879 { | |
2880 m_hWnd = hWnd; | |
2881 return *this; | |
2882 } | |
2883 | |
2884 HWND Create(HWND hWndParent, HWND hBuddy, DWORD dwStyle, int nID, LPCTST
R szExpandedName = NULL) | |
2885 { | |
2886 ATLASSERT(::IsWindow(hWndParent)); | |
2887 CUpDownCtrlT< TBase >::Create(hWndParent, NULL, szExpandedName,
dwStyle, 0, nID, NULL); | |
2888 ATLASSERT(m_hWnd != NULL); // Did you remember to call AtlInit
CommonControls(ICC_UPDOWN_CLASS)? | |
2889 if (hBuddy != NULL) | |
2890 { | |
2891 ATLASSERT(::IsWindow(hBuddy)); | |
2892 SetBuddy(hBuddy); | |
2893 } | |
2894 return m_hWnd; | |
2895 } | |
2896 }; | |
2897 | |
2898 typedef CSpinCtrlT<ATL::CWindow> CSpinCtrl; | |
2899 | |
2900 | |
2901 /////////////////////////////////////////////////////////////////////////////// | |
2902 // CSpinned - SmartPhone association of control and Spin | |
2903 | |
2904 template <class TBase, bool t_bExpandOnly> | |
2905 class CSpinned : public TBase | |
2906 { | |
2907 public: | |
2908 CSpinCtrl m_SpinCtrl; | |
2909 DWORD m_dwSpinnedStyle; | |
2910 | |
2911 // Constructors | |
2912 CSpinned(HWND hWnd = NULL) : TBase(hWnd) | |
2913 { | |
2914 m_dwSpinnedStyle = WS_VISIBLE | UDS_ALIGNRIGHT | UDS_EXPANDABLE; | |
2915 | |
2916 if (t_bExpandOnly == true) | |
2917 m_dwSpinnedStyle |= UDS_NOSCROLL; | |
2918 else | |
2919 m_dwSpinnedStyle |= UDS_HORZ | UDS_ARROWKEYS | UDS_SETBU
DDYINT | UDS_WRAP; | |
2920 | |
2921 if (hWnd != NULL) | |
2922 AttachOrCreateSpinCtrl(); | |
2923 } | |
2924 | |
2925 CSpinned<TBase, t_bExpandOnly>& operator =(HWND hWnd) | |
2926 { | |
2927 Attach(hWnd); | |
2928 return *this; | |
2929 } | |
2930 | |
2931 void Attach(HWND hWnd) | |
2932 { | |
2933 ATLASSERT(!IsWindow()); | |
2934 TBase* pT = static_cast<TBase*>(this); | |
2935 pT->m_hWnd = hWnd; | |
2936 if (hWnd != NULL) | |
2937 AttachOrCreateSpinCtrl(); | |
2938 } | |
2939 | |
2940 HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szExpande
dName = NULL, | |
2941 DWORD dwStyle = 0, DWORD dwExStyle = 0, | |
2942 ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = N
ULL) | |
2943 { | |
2944 | |
2945 TBase* pT = static_cast<TBase*>(this); | |
2946 TBase::Create(hWndParent, rect, NULL, dwStyle, dwExStyle, MenuOr
ID, lpCreateParam); | |
2947 ATLASSERT(pT->m_hWnd != NULL); | |
2948 | |
2949 m_SpinCtrl.Create(hWndParent, pT->m_hWnd, m_dwSpinnedStyle, ATL_
IDW_SPIN_ID + (int)MenuOrID.m_hMenu, szExpandedName); | |
2950 | |
2951 ATLASSERT(m_SpinCtrl.m_hWnd != NULL); // Did you remember to c
all AtlInitCommonControls(ICC_UPDOWN_CLASS)? | |
2952 | |
2953 return pT->m_hWnd; | |
2954 } | |
2955 | |
2956 // Attributes | |
2957 CSpinCtrl& GetSpinCtrl() | |
2958 { | |
2959 return m_SpinCtrl; | |
2960 } | |
2961 | |
2962 // Implementation | |
2963 // Attach our existing SpinCtrl or create one | |
2964 bool AttachOrCreateSpinCtrl() | |
2965 { | |
2966 TBase* pT = static_cast<TBase*>(this); | |
2967 | |
2968 HWND hSpin = ::GetDlgItem(pT->GetParent(), ATL_IDW_SPIN_ID + pT-
>GetDlgCtrlID()); | |
2969 | |
2970 if (hSpin != NULL) | |
2971 { | |
2972 m_SpinCtrl.Attach(hSpin); | |
2973 #ifdef DEBUG | |
2974 TCHAR sClassName[16]; | |
2975 ::GetClassName(hSpin, sClassName, 16); | |
2976 ATLASSERT(!_tcscmp(sClassName, UPDOWN_CLASS)); | |
2977 ATLASSERT(m_SpinCtrl.GetBuddy().m_hWnd == pT->m_hWnd); | |
2978 #endif // DEBUG | |
2979 } | |
2980 else | |
2981 { | |
2982 m_SpinCtrl.Create(pT->GetParent(), pT->m_hWnd, m_dwSpinn
edStyle, ATL_IDW_SPIN_ID + pT->GetDlgCtrlID()); | |
2983 } | |
2984 | |
2985 return m_SpinCtrl.m_hWnd != NULL; | |
2986 } | |
2987 }; | |
2988 | |
2989 | |
2990 /////////////////////////////////////////////////////////////////////////////// | |
2991 // CSpinListBox - SmartPhone spinned ListBox control | |
2992 // CExpandListBox - SmartPhone expandable ListBox control | |
2993 // CExpandEdit - SmartPhone expandable Edit control | |
2994 // CExpandCapEdit - SmartPhone expandable CapEdit control | |
2995 | |
2996 typedef CSpinned<CListBox, false> CSpinListBox; | |
2997 typedef CSpinned<CListBox, true> CExpandListBox; | |
2998 typedef CSpinned<CEdit, true> CExpandEdit; | |
2999 typedef CSpinned<CCapEdit, true> CExpandCapEdit; | |
3000 | |
3001 #endif // WIN32_PLATFORM_WFSP | |
3002 | |
3003 #endif // _WTL_CE_NO_CONTROLS | |
3004 | |
3005 }; // namespace WTL | |
3006 | |
3007 #endif // __ATLWINCE_H__ | |
OLD | NEW |