1 // Windows Template Library - WTL version 8.0
\r
2 // Copyright (C) Microsoft Corporation. All rights reserved.
\r
4 // This file is a part of the Windows Template Library.
\r
5 // The use and distribution terms for this software are covered by the
\r
6 // Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)
\r
7 // which can be found in the file CPL.TXT at the root of this distribution.
\r
8 // By using this software in any fashion, you are agreeing to be bound by
\r
9 // the terms of this license. You must not remove this notice, or
\r
10 // any other, from this software.
\r
12 #ifndef __ATLWINCE_H__
\r
13 #define __ATLWINCE_H__
\r
18 #error ATL requires C++ compilation (use a .cpp suffix)
\r
21 #ifndef __ATLAPP_H__
\r
22 #error atlwince.h requires atlapp.h to be included first
\r
25 #ifndef __ATLWIN_H__
\r
26 #error atlwince.h requires atlwin.h to be included first
\r
30 #error atlwince.h compiles under Windows CE only
\r
31 #elif (_WIN32_WCE < 300)
\r
32 #error atlwince.h requires Windows CE 3.0 or higher.
\r
35 #if defined(WIN32_PLATFORM_WFSP) && _MSC_VER < 1400 // EVC compiling SmartPhone code
\r
36 #if (WIN32_PLATFORM_WFSP < 200)
\r
37 #error atlwince.h requires Smartphone 2003 or higher
\r
39 #endif // WIN32_PLATFORM_WFSP
\r
41 #if defined(WIN32_PLATFORM_PSPC) && _MSC_VER < 1400 // EVC compiling Pocket PC code
\r
42 #if (WIN32_PLATFORM_PSPC < 310)
\r
43 #error atlwince.h requires Pocket PC 2002 or higher
\r
45 #endif // WIN32_PLATFORM_PSPC
\r
47 #if !defined(_AYGSHELL_H_) && !defined(__AYGSHELL_H__)
\r
48 #error atlwince.h requires aygshell.h to be included first
\r
50 #if defined(WIN32_PLATFORM_WFSP) && !defined(_TPCSHELL_H_)
\r
51 #error SmartPhone dialog classes require tpcshell.h to be included first
\r
55 #if (_MSC_VER >= 1400) // VS2005
\r
56 #include <DeviceResolutionAware.h>
\r
58 #endif // (_MSC_VER >= 1400)
\r
60 #if !defined(_WTL_CE_NO_DIALOGS) && !defined(__ATLFRAME_H__)
\r
61 #error Orientation aware dialog classes require atlframe.h to be included first
\r
64 #if !defined(_WTL_CE_NO_APPWINDOW) && !defined(__ATLFRAME_H__)
\r
65 #error Application window class require atlframe.h to be included first
\r
68 #if !defined(_WTL_CE_NO_ZOOMSCROLL) && !defined(__ATLSCRL_H__)
\r
69 #error ZoomScroll implementation requires atlscrl.h to be included first
\r
72 #if !defined(_WTL_CE_NO_ZOOMSCROLL)
\r
73 #if !(defined(__ATLTYPES_H__) || (defined(__ATLMISC_H__) && !defined(_WTL_NO_WTYPES)))
\r
74 #error ZoomScroll requires _WTL_NO_WTYPES not to be defined and either atlmisc.h or atltypes.h to be included first
\r
75 #endif // !(defined(__ATLTYPES_H__) || (defined(__ATLMISC_H__) && !defined(_WTL_NO_WTYPES)))
\r
76 #endif // !defined(_WTL_CE_NO_ZOOMSCROLL)
\r
78 #if !defined(WIN32_PLATFORM_WFSP) && !defined(WIN32_PLATFORM_PSPC)
\r
79 #define _WTL_CE_NO_CONTROLS
\r
80 #endif // !defined(WIN32_PLATFORM_WFSP) && !defined(WIN32_PLATFORM_PSPC)
\r
82 #ifndef _WTL_CE_NO_CONTROLS
\r
83 #ifndef __ATLCTRLS_H__
\r
84 #error The PPC/SmartPhone controls classes require atlctrls.h to be included first
\r
87 #include <htmlctrl.h>
\r
88 #pragma comment(lib, "htmlview.lib")
\r
90 #include <voicectl.h>
\r
91 #pragma comment(lib, "voicectl.lib")
\r
93 #ifdef WIN32_PLATFORM_PSPC
\r
94 #include <richink.h>
\r
95 #pragma comment(lib, "richink.lib")
\r
98 #pragma comment(lib, "inkx.lib")
\r
100 #include <doclist.h>
\r
101 #pragma comment(lib, "doclist.lib")
\r
106 ///////////////////////////////////////////////////////////////////////////////
\r
107 // Classes in this file:
\r
109 // CStdDialogBase<T, t_shidiFlags, t_bModal> : Standard PPC/SmartPhone dialog base class
\r
110 // CStdDialogImplBase - Base implementation of standard dialog
\r
111 // CStdDialogImpl<T, t_shidiFlags, t_bModal> : Standard dialog implementation
\r
112 // CStdIndirectDialogImpl - implementation of standard indirect PPC/SmartPhone dialog
\r
113 // CStdAxDialogImpl<T, t_shidiFlags, t_bModal> : Standard AxDialog implementation
\r
114 // CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags> : Standard simple dialog
\r
115 // CStdDialogResizeImplBase - Base implementation of orientation resizing standard dialog
\r
116 // CStdDialogResizeImpl<T, t_shidiFlags, t_bModal> : Orientation resizing standard dialog implementation
\r
117 // CStdAxDialogResizeImpl - implementation of orientation resizing standard AxDialog
\r
118 // CStdSimpleDialogResizeImpl<T, t_wDlgTemplateID, t_shidiFlags> : Standard resizing simple dialog implementation
\r
119 // CStdOrientedDialogBase - Oriented PPC standard dialog base class
\r
120 // CStdOrientedDialogImplBase - Oriented PPC standard dialog base implementation
\r
121 // CStdOrientedDialogImpl<T, t_shidiFlags, t_bModal> : Oriented PPC standard dialog implementation
\r
122 // CStdAxOrientedDialogImpl - Oriented PPC standard AxDialog implementation
\r
123 // CStdSimpleOrientedDialog<t_wDlgTemplateID, t_wDlgLandscapeID, t_shidiFlags> : Standard simple orientable dialog
\r
125 // CAppInfoBase : Helper for application state save/restore to registry
\r
126 // CAppInfoT<T> : CAppInfoBase constructed from a CAppWindow<T>
\r
127 // CAppWindowBase<T> : Base class for PPC/SmartPhone well-behaved application window or dialog
\r
128 // CAppWindow<T> : PPC/SmartPhone well-behaved application window class
\r
129 // CAppDialog<T> : PPC/SmartPhone well-behaved application dialog class
\r
130 // CAppStdDialogImplBase - Base implementation of standard application dialogs
\r
131 // CAppStdDialogImpl<T, t_shidiFlags, t_bModal> : Implementation of standard application dialog
\r
132 // CAppStdDialogResizeImpl - implementation of orientation resizing standard application dialog
\r
133 // CAppStdAxDialogImpl - Implementation of standard application AxDialog
\r
134 // CAppStdAxDialogResizeImpl - implementation of orientation resizing standard application AxDialog
\r
135 // CAppStdOrientedDialogImpl - implementation of oriented PPC standard application dialog
\r
136 // CAppStdAxOrientedDialogImpl - implementation of oriented PPC standard application AxDialog
\r
138 // CFullScreenFrame<T, t_bHasSip> : Full screen frame class
\r
140 // CZoomScrollImpl<T> : WinCE zooming implementation
\r
142 // CBottomTabViewImpl<T, TBase, TWinTraits> - CBottomTabView
\r
143 // CHtmlCtrlT<TBase> - CHtmlCtrl
\r
144 // CRichInkCtrlT<TBase> - CRichInkCtrl
\r
145 // CInkXCtrlT<TBase> - CInkXCtrl
\r
146 // CVoiceRecorderCtrlT<TBase> - CVoiceRecorderCtrl
\r
147 // CDocListCtrlT<TBase> - CDocListCtrl
\r
148 // CCapEditT<TBase> - CCapEdit
\r
149 // CTTStaticT<TBase> - CTTStatic
\r
150 // CTTButtonT<TBase> - CTTButton
\r
152 // CSpinCtrlT<TBase> - CSpinCtrl : SmartPhone specific UpDown control
\r
153 // CSpinned<TBase, t_bExpandOnly> : SmartPhone association of control and Spin
\r
154 // CSpinListBox : SmartPhone spinned ListBox control
\r
155 // CExpandListBox : SmartPhone expandable ListBox control
\r
156 // CExpandEdit : SmartPhone expandable Edit control
\r
157 // CExpandCapEdit : SmartPhone expandable CapEdit control
\r
159 // Global functions:
\r
160 // AtlCreateMenuBar()
\r
161 // AtlCreateEmptyMenuBar()
\r
162 // AtlIsEditFocus()
\r
163 // AtlActivateBackKey()
\r
168 ///////////////////////////////////////////////////////////////////////////////
\r
169 // MenuBar creation functions for property sheets and dialogs
\r
170 // Frame windows use CreateSimpleCEMenuBar
\r
172 inline HWND AtlCreateMenuBar(SHMENUBARINFO& mbi)
\r
174 ATLASSERT(::IsWindow(mbi.hwndParent));
\r
175 ATLVERIFY(::SHCreateMenuBar(&mbi) != FALSE);
\r
179 inline HWND AtlCreateMenuBar(HWND hWnd, UINT nToolBarId = ATL_IDW_TOOLBAR, DWORD dwFlags = 0, int nBmpId = 0, int cBmpImages = 0, COLORREF clrBk = 0)
\r
181 SHMENUBARINFO mbi = { sizeof(mbi), hWnd, dwFlags, nToolBarId, ModuleHelper::GetResourceInstance(), nBmpId, cBmpImages, 0, clrBk };
\r
182 return AtlCreateMenuBar(mbi);
\r
185 inline HWND AtlCreateEmptyMenuBar(HWND hWnd, bool bSip = true)
\r
187 SHMENUBARINFO embi = { sizeof(SHMENUBARINFO), hWnd, SHCMBF_EMPTYBAR };
\r
189 embi.dwFlags |= SHCMBF_HIDESIPBUTTON;
\r
191 return AtlCreateMenuBar(embi);
\r
194 ///////////////////////////////////////////////////////////////////////////////
\r
195 // Helper functions for SmartPhone back key handling
\r
197 inline bool AtlIsEditFocus()
\r
199 ATL::CWindow wCtrl = GetFocus();
\r
200 if (wCtrl.IsWindow())
\r
202 TCHAR szClassName[8] = {0};
\r
203 ATLVERIFY(::GetClassName(wCtrl.m_hWnd, szClassName, 8));
\r
204 return !_tcscmp(szClassName, _T("Edit")) || !_tcscmp(szClassName, WC_CAPEDIT);
\r
209 #if defined WIN32_PLATFORM_WFSP
\r
210 inline void AtlActivateBackKey(HWND hMenuBar)
\r
212 ATLASSERT(::IsWindow(hMenuBar));
\r
213 ::SendMessage(hMenuBar, SHCMBM_OVERRIDEKEY, VK_TBACK,
\r
214 MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, SHMBOF_NODEFAULT | SHMBOF_NOTIFY));
\r
216 #endif // WIN32_PLATFORM_WFSP
\r
218 // --- Standard PPC/SmartPhone dialogs ---
\r
220 #ifndef _WTL_CE_NO_DIALOGS
\r
222 ///////////////////////////////////////////////////////////////////////////////
\r
223 // CStdDialogBase - base class for standard PPC/SmartPhone dialogs
\r
225 #define WTL_STD_SHIDIF SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN
\r
226 #define WTL_SP_SHIDIF SHIDIF_SIZEDLGFULLSCREEN
\r
228 // Title setting macros
\r
229 #define WTL_DLG_TITLEHEIGHT(iHeight) static const int GetTitleHeight(){return iHeight;}
\r
230 #define WTL_DLG_NOTITLE WTL_DLG_TITLEHEIGHT(0)
\r
232 ///////////////////////////////////////////////////////////////////////////////
\r
233 // CStdDialogBase - Base class for standard PPC/SmartPhone dialog
\r
235 template <class T, UINT t_shidiFlags, bool t_bModal = true>
\r
236 class CStdDialogBase
\r
239 #ifdef WIN32_PLATFORM_PSPC
\r
240 // Pocket PC only Dialog title handling
\r
241 const int nTitleHeight;
\r
243 CStdDialogBase() : nTitleHeight(T::GetTitleHeight())
\r
247 BOOL GetClientRect(LPRECT lpRect)
\r
249 T* pT = static_cast<T*>(this);
\r
250 ATLASSERT(pT->IsWindow());
\r
251 BOOL bRes = ::GetClientRect(pT->m_hWnd, lpRect);
\r
252 lpRect->top += nTitleHeight;
\r
256 BOOL SetWindowText(LPCTSTR lpszString)
\r
258 T* pT = static_cast<T*>(this);
\r
259 ATLASSERT(pT->IsWindow());
\r
260 BOOL bRes = ::SetWindowText(pT->m_hWnd, lpszString);
\r
261 if (nTitleHeight != 0)
\r
262 pT->DoPaintTitle();
\r
267 static const int GetTitleHeight()
\r
270 return DRA::SCALEY(24);
\r
271 #else // !_WTL_CE_DRA
\r
272 CWindowDC dc(NULL);
\r
273 return dc.GetDeviceCaps(LOGPIXELSY) >> 2; // LOGPIXELSY * 24 / 96,
\r
274 #endif // !_WTL_CE_DRA
\r
278 bool DoPaintTitle()
\r
280 T* pT = static_cast<T*>(this);
\r
281 ATLASSERT(pT->IsWindow());
\r
285 CPaintDC dc(pT->m_hWnd);
\r
286 CFont fontTitle = AtlCreateBoldFont();
\r
287 CFontHandle fontOld = dc.SelectFont(fontTitle);
\r
288 dc.SetTextColor(GetSysColor(COLOR_HIGHLIGHT));
\r
289 int nLen = pT->GetWindowText(sTitle, 48);
\r
290 int nWidth = dc.GetDeviceCaps(HORZRES);
\r
292 // Display title text
\r
293 RECT rTitle = { 0, 0, nWidth, nTitleHeight };
\r
294 dc.FillRect(&rTitle, COLOR_3DHIGHLIGHT);
\r
296 rTitle.left = DRA::SCALEX(8);
\r
297 #else // !_WTL_CE_DRA
\r
298 rTitle.left = nTitleHeight / 3; // 8 == 24 / 3
\r
299 #endif // !_WTL_CE_DRA
\r
300 dc.DrawText(sTitle, nLen, &rTitle, DT_VCENTER | DT_SINGLELINE);
\r
301 dc.SelectFont(fontOld);
\r
303 // Draw bottom line, 2 pixels thick if HI_RES_AWARE
\r
304 CPenHandle penOld = dc.SelectStockPen(BLACK_PEN);
\r
305 POINT line[4] = {{0, nTitleHeight}, {nWidth, nTitleHeight}, {0, nTitleHeight - 1}, {nWidth, nTitleHeight - 1}};
\r
308 int nSeg = DRA::SCALEY(1);
\r
309 #else // !_WTL_CE_DRA
\r
310 int nSeg = nTitleHeight / 24;
\r
311 #endif // !_WTL_CE_DRA
\r
313 dc.Polyline(line, nSeg <= 2 ? nSeg * 2 : 4);
\r
314 dc.SelectPen(penOld);
\r
319 // Title preparation: move the dialog controls down to make room for title
\r
320 void DialogTitleInit()
\r
322 T* pT = static_cast<T*>(this);
\r
323 ATLASSERT(pT->IsWindow());
\r
325 ATL::CWindow wCtl = pT->GetWindow(GW_CHILD);
\r
326 while (wCtl.IsWindow())
\r
329 wCtl.GetWindowRect(&rCtl);
\r
330 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rCtl, 2);
\r
331 ::OffsetRect(&rCtl, 0, nTitleHeight);
\r
332 wCtl.MoveWindow(&rCtl, FALSE);
\r
333 wCtl = wCtl.GetWindow(GW_HWNDNEXT);
\r
340 T* pT = static_cast<T*>(this);
\r
341 ATLASSERT(pT->IsWindow());
\r
343 SIPINFO si = {sizeof(SIPINFO)};
\r
345 if ((si.fdwFlags & SIPF_ON) ^ SIPF_ON)
\r
346 si.rcVisibleDesktop.bottom = si.rcSipRect.bottom;
\r
347 pT->MoveWindow(&si.rcVisibleDesktop, FALSE);
\r
350 // Title painting handler
\r
351 LRESULT OnPaintTitle(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
\r
353 T* pT = static_cast<T*>(this);
\r
354 return bHandled = nTitleHeight ? pT->DoPaintTitle() : FALSE;
\r
358 LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
\r
360 T* pT = static_cast<T*>(this);
\r
361 if (wParam == SPI_SETSIPINFO)
\r
366 return bHandled = FALSE;
\r
369 #elif defined WIN32_PLATFORM_WFSP
\r
370 // SmartPhone VK_TBACK key standard management
\r
371 LRESULT OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
\r
373 T* pT = static_cast<T*>(this);
\r
374 const UINT uModif = (UINT)LOWORD(lParam);
\r
375 const UINT uVirtKey = (UINT)HIWORD(lParam);
\r
377 if(uVirtKey == VK_TBACK)
\r
378 if (AtlIsEditFocus())
\r
379 ::SHSendBackToFocusWindow(uMsg, wParam, lParam);
\r
380 else if (uModif & MOD_KEYUP)
\r
381 pT->StdCloseDialog(IDCANCEL);
\r
385 // SmartPhone MenuBar and VK_TBACK key initialization
\r
388 T* pT = static_cast<T*>(this);
\r
389 HWND hMenuBar = ::SHFindMenuBar(pT->m_hWnd);
\r
391 if (!hMenuBar && (t_shidiFlags & SHIDIF_DONEBUTTON))
\r
392 hMenuBar = CreateMenuBar(ATL_IDM_MENU_DONE);
\r
394 if(hMenuBar != NULL)
\r
395 AtlActivateBackKey(hMenuBar);
\r
398 void SetStaticBold()
\r
400 T* pT = static_cast<T*>(this);
\r
401 ATLASSERT(pT->IsWindow());
\r
403 CFontHandle fontBold = AtlCreateBoldFont(pT->GetFont());
\r
405 ATL::CWindow wCtl = pT->GetWindow(GW_CHILD);
\r
407 while (wCtl.IsWindow())
\r
409 if ((short int)wCtl.GetDlgCtrlID() == IDC_STATIC)
\r
410 wCtl.SetFont(fontBold);
\r
411 wCtl = wCtl.GetWindow(GW_HWNDNEXT);
\r
414 #endif // WIN32_PLATFORM_WFSP
\r
416 // Platform dependant initialization
\r
417 void StdPlatformInit()
\r
419 T* pT = static_cast<T*>(this);
\r
420 #ifdef WIN32_PLATFORM_PSPC // Pocket PC title initialization
\r
421 if (nTitleHeight != 0)
\r
422 pT->DialogTitleInit();
\r
423 #elif defined(WIN32_PLATFORM_WFSP)
\r
426 #endif // WIN32_PLATFORM_WFSP
\r
429 // Menu bar creation
\r
430 HWND CreateMenuBar(UINT uiMB = T::IDD, int nBmpImages = 0)
\r
432 T* pT = static_cast<T*>(this);
\r
433 return AtlCreateMenuBar(pT->m_hWnd, uiMB, 0, nBmpImages ? uiMB : 0, nBmpImages);
\r
437 void StdCloseDialog(WORD wID)
\r
439 T* pT = static_cast<T*>(this);
\r
441 ::EndDialog(pT->m_hWnd, wID);
\r
443 pT->DestroyWindow();
\r
446 // Shell dialog layout initialization
\r
449 T* pT = static_cast<T*>(this);
\r
450 SHINITDLGINFO shidi = { SHIDIM_FLAGS, pT->m_hWnd, t_shidiFlags };
\r
451 ::SHInitDialog(&shidi);
\r
454 // IDC_INFOSTATIC background setting
\r
455 LRESULT OnColorStatic(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
\r
457 if (::GetDlgCtrlID((HWND)lParam) == IDC_INFOSTATIC)
\r
459 ::SetBkMode((HDC)wParam, TRANSPARENT);
\r
460 return (LRESULT)::GetSysColorBrush(COLOR_INFOBK);
\r
462 return bHandled = FALSE;
\r
465 // Menu dialog ending
\r
466 LRESULT OnMenuClose(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
\r
468 T* pT = static_cast<T*>(this);
\r
469 pT->StdCloseDialog((WORD)(wID - ID_MENU_OK + IDOK));
\r
473 // Standard dialog ending: may be used with any command
\r
474 LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
\r
476 T* pT = static_cast<T*>(this);
\r
477 pT->StdCloseDialog(wID);
\r
483 ///////////////////////////////////////////////////////////////////////////////
\r
484 // CStdDialogImplBase - Base implementation of standard PPC/SmartPhone dialog
\r
486 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true, class TBase = ATL::CDialogImpl< T > >
\r
487 class ATL_NO_VTABLE CStdDialogImplBase :
\r
489 public CStdDialogBase<T, t_shidiFlags, t_bModal>
\r
492 #ifdef WIN32_PLATFORM_PSPC
\r
493 BOOL GetClientRect(LPRECT lpRect)
\r
495 return CStdDialogBase<T, t_shidiFlags, t_bModal>::GetClientRect(lpRect);
\r
498 BOOL SetWindowText(LPCTSTR lpszString)
\r
500 return CStdDialogBase<T, t_shidiFlags, t_bModal>::SetWindowText(lpszString);
\r
504 BEGIN_MSG_MAP(CStdDialogImplBase)
\r
505 #ifdef WIN32_PLATFORM_PSPC // Pocket PC title and SIP
\r
506 MESSAGE_HANDLER(WM_PAINT, OnPaintTitle)
\r
507 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
\r
508 #elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key
\r
509 MESSAGE_HANDLER(WM_HOTKEY, OnHotKey)
\r
511 MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic)
\r
512 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
\r
513 COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd)
\r
514 COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose)
\r
517 LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
\r
520 T* pT = static_cast<T*>(this);
\r
521 ATLASSERT(t_bModal == pT->m_bModal);
\r
525 return bHandled = FALSE;
\r
529 ///////////////////////////////////////////////////////////////////////////////
\r
530 // CStdDialogImpl - implementation of standard PPC/SmartPhone dialog
\r
532 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true >
\r
533 class ATL_NO_VTABLE CStdDialogImpl : public CStdDialogImplBase< T, t_shidiFlags, t_bModal>
\r
536 ///////////////////////////////////////////////////////////////////////////////
\r
537 // CStdIndirectDialogImpl - implementation of standard indirect PPC/SmartPhone dialog
\r
539 #if defined __ATLDLGS_H__
\r
541 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true>
\r
542 class ATL_NO_VTABLE CStdIndirectDialogImpl :
\r
543 public CIndirectDialogImpl< T, CMemDlgTemplate, CStdDialogImpl<T, t_shidiFlags, t_bModal> >
\r
546 typedef CIndirectDialogImpl< T, CMemDlgTemplate, CStdDialogImpl<T, t_shidiFlags, t_bModal> > _baseClass;
\r
547 typedef CStdDialogImpl<T, t_shidiFlags, t_bModal> _baseStd;
\r
549 INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow(), LPARAM dwInitParam = NULL)
\r
551 ATLASSERT(t_bModal);
\r
553 if (!m_Template.IsValid())
\r
556 if (m_Template.IsTemplateEx())
\r
558 if (m_Template.GetTemplateExPtr()->style & DS_CENTER)
\r
560 ATLASSERT(m_Template.GetTemplateExPtr()->style ^ WS_CHILD);
\r
561 GetTemplateExPtr()->style |= WS_POPUP;
\r
566 if (m_Template.GetTemplatePtr()->style & DS_CENTER)
\r
568 ATLASSERT(m_Template.GetTemplatePtr()->style ^ WS_CHILD);
\r
569 m_Template.GetTemplatePtr()->style |= WS_POPUP;
\r
573 return _baseClass::DoModal(hWndParent, dwInitParam);
\r
576 HWND Create(HWND hWndParent, LPARAM dwInitParam = NULL)
\r
578 ATLASSERT(!t_bModal);
\r
580 if (!m_Template.IsValid())
\r
583 if (m_Template.IsTemplateEx())
\r
585 if (GetTemplateExPtr()->style & DS_CENTER)
\r
587 ATLASSERT(GetTemplateExPtr()->style ^ WS_CHILD);
\r
588 GetTemplateExPtr()->style |= WS_POPUP;
\r
593 if (GetTemplatePtr()->style & DS_CENTER)
\r
595 ATLASSERT(GetTemplatePtr()->style ^ WS_CHILD);
\r
596 GetTemplatePtr()->style |= WS_POPUP;
\r
600 return _baseClass::Create(hWndParent, dwInitParam);
\r
603 BEGIN_MSG_MAP(CStdIndirectDialogImpl)
\r
604 CHAIN_MSG_MAP(_baseStd)
\r
609 #endif // defined __ATLDLGS_H__
\r
611 #ifndef _ATL_NO_HOSTING
\r
613 ///////////////////////////////////////////////////////////////////////////////
\r
614 // CStdAxDialogImpl - implementation of standard PPC/SmartPhone AxDialog
\r
616 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true >
\r
617 class ATL_NO_VTABLE CStdAxDialogImpl : public CStdDialogImplBase< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl< T > >
\r
619 #endif // _ATL_NO_HOSTING
\r
621 ///////////////////////////////////////////////////////////////////////////////
\r
622 // CStdSimpleDialog - standard PPC/SmartPhone simple dialog with SHIDIF_xxx flags
\r
624 template <WORD t_wDlgTemplateID, UINT t_shidiFlags = WTL_STD_SHIDIF>
\r
625 class CStdSimpleDialog :
\r
626 public ATL::CSimpleDialog<t_wDlgTemplateID, FALSE>,
\r
627 public CStdDialogBase<CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>, t_shidiFlags>
\r
630 typedef CStdDialogBase<CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>, t_shidiFlags> baseClass;
\r
632 #ifdef WIN32_PLATFORM_PSPC
\r
633 BOOL GetClientRect(LPRECT lpRect)
\r
635 return baseClass::GetClientRect(lpRect);
\r
638 BOOL SetWindowText(LPCTSTR lpszString)
\r
640 return baseClass::SetWindowText(lpszString);
\r
644 BEGIN_MSG_MAP(CStdSimpleDialog)
\r
645 #ifdef WIN32_PLATFORM_PSPC // Pocket PC title and SIP
\r
646 MESSAGE_HANDLER(WM_PAINT, OnPaintTitle)
\r
647 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
\r
648 #elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key
\r
649 MESSAGE_HANDLER(WM_HOTKEY, OnHotKey)
\r
651 MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic)
\r
652 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
\r
653 COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose)
\r
654 COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd)
\r
657 LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
\r
661 return bHandled = FALSE;
\r
665 ///////////////////////////////////////////////////////////////////////////////
\r
666 // CStdDialogResizeImplBase - Base implementation of orientation resizing standard PPC/SmartPhone dialog
\r
668 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true, class TBase = ATL::CDialogImpl<T> >
\r
669 class ATL_NO_VTABLE CStdDialogResizeImplBase :
\r
670 public CStdDialogImplBase< T, t_shidiFlags, t_bModal, TBase>,
\r
671 public CDialogResize<T>
\r
674 // Note: BEGIN_DLGRESIZE_MAP is required in the derived class.
\r
676 BEGIN_MSG_MAP(CStdResizeDialogImplBase)
\r
677 #ifdef WIN32_PLATFORM_PSPC // Pocket PC title
\r
678 MESSAGE_HANDLER(WM_PAINT, OnPaintTitle)
\r
679 #elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key
\r
680 MESSAGE_HANDLER(WM_HOTKEY, OnHotKey)
\r
682 MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic)
\r
683 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
\r
684 COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd)
\r
685 COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose)
\r
686 CHAIN_MSG_MAP(CDialogResize< T >)
\r
689 LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
\r
692 T* pT = static_cast<T*>(this);
\r
693 ATLASSERT(t_bModal == pT->m_bModal);
\r
696 DlgResize_Init(FALSE);
\r
698 return bHandled = FALSE;
\r
702 ///////////////////////////////////////////////////////////////////////////////
\r
703 // CStdDialogResizeImpl - implementation of orientation resizing standard PPC/SmartPhone dialog
\r
705 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true >
\r
706 class ATL_NO_VTABLE CStdDialogResizeImpl : public CStdDialogResizeImplBase< T, t_shidiFlags, t_bModal>
\r
709 #ifndef _ATL_NO_HOSTING
\r
711 ///////////////////////////////////////////////////////////////////////////////
\r
712 // CStdAxDialogResizeImpl - implementation of orientation resizing standard PPC/SmartPhone AxDialog
\r
714 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true >
\r
715 class ATL_NO_VTABLE CStdAxDialogResizeImpl : public CStdDialogResizeImplBase< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl<T> >
\r
717 #endif // _ATL_NO_HOSTING
\r
719 ///////////////////////////////////////////////////////////////////////////////
\r
720 // CStdSimpleDialogResizeImpl - implementation of standard resizing simple dialog with SHIDIF_xxx flags
\r
723 // class CMyDlg : public CStdSimpleDialogResize<CMyDlg,
\r
724 // IDD_MYDLG, SHIDIF_DONEBUTTON | SHIDIF_FULLSCREENNOMENUBAR>
\r
727 // BEGIN_DLGRESIZE_MAP(CMyDlg)
\r
729 // END_DLGRESIZE_MAP()
\r
732 template <class T, WORD t_wDlgTemplateID, UINT t_shidiFlags = WTL_STD_SHIDIF>
\r
733 class ATL_NO_VTABLE CStdSimpleDialogResizeImpl :
\r
734 public CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>,
\r
735 public CDialogResize< T >
\r
738 typedef CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>::baseClass baseClass;
\r
740 BEGIN_MSG_MAP(CStdSimpleDialogResizeImpl)
\r
741 #ifdef WIN32_PLATFORM_PSPC // Pocket PC title
\r
742 MESSAGE_HANDLER(WM_PAINT, OnPaintTitle)
\r
743 #elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key
\r
744 MESSAGE_HANDLER(WM_HOTKEY, OnHotKey)
\r
746 MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic)
\r
747 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
\r
748 COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd)
\r
749 COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose)
\r
750 CHAIN_MSG_MAP(CDialogResize< T >)
\r
753 LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
\r
756 DlgResize_Init(FALSE);
\r
758 return bHandled = FALSE;
\r
762 #if defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC)
\r
764 ///////////////////////////////////////////////////////////////////////////////
\r
765 // CStdOrientedDialogBase - Oriented PPC standard dialog base class
\r
768 class CStdOrientedDialogBase
\r
772 BOOL SetOrientation(DRA::DisplayMode mode)
\r
774 T* pT = static_cast<T*>(this);
\r
775 ATLASSERT(pT->IsWindow());
\r
776 ATLASSERT(mode == DRA::GetDisplayMode());
\r
778 // Derived dialog must enumerate TWO dialog templates with the same control ids and types ie:
\r
779 // enum { IDD = IDD_MYDLG, IDD_LANDSCAPE = IDD_MYDLG_L };
\r
780 UINT iResource = (mode == DRA::Landscape)? T::IDD_LANDSCAPE : T::IDD;
\r
782 BOOL bRes = DRA::RelayoutDialog(ModuleHelper::GetResourceInstance(), pT->m_hWnd, MAKEINTRESOURCE(iResource));
\r
783 pT->OnOrientation(mode);
\r
788 void OnOrientation(DRA::DisplayMode /*mode*/)
\r
791 // Message handlers
\r
792 LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
\r
794 T* pT = static_cast<T*>(this);
\r
795 ATLASSERT(pT->IsWindow());
\r
796 if (wParam == SETTINGCHANGE_RESET)
\r
798 SetOrientation(DRA::GetDisplayMode());
\r
799 pT->StdPlatformInit();
\r
802 else if (wParam == SPI_SETSIPINFO)
\r
807 return bHandled = FALSE;
\r
811 ///////////////////////////////////////////////////////////////////////////////
\r
812 // CStdOrientedDialogImplBase - Oriented PPC standard dialog base implementation
\r
814 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true, class TBase = ATL::CDialogImpl<T> >
\r
815 class ATL_NO_VTABLE CStdOrientedDialogImplBase :
\r
816 public CStdDialogImplBase< T, t_shidiFlags, t_bModal, TBase>,
\r
817 public CStdOrientedDialogBase<T>
\r
820 BEGIN_MSG_MAP(CStdOrientedDialogImpl)
\r
821 MESSAGE_HANDLER(WM_PAINT, OnPaintTitle)
\r
822 MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic)
\r
823 MESSAGE_HANDLER(WM_SETTINGCHANGE, CStdOrientedDialogBase<T>::OnSettingChange)
\r
824 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
\r
825 COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd)
\r
826 COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose)
\r
829 LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
\r
831 T* pT = static_cast<T*>(this);
\r
833 ATLASSERT(t_bModal == pT->m_bModal);
\r
835 if (DRA::GetDisplayMode() == DRA::Landscape)
\r
836 SetOrientation(DRA::Landscape);
\r
837 pT->StdPlatformInit();
\r
839 return bHandled = FALSE;
\r
843 ///////////////////////////////////////////////////////////////////////////////
\r
844 // CStdOrientedDialogImpl - Oriented PPC standard dialog implementation
\r
846 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true >
\r
847 class ATL_NO_VTABLE CStdOrientedDialogImpl : public CStdOrientedDialogImplBase< T, t_shidiFlags, t_bModal>
\r
850 #ifndef _ATL_NO_HOSTING
\r
851 ///////////////////////////////////////////////////////////////////////////////
\r
852 // CStdAxOrientedDialogImpl - Oriented PPC standard AxDialog implementation
\r
854 template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true >
\r
855 class ATL_NO_VTABLE CStdAxOrientedDialogImpl : public CStdOrientedDialogImplBase< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl<T> >
\r
857 #endif // _ATL_NO_HOSTING
\r
859 ///////////////////////////////////////////////////////////////////////////////
\r
860 // CStdSimpleOrientedDialog - Standard simple orientable dialog
\r
862 template <WORD t_wDlgTemplateID, WORD t_wDlgLandscapeID, UINT t_shidiFlags = WTL_STD_SHIDIF>
\r
863 class CStdSimpleOrientedDialog :
\r
864 public CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>,
\r
865 public CStdOrientedDialogBase<CStdSimpleOrientedDialog<t_wDlgTemplateID, t_wDlgLandscapeID, t_shidiFlags> >
\r
868 typedef CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>::baseClass baseClass;
\r
869 typedef CStdOrientedDialogBase<CStdSimpleOrientedDialog<t_wDlgTemplateID, t_wDlgLandscapeID, t_shidiFlags> > baseOriented;
\r
871 enum {IDD = t_wDlgTemplateID, IDD_LANDSCAPE = t_wDlgLandscapeID};
\r
873 BEGIN_MSG_MAP(CStdSimpleDialog)
\r
874 MESSAGE_HANDLER(WM_PAINT, OnPaintTitle)
\r
875 MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic)
\r
876 MESSAGE_HANDLER(WM_SETTINGCHANGE, baseOriented::OnSettingChange)
\r
877 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
\r
878 COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd)
\r
879 COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose)
\r
882 LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
\r
884 if (DRA::GetDisplayMode() == DRA::Landscape)
\r
885 SetOrientation(DRA::Landscape);
\r
888 return bHandled = FALSE;
\r
892 #endif // _WTL_CE_DRA
\r
895 #endif // _WTL_CE_NO_DIALOGS
\r
898 // --- PPC/SmartPhone application window and helpers ---
\r
900 #ifndef _WTL_CE_NO_APPWINDOW
\r
902 ///////////////////////////////////////////////////////////////////////////////
\r
903 // CAppInfoBase - Helper for application state save/restore to registry
\r
908 ATL::CRegKey m_Key;
\r
910 CAppInfoBase(ATL::_U_STRINGorID sAppKey)
\r
912 m_Key.Create(HKEY_CURRENT_USER, sAppKey.m_lpstr);
\r
913 ATLASSERT(m_Key.m_hKey);
\r
917 LONG Save(V& val, ATL::_U_STRINGorID sName)
\r
919 return ::RegSetValueEx(m_Key, sName.m_lpstr, 0, REG_BINARY, (LPBYTE)&val, sizeof(V));
\r
923 LONG Save(int nb, V& val0, ATL::_U_STRINGorID sName)
\r
925 return ::RegSetValueEx(m_Key, sName.m_lpstr, 0, REG_BINARY, (LPBYTE)&val0, nb * sizeof(V));
\r
929 LONG Restore(V& val, ATL::_U_STRINGorID sName)
\r
932 DWORD bufSize = sizeof(V);
\r
933 return ::RegQueryValueEx(m_Key, sName.m_lpstr, 0, &valtype, (LPBYTE)&val, &bufSize);
\r
937 LONG Restore(int nb, V& val0, ATL::_U_STRINGorID sName)
\r
940 DWORD bufSize = nb * sizeof(V);
\r
941 return ::RegQueryValueEx(m_Key, sName.m_lpstr, 0, &valtype, (LPBYTE)&val0, &bufSize);
\r
944 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
\r
945 #if (_ATL_VER < 0x0800)
\r
946 LONG Save(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName)
\r
948 return m_Key.SetValue(sval, sName.m_lpstr);
\r
951 LONG Restore(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName)
\r
953 DWORD size = MAX_PATH;
\r
954 LONG res = m_Key.QueryValue(sval.GetBuffer(size), sName.m_lpstr, &size);
\r
955 sval.ReleaseBuffer();
\r
958 #else // !(_ATL_VER < 0x0800)
\r
959 LONG Save(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName)
\r
961 return m_Key.SetStringValue(sName.m_lpstr, sval);
\r
964 LONG Restore(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName)
\r
966 DWORD size = MAX_PATH;
\r
967 LONG res = m_Key.QueryStringValue(sName.m_lpstr, sval.GetBuffer(size), &size);
\r
968 sval.ReleaseBuffer();
\r
971 #endif // !(_ATL_VER < 0x0800)
\r
973 #pragma message("Warning: CAppInfoBase compiles without CString support. Do not use CString in Save or Restore.")
\r
974 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
\r
976 #if (_ATL_VER < 0x0800)
\r
977 LONG Save(LPCTSTR sval, ATL::_U_STRINGorID sName)
\r
979 return m_Key.SetValue(sval, sName.m_lpstr);
\r
982 LONG Restore(LPTSTR sval, ATL::_U_STRINGorID sName, DWORD *plength)
\r
984 return m_Key.QueryValue(sval, sName.m_lpstr, plength);
\r
986 #else // !(_ATL_VER < 0x0800)
\r
987 LONG Save(LPCTSTR sval, ATL::_U_STRINGorID sName)
\r
989 return m_Key.SetStringValue(sName.m_lpstr, sval);
\r
992 LONG Restore(LPTSTR sval, ATL::_U_STRINGorID sName, DWORD *plength)
\r
994 return m_Key.QueryStringValue(sName.m_lpstr, sval, plength);
\r
996 #endif // !(_ATL_VER < 0x0800)
\r
998 LONG Delete(ATL::_U_STRINGorID sName)
\r
1000 return m_Key.DeleteValue(sName.m_lpstr);
\r
1005 ///////////////////////////////////////////////////////////////////////////////
\r
1006 // CAppInfoT - CAppInfoBase constructed from a class with T::GetAppKey()
\r
1008 // Macro for declaring AppKey
\r
1009 #define DECLARE_APPKEY(uAppKey) \
\r
1010 static LPCTSTR GetAppKey() \
\r
1012 static LPCTSTR sAppKey = ATL::_U_STRINGorID(uAppKey).m_lpstr; \
\r
1016 template <class T>
\r
1017 class CAppInfoT : public CAppInfoBase
\r
1020 CAppInfoT() : CAppInfoBase(T::GetAppKey()){}
\r
1024 ///////////////////////////////////////////////////////////////////////////////
\r
1025 // CAppWindowBase - Base class for PPC/SmartPhone "well-behaved" application window or dialog
\r
1027 // Macros for declaring frame WNDCLASS and AppKey
\r
1028 #define DECLARE_APP_FRAME_CLASS(WndClassName, uCommonResourceID, uAppKey) \
\r
1029 DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \
\r
1030 DECLARE_APPKEY(uAppKey)
\r
1032 #define DECLARE_APP_FRAME_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd, uAppKey) \
\r
1033 DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \
\r
1034 DECLARE_APPKEY(uAppKey)
\r
1036 template <class T>
\r
1037 class CAppWindowBase
\r
1040 typedef class CAppInfoT< T > CAppInfo;
\r
1042 #ifndef WIN32_PLATFORM_WFSP
\r
1043 SHACTIVATEINFO m_sai; // NoOp on SmartPhones
\r
1044 #endif // WIN32_PLATFORM_WFSP
\r
1046 bool m_bHibernate;
\r
1048 CAppWindowBase< T >() : m_bHibernate(false)
\r
1050 #ifndef WIN32_PLATFORM_WFSP
\r
1051 SHACTIVATEINFO sai = { sizeof(SHACTIVATEINFO) };
\r
1053 #endif // WIN32_PLATFORM_WFSP
\r
1056 // Same as WTL 7.1 AppWizard generated ActivatePreviousInstance + SendMessage WM_COPYDATA
\r
1057 static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR lpstrCmdLine, bool bDialog)
\r
1059 // requires T does DECLARE_APP_FRAME_CLASS, DECLARE_APP_FRAME_CLASS_EX or DECLARE_APP_DLG_CLASS
\r
1060 CFrameWndClassInfo& classInfo = T::GetWndClassInfo();
\r
1062 ATLVERIFY(::LoadString(hInstance, classInfo.m_uCommonResourceID, classInfo.m_szAutoName, sizeof(classInfo.m_szAutoName)/sizeof(classInfo.m_szAutoName[0])) != 0);
\r
1064 classInfo.m_wc.lpszClassName = classInfo.m_szAutoName;
\r
1066 const TCHAR* pszClass = classInfo.m_wc.lpszClassName;
\r
1068 if(NULL == pszClass || '\0' == *pszClass)
\r
1073 const DWORD dRetryInterval = 100;
\r
1074 const int iMaxRetries = 25;
\r
1076 for(int i = 0; i < iMaxRetries; ++i)
\r
1078 HANDLE hMutex = CreateMutex(NULL, FALSE, pszClass);
\r
1080 DWORD dw = GetLastError();
\r
1082 if(NULL == hMutex)
\r
1088 case ERROR_INVALID_HANDLE:
\r
1089 // A non-mutext object with this name already exists.
\r
1090 hr = E_INVALIDARG;
\r
1093 // This should never happen...
\r
1100 // If the mutex already exists, then there should be another instance running
\r
1101 if(dw == ERROR_ALREADY_EXISTS)
\r
1103 CloseHandle(hMutex);
\r
1107 hwnd = FindWindow(NULL, pszClass);
\r
1109 hwnd = FindWindow(pszClass, NULL);
\r
1113 Sleep(dRetryInterval);
\r
1118 // Transmit our params to previous instance
\r
1119 if (lpstrCmdLine && *lpstrCmdLine)
\r
1121 COPYDATASTRUCT cd = { NULL, sizeof(TCHAR) * (wcslen(lpstrCmdLine) + 1), (PVOID)lpstrCmdLine };
\r
1122 ::SendMessage(hwnd, WM_COPYDATA, NULL, (LPARAM)&cd);
\r
1124 // Set the previous instance as the foreground window
\r
1125 if(0 != SetForegroundWindow(reinterpret_cast<HWND>(reinterpret_cast<ULONG>(hwnd) | 0x1)))
\r
1137 // Operations overriden in derived class
\r
1138 bool AppHibernate(bool /*bHibernate*/)
\r
1143 bool AppNewInstance(LPCTSTR /*lpstrCmdLine*/)
\r
1152 #ifdef WIN32_PLATFORM_WFSP
\r
1153 void AppBackKey()
\r
1155 ::SHNavigateBack();
\r
1159 // Message map and handlers
\r
1160 BEGIN_MSG_MAP(CAppWindowBase)
\r
1161 MESSAGE_HANDLER(WM_ACTIVATE, OnActivate)
\r
1162 #ifdef WIN32_PLATFORM_WFSP
\r
1163 MESSAGE_HANDLER(WM_HOTKEY, OnHotKey)
\r
1165 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
\r
1166 #endif // WIN32_PLATFORM_WFSP
\r
1167 MESSAGE_HANDLER(WM_HIBERNATE, OnHibernate)
\r
1168 MESSAGE_HANDLER(WM_COPYDATA, OnNewInstance)
\r
1169 MESSAGE_HANDLER(WM_CLOSE, OnClose)
\r
1172 LRESULT OnActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
\r
1174 T* pT = static_cast<T*>(this);
\r
1176 m_bHibernate = pT->AppHibernate(false);
\r
1177 #ifndef WIN32_PLATFORM_WFSP
\r
1178 ::SHHandleWMActivate(pT->m_hWnd, wParam, lParam, &m_sai, 0);
\r
1182 #endif // WIN32_PLATFORM_WFSP
\r
1183 return bHandled = FALSE;
\r
1186 #ifdef WIN32_PLATFORM_WFSP
\r
1187 // SmartPhone VK_TBACK key standard management
\r
1188 LRESULT OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
\r
1190 T* pT = static_cast<T*>(this);
\r
1191 const UINT uModif = (UINT)LOWORD(lParam);
\r
1192 const UINT uVirtKey = (UINT)HIWORD(lParam);
\r
1193 if(uVirtKey == VK_TBACK)
\r
1194 if (AtlIsEditFocus())
\r
1195 ::SHSendBackToFocusWindow(uMsg, wParam, lParam);
\r
1196 else if (uModif & MOD_KEYUP)
\r
1201 #else // !WIN32_PLATFORM_WFSP
\r
1202 // PPC SIP handling
\r
1203 LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
\r
1205 T* pT = static_cast<T*>(this);
\r
1207 return ::SHHandleWMSettingChange(pT->m_hWnd, wParam, lParam, &m_sai);
\r
1209 #endif // !WIN32_PLATFORM_WFSP
\r
1211 LRESULT OnHibernate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
\r
1213 T* pT = static_cast<T*>(this);
\r
1214 return m_bHibernate = pT->AppHibernate(true);
\r
1217 LRESULT OnNewInstance(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
\r
1219 T* pT = static_cast<T*>(this);
\r
1220 PCOPYDATASTRUCT pcds = (PCOPYDATASTRUCT)lParam;
\r
1221 return pT->AppNewInstance((LPCTSTR)pcds->lpData);
\r
1224 LRESULT OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
\r
1226 T* pT = static_cast<T*>(this);
\r
1234 ///////////////////////////////////////////////////////////////////////////////
\r
1235 // CAppWindow - PPC/SmartPhone "well-behaved" application window class
\r
1237 template <class T>
\r
1238 class CAppWindow : public CAppWindowBase< T >
\r
1241 // Same as WTL 7.1 AppWizard generated Run + lpstrCmdLine in CreateEx
\r
1242 static int AppRun(LPTSTR lpstrCmdLine = NULL, int nCmdShow = SW_SHOWNORMAL)
\r
1244 CMessageLoop theLoop;
\r
1245 _Module.AddMessageLoop(&theLoop);
\r
1249 if(wndMain.CreateEx(NULL, NULL, 0, 0, lpstrCmdLine) == NULL)
\r
1251 ATLTRACE2(atlTraceUI, 0, _T("Main window creation failed!\n"));
\r
1255 wndMain.ShowWindow(nCmdShow);
\r
1257 int nRet = theLoop.Run();
\r
1259 _Module.RemoveMessageLoop();
\r
1263 static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR lpstrCmdLine)
\r
1265 return CAppWindowBase< T >::ActivatePreviousInstance(hInstance, lpstrCmdLine, false);
\r
1270 #ifndef _WTL_CE_NO_DIALOGS
\r
1272 ///////////////////////////////////////////////////////////////////////////////
\r
1273 // CAppDialog - PPC/SmartPhone "well-behaved" dialog application class
\r
1275 // Macro for declaring dialog WNDCLASS and AppKey
\r
1276 #define DECLARE_APP_DLG_CLASS(WndClassName, uCommonResourceID, uAppKey) \
\r
1277 static WTL::CFrameWndClassInfo& GetWndClassInfo() \
\r
1279 static WTL::CFrameWndClassInfo wc = \
\r
1281 { 0, (WNDPROC)StartDialogProc, \
\r
1282 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName }, \
\r
1283 NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \
\r
1287 DECLARE_APPKEY(uAppKey)
\r
1289 template <class T>
\r
1290 class CAppDialog : public CAppWindowBase< T >
\r
1293 static int AppRun(LPTSTR lpstrCmdLine = NULL, int nCmdShow = SW_SHOWNORMAL)
\r
1295 CMessageLoop theLoop;
\r
1296 _Module.AddMessageLoop(&theLoop);
\r
1300 if(dlgMain.Create(NULL, (LPARAM)lpstrCmdLine) == NULL)
\r
1302 ATLTRACE2(atlTraceUI, 0, _T("Main dialog creation failed!\n"));
\r
1306 dlgMain.ShowWindow(nCmdShow);
\r
1308 int nRet = theLoop.Run();
\r
1310 _Module.RemoveMessageLoop();
\r
1314 static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR lpstrCmdLine)
\r
1316 return CAppWindowBase< T >::ActivatePreviousInstance(hInstance, lpstrCmdLine, true);
\r
1320 // PPC/SmartPhone standard application dialogs
\r
1322 #ifdef WIN32_PLATFORM_WFSP
\r
1323 #define WTL_APP_SHIDIF WTL_SP_SHIDIF
\r
1325 #define WTL_APP_SHIDIF WTL_STD_SHIDIF
\r
1328 ///////////////////////////////////////////////////////////////////////////////
\r
1329 // CAppStdDialogImplBase - Base implementation of standard application dialogs
\r
1331 template <class T, class TImplBase, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false>
\r
1332 class ATL_NO_VTABLE CAppStdDialogImplBase :
\r
1333 public TImplBase,
\r
1334 public CAppDialog< T >
\r
1339 void StdCloseDialog(int nVal)
\r
1341 T* pT = static_cast<T*>(this);
\r
1342 if (nVal != IDCANCEL)
\r
1344 if (t_bModal == false)
\r
1346 pT->DestroyWindow();
\r
1347 ::PostQuitMessage(nVal);
\r
1350 ::EndDialog(pT->m_hWnd, nVal);
\r
1353 BEGIN_MSG_MAP(CAppStdDialogImplBase)
\r
1354 MESSAGE_HANDLER(WM_CLOSE, OnSystemClose)
\r
1355 CHAIN_MSG_MAP(TImplBase)
\r
1356 CHAIN_MSG_MAP(CAppDialog< T >)
\r
1359 LRESULT OnSystemClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
\r
1361 T* pT = static_cast<T*>(this);
\r
1362 pT->StdCloseDialog(IDCANCEL);
\r
1367 ///////////////////////////////////////////////////////////////////////////////
\r
1368 // CAppStdDialogImpl - Implementation of standard application dialog
\r
1370 template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false>
\r
1371 class ATL_NO_VTABLE CAppStdDialogImpl :
\r
1372 public CAppStdDialogImplBase<T, CStdDialogImpl<T, t_shidiFlags, t_bModal>, t_shidiFlags, t_bModal>
\r
1375 ///////////////////////////////////////////////////////////////////////////////
\r
1376 // CAppStdDialogResizeImpl - implementation of orientation resizing standard application dialog
\r
1378 template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false>
\r
1379 class ATL_NO_VTABLE CAppStdDialogResizeImpl :
\r
1380 public CAppStdDialogImplBase<T, CStdDialogResizeImpl<T, t_shidiFlags, t_bModal>, t_shidiFlags, t_bModal>
\r
1383 #ifndef _ATL_NO_HOSTING
\r
1384 ///////////////////////////////////////////////////////////////////////////////
\r
1385 // CAppStdAxDialogImpl - Implementation of standard application AxDialog
\r
1387 template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false>
\r
1388 class ATL_NO_VTABLE CAppStdAxDialogImpl :
\r
1389 public CAppStdDialogImplBase<T, CStdAxDialogImpl<T, t_shidiFlags, t_bModal>, t_shidiFlags, t_bModal>
\r
1392 ///////////////////////////////////////////////////////////////////////////////
\r
1393 // CAppStdAxDialogResizeImpl - implementation of orientation resizing standard application AxDialog
\r
1395 template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false>
\r
1396 class ATL_NO_VTABLE CAppStdAxDialogResizeImpl :
\r
1397 public CAppStdDialogImplBase<T, CStdAxDialogResizeImpl<T, t_shidiFlags, t_bModal>, t_shidiFlags, t_bModal>
\r
1399 #endif // _ATL_NO_HOSTING
\r
1401 #if defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC)
\r
1402 ///////////////////////////////////////////////////////////////////////////////
\r
1403 // CAppStdOrientedDialogImpl - implementation of oriented PPC standard application dialog
\r
1405 template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false>
\r
1406 class ATL_NO_VTABLE CAppStdOrientedDialogImpl :
\r
1407 public CAppStdDialogImplBase<T, CStdOrientedDialogImpl<T, t_shidiFlags, t_bModal>, t_shidiFlags, t_bModal>
\r
1410 #ifndef _ATL_NO_HOSTING
\r
1411 ///////////////////////////////////////////////////////////////////////////////
\r
1412 // CAppStdAxOrientedDialogImpl - implementation of oriented PPC standard application AxDialog
\r
1414 template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false>
\r
1415 class ATL_NO_VTABLE CAppStdAxOrientedDialogImpl :
\r
1416 public CAppStdDialogImplBase<T, CStdAxOrientedDialogImpl<T, t_shidiFlags, t_bModal>, t_shidiFlags, t_bModal>
\r
1418 #endif // _ATL_NO_HOSTING
\r
1420 #endif // defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC)
\r
1422 #endif // _WTL_CE_NO_DIALOGS
\r
1424 #endif // _WTL_CE_NO_APPWINDOW
\r
1427 // --- Full screen support ---
\r
1429 #ifndef _WTL_CE_NO_FULLSCREEN
\r
1431 ///////////////////////////////////////////////////////////////////////////////
\r
1432 // CFullScreenFrame - full screen frame implementation
\r
1434 template <class T, bool t_bHasSip = true>
\r
1435 class CFullScreenFrame
\r
1438 bool m_bFullScreen;
\r
1440 CFullScreenFrame() : m_bFullScreen(false)
\r
1444 void SetFullScreen(bool bFull)
\r
1446 m_bFullScreen = bFull;
\r
1447 ShowTaskBar(!bFull, false);
\r
1448 ShowMenuBar(!bFull);
\r
1451 // Manage TaskBar for modal dialogs and property sheets
\r
1452 template <class D>
\r
1453 int FSDoModal(D& dlg)
\r
1455 T* pT = static_cast<T*>(this);
\r
1456 pT; // avoid level 4 warning
\r
1457 ATLASSERT(pT->IsWindow());
\r
1458 if (m_bFullScreen) // Show taskbar if hidden
\r
1459 ShowTaskBar(true, false);
\r
1460 int iRet = dlg.DoModal();
\r
1461 if (m_bFullScreen) // Hide taskbar if restored
\r
1462 ShowTaskBar(false);
\r
1467 void ShowMenuBar(bool bShow)
\r
1469 T* pT = static_cast<T*>(this);
\r
1470 ATLASSERT(pT->IsWindow());
\r
1471 ATL::CWindow MenuBar = pT->m_hWndCECommandBar;
\r
1472 ATLASSERT(MenuBar.IsWindow());
\r
1473 MenuBar.ShowWindow(bShow ? SW_SHOWNORMAL : SW_HIDE);
\r
1474 pT->SizeToMenuBar();
\r
1477 void ShowTaskBar(bool bShow, bool bRepaint = true)
\r
1479 T* pT = static_cast<T*>(this);
\r
1480 ATLASSERT(pT->IsWindow());
\r
1481 RECT rect = { 0 };
\r
1482 SystemParametersInfo(SPI_GETWORKAREA, NULL, &rect, FALSE);
\r
1486 #ifdef WIN32_PLATFORM_PSPC // Pocket PC code
\r
1487 UINT uShow = t_bHasSip ? SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON : SHFS_SHOWTASKBAR | SHFS_HIDESIPBUTTON;
\r
1488 SHFullScreen(pT->m_hWnd, bShow ? uShow : SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON);
\r
1489 #elif _WIN32_WCE > 0x500 // Smartphone 2005 code
\r
1490 SHFullScreen(pT->m_hWnd, bShow ? SHFS_SHOWTASKBAR : SHFS_HIDETASKBAR);
\r
1491 #else // Smartphone 2003
\r
1492 HWND hTaskBar = FindWindow(_T("tray"), NULL);
\r
1493 ATLASSERT(::IsWindow(hTaskBar));
\r
1494 ::ShowWindow(hTaskBar, bShow ? SW_SHOW : SW_HIDE);
\r
1495 #endif // WIN32_PLATFORM_PSPC
\r
1497 pT->MoveWindow(&rect, bRepaint);
\r
1500 // Message map and handler
\r
1501 BEGIN_MSG_MAP(CFullScreenFrame)
\r
1502 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
\r
1503 MESSAGE_HANDLER(WM_ACTIVATE, OnActivate)
\r
1506 LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
\r
1508 #ifndef SETTINGCHANGE_RESET // not defined for PPC 2002
\r
1509 #define SETTINGCHANGE_RESET SPI_SETWORKAREA
\r
1511 if (m_bFullScreen && (wParam & SETTINGCHANGE_RESET))
\r
1512 SetFullScreen(m_bFullScreen);
\r
1513 return bHandled = FALSE;
\r
1516 LRESULT OnActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
\r
1518 if (m_bFullScreen)
\r
1520 ShowTaskBar(!wParam);
\r
1521 ShowMenuBar(!wParam);
\r
1523 return bHandled = FALSE;
\r
1527 #endif // _WTL_CE_NO_FULLSCREEN
\r
1530 // --- WinCE zoom support ---
\r
1532 #ifndef _WTL_CE_NO_ZOOMSCROLL
\r
1534 ///////////////////////////////////////////////////////////////////////////////
\r
1535 // CZoomScrollImpl - WinCE zooming implementation on top of CScrollImpl
\r
1537 template <class T>
\r
1538 class CZoomScrollImpl: public CScrollImpl< T >
\r
1542 _WTYPES_NS::CSize m_sizeTrue;
\r
1546 CZoomScrollImpl() : m_sizeTrue(0), m_fzoom(1.)
\r
1549 // Zoom operations and access
\r
1550 void SetZoomScrollSize(_WTYPES_NS::CSize sizeTrue, double fzoom = 1., BOOL bRedraw = TRUE)
\r
1552 ATLASSERT(fzoom > 0.);
\r
1553 m_sizeTrue = sizeTrue;
\r
1556 CScrollImpl< T >::SetScrollSize(sizeTrue / fzoom, bRedraw);
\r
1559 void SetZoomScrollSize(int cx, int cy, double fzoom=1., BOOL bRedraw = TRUE)
\r
1561 SetZoomScrollSize(_WTYPES_NS::CSize(cx, cy), fzoom, bRedraw);
\r
1564 void SetZoom(double fzoom, BOOL bRedraw = TRUE)
\r
1566 _WTYPES_NS::CPoint ptCenter = WndtoTrue(m_sizeClient / 2);
\r
1567 _WTYPES_NS::CSize sizePage = GetScrollPage();
\r
1568 _WTYPES_NS::CSize sizeLine = GetScrollLine();
\r
1570 SetZoomScrollSize(GetScrollSize(), fzoom, bRedraw);
\r
1572 SetScrollLine(sizeLine);
\r
1573 SetScrollPage(sizePage);
\r
1574 _WTYPES_NS::CPoint ptOffset = ptCenter - (m_sizeClient / 2) * fzoom;
\r
1575 SetScrollOffset(ptOffset, bRedraw);
\r
1583 // CScrollImpl overrides
\r
1584 void SetScrollOffset(int x, int y, BOOL bRedraw = TRUE)
\r
1586 CScrollImpl< T >::SetScrollOffset((int)(x / m_fzoom), (int)(y / m_fzoom), bRedraw);
\r
1589 void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE)
\r
1591 SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw);
\r
1594 void GetScrollOffset(POINT& ptOffset)
\r
1596 ptOffset.x = (LONG)(m_ptOffset.x * m_fzoom);
\r
1597 ptOffset.y = (LONG)(m_ptOffset.y * m_fzoom);
\r
1600 void SetScrollSize(int cx, int cy, BOOL bRedraw = TRUE)
\r
1602 SetZoomScrollSize(cx, cy, GetZoom(), bRedraw);
\r
1605 void SetScrollSize(SIZE sizeTrue, BOOL bRedraw = TRUE)
\r
1607 SetZoomScrollSize(sizeTrue, GetZoom(), bRedraw);
\r
1610 void GetScrollSize(SIZE& sizeTrue) const
\r
1612 sizeTrue = m_sizeTrue;
\r
1615 void SetScrollPage(int cxPage, int cyPage)
\r
1617 SetScrollPage(_WTYPES_NS::CSize(cxPage, cyPage));
\r
1620 void SetScrollPage(SIZE sizePage)
\r
1622 CScrollImpl< T >::SetScrollPage(sizePage / m_fzoom);
\r
1625 void GetScrollPage(SIZE& sizePage) const
\r
1627 sizePage = m_sizePage * m_fzoom;
\r
1630 void SetScrollLine(int cxLine, int cyLine)
\r
1632 SetScrollLine(_WTYPES_NS::CSize(cxLine, cyLine));
\r
1635 void SetScrollLine(SIZE sizeLine)
\r
1637 CScrollImpl< T >::SetScrollLine(sizeLine / m_fzoom);
\r
1640 void GetScrollLine(SIZE& sizeLine) const
\r
1642 sizeLine = m_sizeLine * m_fzoom;
\r
1645 // Data access complements
\r
1646 _WTYPES_NS::CSize GetScrollSize()
\r
1648 return m_sizeTrue;
\r
1651 _WTYPES_NS::CSize GetScrollPage()
\r
1653 return m_sizePage * m_fzoom;
\r
1656 _WTYPES_NS::CSize GetScrollLine()
\r
1658 return m_sizeLine * m_fzoom;
\r
1661 _WTYPES_NS::CPoint GetScrollOffset()
\r
1663 return (_WTYPES_NS::CSize)m_ptOffset * m_fzoom;
\r
1666 // Helper coordinate functions
\r
1667 _WTYPES_NS::CPoint WndtoTrue(CPoint ptW)
\r
1669 return (_WTYPES_NS::CSize)ptW * GetZoom() + GetScrollOffset();
\r
1672 void WndtoTrue(LPPOINT aptW, int nPts) // in place coord transformation
\r
1674 for (int i = 0 ; i < nPts ; i++)
\r
1675 aptW[i] = WndtoTrue(aptW[i]);
\r
1678 void WndtoTrue(LPRECT prectW) // in place coord transformation
\r
1680 WndtoTrue((LPPOINT)prectW, 2);
\r
1683 _WTYPES_NS::CPoint TruetoWnd(CPoint ptT)
\r
1685 return (ptT - GetScrollOffset()) / GetZoom();
\r
1688 void TruetoWnd(LPPOINT aptT, int nPts) // in place coord transformation
\r
1690 for (int i = 0 ; i < nPts ; i++)
\r
1691 aptT[i] = TruetoWnd(aptT[i]);
\r
1694 void TruetoWnd(LPRECT prectT) // in place coord transformation
\r
1696 TruetoWnd((LPPOINT)prectT, 2);
\r
1699 // Drawing operations : assume adequate setting of data members
\r
1700 BOOL Draw(HBITMAP hbm, HDC hdestDC, DWORD dwROP = SRCCOPY)
\r
1702 CDC memDC = CreateCompatibleDC(hdestDC);
\r
1703 CBitmapHandle bmpOld = memDC.SelectBitmap(hbm);
\r
1704 BOOL bRes = Draw(memDC, hdestDC, dwROP);
\r
1705 memDC.SelectBitmap(bmpOld);
\r
1709 BOOL Draw(HDC hsourceDC, HDC hdestDC, DWORD dwROP = SRCCOPY)
\r
1711 CDCHandle destDC = hdestDC;
\r
1712 destDC.SetViewportOrg(0,0);
\r
1713 _WTYPES_NS::CPoint ptOffset = GetScrollOffset();
\r
1714 _WTYPES_NS::CSize sizeZClient = m_sizeClient * GetZoom();
\r
1715 return destDC.StretchBlt(0, 0, m_sizeClient.cx, m_sizeClient.cy, hsourceDC, ptOffset.x, ptOffset.y, sizeZClient.cx, sizeZClient.cy, dwROP);
\r
1719 BOOL Draw(IImage* pIImage, HDC hdestDC)
\r
1721 CDCHandle destDC = hdestDC;
\r
1722 destDC.SetViewportOrg(0,0);
\r
1723 return SUCCEEDED(pIImage->Draw(destDC, _WTYPES_NS::CRect(-_WTYPES_NS::CPoint(m_ptOffset), m_sizeAll), NULL));
\r
1727 // Message map and handlers
\r
1728 BEGIN_MSG_MAP(CZoomScrollImpl< T >)
\r
1729 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
\r
1730 CHAIN_MSG_MAP(CScrollImpl< T >)
\r
1733 LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
\r
1735 T* pT = static_cast<T*>(this);
\r
1736 ATLASSERT(::IsWindow(pT->m_hWnd));
\r
1737 if ((GetScrollExtendedStyle() & SCRL_ERASEBACKGROUND))
\r
1739 _WTYPES_NS::CRect rect;
\r
1740 pT->GetClientRect(rect);
\r
1741 _WTYPES_NS::CSize sizeClient=rect.Size();
\r
1743 if (m_sizeAll.cx < sizeClient.cx || m_sizeAll.cy < sizeClient.cy)
\r
1745 CDCHandle hdc = (HDC)wParam;
\r
1746 HBRUSH hbr = GetSysColorBrush((int)T::GetWndClassInfo().m_wc.hbrBackground - 1);
\r
1748 if (m_sizeAll.cx < sizeClient.cx)
\r
1750 _WTYPES_NS::CRect rectBG(_WTYPES_NS::CPoint(m_sizeAll.cx, 0), sizeClient);
\r
1751 hdc.FillRect(rectBG, hbr);
\r
1754 if (m_sizeAll.cy < sizeClient.cy)
\r
1756 _WTYPES_NS::CRect rectBG(_WTYPES_NS::CPoint(0, m_sizeAll.cy), sizeClient);
\r
1757 hdc.FillRect(rectBG, hbr);
\r
1770 #endif // _WTL_CE_NO_ZOOMSCROLL
\r
1772 #ifndef _WTL_CE_NO_CONTROLS
\r
1774 // --- PPC bottom TabView control ---
\r
1776 #if defined(__ATLCTRLX_H__) && defined(WIN32_PLATFORM_PSPC)
\r
1778 ///////////////////////////////////////////////////////////////////////////////
\r
1779 // CBottomTabViewImpl
\r
1781 template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>
\r
1782 class ATL_NO_VTABLE CBottomTabViewImpl : public CTabViewImpl<T, TBase, TWinTraits>
\r
1785 DECLARE_WND_CLASS_EX(NULL, 0, COLOR_APPWORKSPACE)
\r
1787 // Implementation overrideables
\r
1788 bool CreateTabControl()
\r
1790 m_tab.Create(m_hWnd, rcDefault, NULL, WS_CHILD | TCS_BOTTOM, 0, m_nTabID);
\r
1792 ATLASSERT(m_tab.m_hWnd != NULL);
\r
1793 if(m_tab.m_hWnd == NULL)
\r
1796 m_tab.SendMessage(CCM_SETVERSION, COMCTL32_VERSION);
\r
1797 m_tab.SetItemExtra(sizeof(TABVIEWPAGE));
\r
1799 T* pT = static_cast<T*>(this);
\r
1800 m_cyTabHeight = pT->CalcTabHeight();
\r
1805 int CalcTabHeight()
\r
1807 int nCount = m_tab.GetItemCount();
\r
1808 TCITEMEXTRA tcix = { 0 };
\r
1809 tcix.tciheader.mask = TCIF_TEXT;
\r
1810 tcix.tciheader.pszText = _T("NS");
\r
1811 int nIndex = m_tab.InsertItem(nCount, tcix);
\r
1813 RECT rect = { 0 };
\r
1814 SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
\r
1815 RECT rcWnd = rect;
\r
1817 m_tab.AdjustRect(FALSE, &rect);
\r
1818 rcWnd.top = rect.bottom;
\r
1819 ::AdjustWindowRectEx(&rcWnd, m_tab.GetStyle(), FALSE, m_tab.GetExStyle());
\r
1820 m_tab.DeleteItem(nIndex);
\r
1822 return rcWnd.bottom - rcWnd.top;
\r
1825 void UpdateLayout()
\r
1828 GetClientRect(&rect);
\r
1830 if(m_tab.IsWindow() && ((m_tab.GetStyle() & WS_VISIBLE) != 0))
\r
1831 m_tab.SetWindowPos(NULL, 0, rect.bottom - m_cyTabHeight, rect.right - rect.left, m_cyTabHeight, SWP_NOZORDER /*| SWP_SHOWWINDOW*/);
\r
1833 if(m_nActivePage != -1)
\r
1834 ::SetWindowPos(GetPageHWND(m_nActivePage), NULL, 0, 0, rect.right - rect.left, rect.bottom - m_cyTabHeight, SWP_NOZORDER);
\r
1839 class CBottomTabView : public CBottomTabViewImpl<CBottomTabView>
\r
1842 DECLARE_WND_CLASS_EX(_T("WTL_BottomTabView"), 0, COLOR_APPWORKSPACE)
\r
1845 #endif // defined(__ATLCTRLX_H__) && defined(WIN32_PLATFORM_PSPC)
\r
1848 // --- PPC/SmartPhone controls ---
\r
1850 ////////////////////////////////////////////////////////////////////////////////
\r
1851 // These are wrapper classes for the Pocket PC 2002/2003 and SmartPhone 2003 controls
\r
1852 // To implement a window based on a control, use following:
\r
1853 // Example: Implementing a window based on a Html control
\r
1855 // class CMyHtml : CWindowImpl<CMyHtml, CHtmlCtrl>
\r
1858 // BEGIN_MSG_MAP(CMyHtml)
\r
1859 // // put your message handler entries here
\r
1862 ///////////////////////////////////////////////////////////////////////////////
\r
1864 ///////////////////////////////////////////////////////////////////////////////
\r
1867 template <class TBase>
\r
1868 class CHtmlCtrlT : public TBase
\r
1872 CHtmlCtrlT(HWND hWnd = NULL) : TBase(hWnd)
\r
1875 CHtmlCtrlT< TBase >& operator =(HWND hWnd)
\r
1881 HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
\r
1882 DWORD dwStyle = 0, DWORD dwExStyle = 0,
\r
1883 ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
\r
1885 HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
\r
1886 ATLASSERT(hWnd != NULL); // Did you remember to call InitHTMLControl(hInstance) ??
\r
1891 static LPCTSTR GetWndClassName()
\r
1896 #if (_WIN32_WCE >= 400)
\r
1897 void AddStyle(LPCWSTR pszStyle)
\r
1899 ATLASSERT(::IsWindow(m_hWnd));
\r
1900 ::SendMessage(m_hWnd, DTM_ADDSTYLE, 0, (LPARAM)pszStyle);
\r
1902 #endif // (_WIN32_WCE >= 400)
\r
1904 void AddText(BOOL bPlainText, LPCSTR pszText)
\r
1906 ATLASSERT(::IsWindow(m_hWnd));
\r
1907 ::SendMessage(m_hWnd, DTM_ADDTEXT, (WPARAM)bPlainText, (LPARAM)pszText);
\r
1910 void AddHTML(LPCSTR pszHTML)
\r
1912 ATLASSERT(::IsWindow(m_hWnd));
\r
1913 ::SendMessage(m_hWnd, DTM_ADDTEXT, (WPARAM)FALSE, (LPARAM)pszHTML);
\r
1916 void AddText(BOOL bPlainText, LPCWSTR pszText)
\r
1918 ATLASSERT(::IsWindow(m_hWnd));
\r
1919 ::SendMessage(m_hWnd, DTM_ADDTEXTW, (WPARAM)bPlainText, (LPARAM)pszText);
\r
1922 void AddHTML(LPCWSTR pszHTML)
\r
1924 ATLASSERT(::IsWindow(m_hWnd));
\r
1925 ::SendMessage(m_hWnd, DTM_ADDTEXTW, (WPARAM)FALSE, (LPARAM)pszHTML);
\r
1928 void Anchor(LPCSTR pszAnchor)
\r
1930 ATLASSERT(::IsWindow(m_hWnd));
\r
1931 ::SendMessage(m_hWnd, DTM_ANCHOR, 0, (LPARAM)pszAnchor);
\r
1934 void Anchor(LPCWSTR pszAnchor)
\r
1936 ATLASSERT(::IsWindow(m_hWnd));
\r
1937 ::SendMessage(m_hWnd, DTM_ANCHORW, 0, (LPARAM)pszAnchor);
\r
1940 #if (_WIN32_WCE >= 420)
\r
1941 void GetBrowserDispatch(IDispatch** ppDispatch)
\r
1943 ATLASSERT(::IsWindow(m_hWnd));
\r
1944 ATLASSERT(ppDispatch);
\r
1945 ATLASSERT(*ppDispatch==NULL);
\r
1946 ::SendMessage(m_hWnd, DTM_BROWSERDISPATCH, 0, (LPARAM)ppDispatch);
\r
1948 void GetDocumentDispatch(IDispatch** ppDispatch)
\r
1950 ATLASSERT(::IsWindow(m_hWnd));
\r
1951 ATLASSERT(ppDispatch);
\r
1952 ATLASSERT(*ppDispatch==NULL);
\r
1953 ::SendMessage(m_hWnd, DTM_DOCUMENTDISPATCH , 0, (LPARAM)ppDispatch);
\r
1955 #endif // (_WIN32_WCE >= 420)
\r
1959 ATLASSERT(::IsWindow(m_hWnd));
\r
1960 ::SendMessage(m_hWnd, DTM_CLEAR, 0, 0L);
\r
1963 void EnableClearType(BOOL bEnable = TRUE)
\r
1965 ATLASSERT(::IsWindow(m_hWnd));
\r
1966 ::SendMessage(m_hWnd, DTM_ENABLECLEARTYPE, 0, (LPARAM)bEnable);
\r
1969 void EnableContextMenu(BOOL bEnable = TRUE)
\r
1971 ATLASSERT(::IsWindow(m_hWnd));
\r
1972 ::SendMessage(m_hWnd, DTM_ENABLECONTEXTMENU, 0, (LPARAM)bEnable);
\r
1975 void EnableScripting(BOOL bEnable = TRUE)
\r
1977 ATLASSERT(::IsWindow(m_hWnd));
\r
1978 ::SendMessage(m_hWnd, DTM_ENABLESCRIPTING, 0, (LPARAM)bEnable);
\r
1981 void EnableShrink(BOOL bEnable = TRUE)
\r
1983 ATLASSERT(::IsWindow(m_hWnd));
\r
1984 ::SendMessage(m_hWnd, DTM_ENABLESHRINK, 0, (LPARAM)bEnable);
\r
1987 void EndOfSource()
\r
1989 ATLASSERT(::IsWindow(m_hWnd));
\r
1990 ::SendMessage(m_hWnd, DTM_ENDOFSOURCE, 0, 0L);
\r
1993 void ImageFail(DWORD dwCookie)
\r
1995 ATLASSERT(::IsWindow(m_hWnd));
\r
1996 ::SendMessage(m_hWnd, DTM_IMAGEFAIL, 0, (LPARAM)dwCookie);
\r
1999 int GetLayoutHeight() const
\r
2001 ATLASSERT(::IsWindow(m_hWnd));
\r
2002 return (int)::SendMessage(m_hWnd, DTM_LAYOUTHEIGHT, 0, 0L);
\r
2005 int GetLayoutWidth() const
\r
2007 ATLASSERT(::IsWindow(m_hWnd));
\r
2008 return (int)::SendMessage(m_hWnd, DTM_LAYOUTWIDTH, 0, 0L);
\r
2011 void Navigate(LPCTSTR pstrURL, UINT uFlags = 0)
\r
2013 ATLASSERT(::IsWindow(m_hWnd));
\r
2014 ATLASSERT(pstrURL);
\r
2015 ::SendMessage(m_hWnd, DTM_NAVIGATE, (WPARAM)uFlags, (LPARAM)pstrURL);
\r
2020 ATLASSERT(::IsWindow(m_hWnd));
\r
2021 ::SendMessage(m_hWnd, DTM_SELECTALL, 0, 0L);
\r
2024 void SetImage(INLINEIMAGEINFO* pImageInfo)
\r
2026 ATLASSERT(::IsWindow(m_hWnd));
\r
2027 ATLASSERT(pImageInfo);
\r
2028 ::SendMessage(m_hWnd, DTM_SETIMAGE, 0, (LPARAM)pImageInfo);
\r
2031 void ZoomLevel(int iLevel)
\r
2033 ATLASSERT(::IsWindow(m_hWnd));
\r
2034 ::SendMessage(m_hWnd, DTM_ZOOMLEVEL, 0, (LPARAM)iLevel);
\r
2037 #if (_WIN32_WCE >= 400)
\r
2040 ATLASSERT(::IsWindow(m_hWnd));
\r
2041 ::SendMessage(m_hWnd, DTM_STOP, 0, 0L);
\r
2043 #endif // (_WIN32_WCE >= 400)
\r
2045 void GetScriptDispatch(IDispatch** ppDispatch)
\r
2047 ATLASSERT(::IsWindow(m_hWnd));
\r
2048 ATLASSERT(ppDispatch);
\r
2049 ATLASSERT(*ppDispatch==NULL);
\r
2050 ::SendMessage(m_hWnd, DTM_SCRIPTDISPATCH, 0, (LPARAM)ppDispatch);
\r
2054 typedef CHtmlCtrlT<ATL::CWindow> CHtmlCtrl;
\r
2057 #ifdef WIN32_PLATFORM_PSPC
\r
2059 ///////////////////////////////////////////////////////////////////////////////
\r
2062 template <class TBase>
\r
2063 class CRichInkCtrlT : public TBase
\r
2067 CRichInkCtrlT(HWND hWnd = NULL) : TBase(hWnd)
\r
2070 CRichInkCtrlT< TBase >& operator =(HWND hWnd)
\r
2076 HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
\r
2077 DWORD dwStyle = 0, DWORD dwExStyle = 0,
\r
2078 ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
\r
2080 HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
\r
2081 ATLASSERT(hWnd != NULL); // Did you remember to call InitRichInkDLL() ??
\r
2086 static LPCTSTR GetWndClassName()
\r
2088 return WC_RICHINK;
\r
2091 BOOL CanPaste(UINT uFormat = 0) const
\r
2093 ATLASSERT(::IsWindow(m_hWnd));
\r
2094 return (BOOL)::SendMessage(m_hWnd, EM_CANPASTE, (WPARAM)uFormat, 0L);
\r
2097 BOOL CanRedo() const
\r
2099 ATLASSERT(::IsWindow(m_hWnd));
\r
2100 return (BOOL)::SendMessage(m_hWnd, EM_CANREDO, 0, 0L);
\r
2103 BOOL CanUndo() const
\r
2105 ATLASSERT(::IsWindow(m_hWnd));
\r
2106 return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L);
\r
2109 void ClearAll(BOOL bRepaint = TRUE) const
\r
2111 ATLASSERT(::IsWindow(m_hWnd));
\r
2112 ::SendMessage(m_hWnd, EM_CLEARALL, (WPARAM)bRepaint, 0L);
\r
2115 BOOL GetModify() const
\r
2117 ATLASSERT(::IsWindow(m_hWnd));
\r
2118 return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L);
\r
2121 UINT GetPageStyle() const
\r
2123 ATLASSERT(::IsWindow(m_hWnd));
\r
2124 return (UINT)::SendMessage(m_hWnd, EM_GETPAGESTYLE, 0, 0L);
\r
2127 UINT GetPenMode() const
\r
2129 ATLASSERT(::IsWindow(m_hWnd));
\r
2130 return (UINT)::SendMessage(m_hWnd, EM_GETPENMODE, 0, 0L);
\r
2133 UINT GetViewStyle() const
\r
2135 ATLASSERT(::IsWindow(m_hWnd));
\r
2136 return (UINT)::SendMessage(m_hWnd, EM_GETVIEW, 0, 0L);
\r
2139 UINT GetWrapMode() const
\r
2141 ATLASSERT(::IsWindow(m_hWnd));
\r
2142 return (UINT)::SendMessage(m_hWnd, EM_GETWRAPMODE, 0, 0L);
\r
2145 UINT GetZoomPercent() const
\r
2147 ATLASSERT(::IsWindow(m_hWnd));
\r
2148 return (UINT)::SendMessage(m_hWnd, EM_GETZOOMPERCENT, 0, 0L);
\r
2151 void InsertLinks(LPWSTR lpString, int cchLength = -1)
\r
2153 ATLASSERT(::IsWindow(m_hWnd));
\r
2154 if(cchLength == -1)
\r
2155 cchLength = lstrlen(lpString);
\r
2156 ::SendMessage(m_hWnd, EM_INSERTLINKS, (WPARAM)cchLength, (LPARAM)lpString);
\r
2161 ATLASSERT(::IsWindow(m_hWnd));
\r
2162 ::SendMessage(m_hWnd, EM_REDOEVENT, 0, 0L);
\r
2165 UINT SetInkLayer(UINT uLayer)
\r
2167 ATLASSERT(::IsWindow(m_hWnd));
\r
2168 return (UINT)::SendMessage(m_hWnd, EM_SETINKLAYER, (WPARAM)uLayer, 0L);
\r
2171 void SetPageStyle(UINT uStyle)
\r
2173 ATLASSERT(::IsWindow(m_hWnd));
\r
2174 ::SendMessage(m_hWnd, EM_SETPAGESTYLE, (WPARAM)uStyle, 0L);
\r
2177 void SetPenMode(UINT uMode)
\r
2179 ATLASSERT(::IsWindow(m_hWnd));
\r
2180 ::SendMessage(m_hWnd, EM_SETPENMODE, (WPARAM)uMode, 0L);
\r
2183 void SetViewStyle(UINT uStyle)
\r
2185 ATLASSERT(::IsWindow(m_hWnd));
\r
2186 ::SendMessage(m_hWnd, EM_SETVIEW, (WPARAM)uStyle, 0L);
\r
2189 void SetViewAttributes(VIEWATTRIBUTES* pAttribs)
\r
2191 ATLASSERT(::IsWindow(m_hWnd));
\r
2192 ATLASSERT(pAttribs);
\r
2193 ::SendMessage(m_hWnd, EM_SETVIEWATTRIBUTES, 0, (LPARAM)pAttribs);
\r
2196 void SetWrapMode(UINT uMode)
\r
2198 ATLASSERT(::IsWindow(m_hWnd));
\r
2199 ::SendMessage(m_hWnd, EM_SETWRAPMODE, (WPARAM)uMode, 0L);
\r
2202 void SetZoomPercent(UINT uPercent)
\r
2204 ATLASSERT(::IsWindow(m_hWnd));
\r
2205 ::SendMessage(m_hWnd, EM_SETZOOMPERCENT, (WPARAM)uPercent, 0L);
\r
2208 LONG StreamIn(UINT uFormat, EDITSTREAM& es)
\r
2210 ATLASSERT(::IsWindow(m_hWnd));
\r
2211 return (LONG)::SendMessage(m_hWnd, EM_STREAMIN, (WPARAM)uFormat, (LPARAM)&es);
\r
2214 LONG StreamOut(UINT uFormat, EDITSTREAM& es)
\r
2216 ATLASSERT(::IsWindow(m_hWnd));
\r
2217 return (LONG)::SendMessage(m_hWnd, EM_STREAMOUT, (WPARAM)uFormat, (LPARAM)&es);
\r
2222 ATLASSERT(::IsWindow(m_hWnd));
\r
2223 ::SendMessage(m_hWnd, EM_UNDOEVENT, 0, 0L);
\r
2226 // Standard EM_xxx messages
\r
2227 DWORD GetSel() const
\r
2229 ATLASSERT(::IsWindow(m_hWnd));
\r
2230 return (DWORD)::SendMessage(m_hWnd, EM_GETSEL, 0, 0L);
\r
2233 void GetSel(int& nStartChar, int& nEndChar) const
\r
2235 ATLASSERT(::IsWindow(m_hWnd));
\r
2236 ::SendMessage(m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar);
\r
2239 void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE)
\r
2241 ATLASSERT(::IsWindow(m_hWnd));
\r
2242 ::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM)bCanUndo, (LPARAM)lpszNewText);
\r
2245 void SetModify(BOOL bModified = TRUE)
\r
2247 ATLASSERT(::IsWindow(m_hWnd));
\r
2248 ::SendMessage(m_hWnd, EM_SETMODIFY, (WPARAM)bModified, 0L);
\r
2251 int GetTextLength() const
\r
2253 ATLASSERT(::IsWindow(m_hWnd));
\r
2254 return (int)::SendMessage(m_hWnd, WM_GETTEXTLENGTH, 0, 0L);
\r
2257 // Clipboard operations
\r
2260 ATLASSERT(::IsWindow(m_hWnd));
\r
2261 ::SendMessage(m_hWnd, WM_CLEAR, 0, 0L);
\r
2266 ATLASSERT(::IsWindow(m_hWnd));
\r
2267 ::SendMessage(m_hWnd, WM_COPY, 0, 0L);
\r
2272 ATLASSERT(::IsWindow(m_hWnd));
\r
2273 ::SendMessage(m_hWnd, WM_CUT, 0, 0L);
\r
2278 ATLASSERT(::IsWindow(m_hWnd));
\r
2279 ::SendMessage(m_hWnd, WM_PASTE, 0, 0L);
\r
2283 typedef CRichInkCtrlT<ATL::CWindow> CRichInkCtrl;
\r
2286 ///////////////////////////////////////////////////////////////////////////////
\r
2289 template <class TBase>
\r
2290 class CInkXCtrlT : public TBase
\r
2294 CInkXCtrlT(HWND hWnd = NULL) : TBase(hWnd)
\r
2297 CInkXCtrlT< TBase >& operator =(HWND hWnd)
\r
2303 HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
\r
2304 DWORD dwStyle = 0, DWORD dwExStyle = 0,
\r
2305 ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
\r
2307 HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
\r
2308 ATLASSERT(hWnd != NULL); // Did you remember to call InitInkX() ??
\r
2313 static LPCTSTR GetWndClassName()
\r
2318 static UINT GetHotRecordingMessage()
\r
2320 return ::RegisterWindowMessage(szHotRecording);
\r
2325 ATLASSERT(::IsWindow(m_hWnd));
\r
2326 ::SendMessage(m_hWnd, IM_CLEARALL, 0, 0L);
\r
2329 int GetData(BYTE* lpBuffer, INT cbBuffer) const
\r
2331 ATLASSERT(::IsWindow(m_hWnd));
\r
2332 ATLASSERT(lpBuffer);
\r
2333 return (int)::SendMessage(m_hWnd, IM_GETDATA, (WPARAM)cbBuffer, (LPARAM)lpBuffer);
\r
2336 int GetDataLen() const
\r
2338 ATLASSERT(::IsWindow(m_hWnd));
\r
2339 return (int)::SendMessage(m_hWnd, IM_GETDATALEN, 0, 0L);
\r
2342 CRichInkCtrl GetRichInk() const
\r
2344 ATLASSERT(::IsWindow(m_hWnd));
\r
2345 return (HWND)::SendMessage(m_hWnd, IM_GETRICHINK, 0, 0L);
\r
2348 BOOL IsRecording() const
\r
2350 ATLASSERT(::IsWindow(m_hWnd));
\r
2351 return (BOOL)::SendMessage(m_hWnd, IM_RECORDING, 0, 0L);
\r
2356 ATLASSERT(::IsWindow(m_hWnd));
\r
2357 ::SendMessage(m_hWnd, IM_REINIT, 0, 0L);
\r
2360 void SetData(const BYTE* lpInkData, INT cbInkData)
\r
2362 ATLASSERT(::IsWindow(m_hWnd));
\r
2363 ATLASSERT(lpInkData);
\r
2364 ::SendMessage(m_hWnd, IM_SETDATA, (WPARAM)cbInkData, (LPARAM)lpInkData);
\r
2369 ATLASSERT(::IsWindow(m_hWnd));
\r
2370 ::SendMessage(m_hWnd, IM_VOICE_PLAY, 0, 0L);
\r
2373 BOOL IsVoicePlaying() const
\r
2375 ATLASSERT(::IsWindow(m_hWnd));
\r
2376 return (BOOL)::SendMessage(m_hWnd, IM_VOICE_PLAYING, 0, 0L);
\r
2379 BOOL VoiceRecord()
\r
2381 ATLASSERT(::IsWindow(m_hWnd));
\r
2382 return (BOOL)::SendMessage(m_hWnd, IM_VOICE_RECORD, 0, 0L);
\r
2387 ATLASSERT(::IsWindow(m_hWnd));
\r
2388 ::SendMessage(m_hWnd, IM_VOICE_STOP, 0, 0L);
\r
2391 void ShowVoiceBar(BOOL bShow = TRUE)
\r
2393 ATLASSERT(::IsWindow(m_hWnd));
\r
2394 ::SendMessage(m_hWnd, IM_VOICEBAR, (WPARAM)bShow, 0L);
\r
2398 typedef CInkXCtrlT<ATL::CWindow> CInkXCtrl;
\r
2400 #endif // WIN32_PLATFORM_PSPC
\r
2403 ///////////////////////////////////////////////////////////////////////////////
\r
2404 // CVoiceRecorderCtrl
\r
2406 template <class TBase>
\r
2407 class CVoiceRecorderCtrlT : public TBase
\r
2411 CVoiceRecorderCtrlT(HWND hWnd = NULL) : TBase(hWnd)
\r
2414 CVoiceRecorderCtrlT< TBase >& operator =(HWND hWnd)
\r
2420 HWND Create(HWND hWndParent, const POINT pt, LPTSTR pstrFileName, UINT nID, DWORD dwStyle = 0)
\r
2422 ATLASSERT(pstrFileName != NULL);
\r
2423 CM_VOICE_RECORDER cmvr = { 0 };
\r
2424 cmvr.cb = sizeof(CM_VOICE_RECORDER);
\r
2425 cmvr.dwStyle = dwStyle;
\r
2428 cmvr.hwndParent = hWndParent;
\r
2430 cmvr.lpszRecordFileName = pstrFileName;
\r
2431 m_hWnd = VoiceRecorder_Create(&cmvr);
\r
2435 HWND Create(LPCM_VOICE_RECORDER pAttribs)
\r
2437 ATLASSERT(pAttribs);
\r
2438 m_hWnd = VoiceRecorder_Create(pAttribs);
\r
2445 ATLASSERT(::IsWindow(m_hWnd));
\r
2446 ::SendMessage(m_hWnd, VRM_RECORD, 0, 0L);
\r
2451 ATLASSERT(::IsWindow(m_hWnd));
\r
2452 ::SendMessage(m_hWnd, VRM_PLAY, 0, 0L);
\r
2457 ATLASSERT(::IsWindow(m_hWnd));
\r
2458 ::SendMessage(m_hWnd, VRM_STOP, 0, 0L);
\r
2463 ATLASSERT(::IsWindow(m_hWnd));
\r
2464 ::SendMessage(m_hWnd, VRM_CANCEL, 0, 0L);
\r
2469 ATLASSERT(::IsWindow(m_hWnd));
\r
2470 ::SendMessage(m_hWnd, VRM_OK, 0, 0L);
\r
2474 typedef CVoiceRecorderCtrlT<ATL::CWindow> CVoiceRecorderCtrl;
\r
2477 #ifdef WIN32_PLATFORM_PSPC
\r
2479 ///////////////////////////////////////////////////////////////////////////////
\r
2482 template <class TBase>
\r
2483 class CDocListCtrlT : public TBase
\r
2487 DOCLISTCREATE m_dlc;
\r
2488 TCHAR m_szPath[MAX_PATH];
\r
2491 CDocListCtrlT(HWND hWnd = NULL) : TBase(hWnd)
\r
2494 CDocListCtrlT< TBase >& operator =(HWND hWnd)
\r
2500 HWND Create(HWND hWndParent, WORD wId, LPCTSTR pszFolder = NULL, LPCTSTR pstrFilter = NULL,
\r
2501 WORD wFilterIndex = 0, DWORD dwFlags = DLF_SHOWEXTENSION)
\r
2503 ATLASSERT(pstrFilter != NULL); // It seems to need a filter badly!!
\r
2504 ::ZeroMemory(&m_dlc, sizeof(DOCLISTCREATE));
\r
2505 ::ZeroMemory(m_szPath, sizeof(m_szPath));
\r
2506 if(pszFolder != NULL)
\r
2507 ::lstrcpyn(m_szPath, pszFolder, MAX_PATH - 1);
\r
2508 m_dlc.dwStructSize = sizeof(DOCLISTCREATE);
\r
2509 m_dlc.hwndParent = hWndParent;
\r
2510 m_dlc.pszFolder = m_szPath;
\r
2511 m_dlc.pstrFilter = pstrFilter;
\r
2512 m_dlc.wFilterIndex = wFilterIndex;
\r
2514 m_dlc.dwFlags = dwFlags;
\r
2515 m_hWnd = DocList_Create(&m_dlc);
\r
2519 HWND Create(DOCLISTCREATE* pDlc)
\r
2522 m_hWnd = DocList_Create(&m_dlc);
\r
2529 ATLASSERT(::IsWindow(m_hWnd));
\r
2530 ::SendMessage(m_hWnd, DLM_DELETESEL, 0, 0L);
\r
2533 void DisableUpdates()
\r
2535 ATLASSERT(::IsWindow(m_hWnd));
\r
2536 ::SendMessage(m_hWnd, DLM_DISABLEUPDATES, 0, 0L);
\r
2539 void EnableUpdates()
\r
2541 ATLASSERT(::IsWindow(m_hWnd));
\r
2542 ::SendMessage(m_hWnd, DLM_ENABLEUPDATES, 0, 0L);
\r
2545 int GetFilterIndex() const
\r
2547 ATLASSERT(::IsWindow(m_hWnd));
\r
2548 return (int)::SendMessage(m_hWnd, DLM_GETFILTERINDEX, 0, 0L);
\r
2551 int GetItemCount() const
\r
2553 ATLASSERT(::IsWindow(m_hWnd));
\r
2554 return (int)::SendMessage(m_hWnd, DLM_GETITEMCOUNT, 0, 0L);
\r
2557 int GetNextItem(int iIndex, DWORD dwRelation = LVNI_ALL) const
\r
2559 ATLASSERT(::IsWindow(m_hWnd));
\r
2560 return (int)::SendMessage(m_hWnd, DLM_GETNEXTITEM, (WPARAM)iIndex, (LPARAM)dwRelation);
\r
2563 int GetFirstItem(DWORD dwRelation = LVNI_ALL) const
\r
2565 ATLASSERT(::IsWindow(m_hWnd));
\r
2566 return (int)::SendMessage(m_hWnd, DLM_GETNEXTITEM, (WPARAM)-1, (LPARAM)dwRelation);
\r
2569 BOOL GetNextWave(int* pIndex) const
\r
2571 ATLASSERT(::IsWindow(m_hWnd));
\r
2572 ATLASSERT(pIndex);
\r
2573 return (BOOL)::SendMessage(m_hWnd, DLM_GETNEXTWAVE, 0, (LPARAM)pIndex);
\r
2576 BOOL GetPrevWave(int* pIndex) const
\r
2578 ATLASSERT(::IsWindow(m_hWnd));
\r
2579 ATLASSERT(pIndex);
\r
2580 return (BOOL)::SendMessage(m_hWnd, DLM_GETPREVWAVE, 0, (LPARAM)pIndex);
\r
2583 int GetSelCount() const
\r
2585 ATLASSERT(::IsWindow(m_hWnd));
\r
2586 return (int)::SendMessage(m_hWnd, DLM_GETSELCOUNT, 0, 0L);
\r
2589 BOOL GetSelPathName(LPTSTR pstrPath, int cchMax) const
\r
2591 ATLASSERT(::IsWindow(m_hWnd));
\r
2592 ATLASSERT(pstrPath);
\r
2593 return (BOOL)::SendMessage(m_hWnd, DLM_GETSELPATHNAME, (WPARAM)cchMax, (LPARAM)pstrPath);
\r
2596 void ReceiveIR(LPCTSTR pstrPath) const
\r
2598 ATLASSERT(::IsWindow(m_hWnd));
\r
2599 ATLASSERT(pstrPath);
\r
2600 ::SendMessage(m_hWnd, DLM_RECEIVEIR, 0, (LPARAM)pstrPath);
\r
2605 ATLASSERT(::IsWindow(m_hWnd));
\r
2606 ::SendMessage(m_hWnd, DLM_REFRESH, 0, 0L);
\r
2609 BOOL RenameMoveSelectedItems()
\r
2611 ATLASSERT(::IsWindow(m_hWnd));
\r
2612 return (BOOL)::SendMessage(m_hWnd, DLM_RENAMEMOVE, 0, 0L);
\r
2617 ATLASSERT(::IsWindow(m_hWnd));
\r
2618 return (int)::SendMessage(m_hWnd, DLM_SELECTALL, 0, 0L);
\r
2621 HRESULT SelectItem(LPCTSTR pstrPath, BOOL bVisible = TRUE)
\r
2623 ATLASSERT(::IsWindow(m_hWnd));
\r
2624 ATLASSERT(pstrPath);
\r
2625 return (HRESULT)::SendMessage(m_hWnd, DLM_SELECTITEM, (WPARAM)bVisible, (LPARAM)pstrPath);
\r
2628 void SendEMail(LPCTSTR pstrAttachment)
\r
2630 ATLASSERT(::IsWindow(m_hWnd));
\r
2631 ::SendMessage(m_hWnd, DLM_SENDEMAIL, 0, (LPARAM)pstrAttachment);
\r
2634 void SendIR(LPCTSTR pstrPath)
\r
2636 ATLASSERT(::IsWindow(m_hWnd));
\r
2637 ::SendMessage(m_hWnd, DLM_SENDIR, 0, (LPARAM)pstrPath);
\r
2640 HRESULT SetFilterIndex(int iIndex)
\r
2642 ATLASSERT(::IsWindow(m_hWnd));
\r
2643 return (HRESULT)::SendMessage(m_hWnd, DLM_SETFILTERINDEX, (WPARAM)iIndex, 0L);
\r
2646 void SetFolder(LPCTSTR pstrPath)
\r
2648 ATLASSERT(::IsWindow(m_hWnd));
\r
2649 ATLASSERT(pstrPath);
\r
2650 ::SendMessage(m_hWnd, DLM_SETFOLDER, 0, (LPARAM)pstrPath);
\r
2653 BOOL SetItemState(int iIndex, const LVITEM* pItem)
\r
2655 ATLASSERT(::IsWindow(m_hWnd));
\r
2657 return (BOOL)::SendMessage(m_hWnd, DLM_SETITEMSTATE, (WPARAM)iIndex, (LPARAM)pItem);
\r
2660 BOOL SetItemState(int iIndex, UINT uState, UINT uMask)
\r
2662 ATLASSERT(::IsWindow(m_hWnd));
\r
2663 LV_ITEM lvi = { 0 };
\r
2664 lvi.stateMask = uMask;
\r
2665 lvi.state = uState;
\r
2666 return (BOOL)::SendMessage(m_hWnd, DLM_SETITEMSTATE, (WPARAM)iIndex, (LPARAM)&lvi);
\r
2669 void SetOneItem(int iIndex, LPCVOID pPA)
\r
2671 ATLASSERT(::IsWindow(m_hWnd));
\r
2672 ::SendMessage(m_hWnd, DLM_SETONEITEM, (WPARAM)iIndex, (LPARAM)pPA);
\r
2675 void SetSelect(int iIndex)
\r
2677 ATLASSERT(::IsWindow(m_hWnd));
\r
2678 ::SendMessage(m_hWnd, DLM_SETSELECT, (WPARAM)iIndex, 0L);
\r
2681 void SetSelPathName(LPCTSTR pstrPath)
\r
2683 ATLASSERT(::IsWindow(m_hWnd));
\r
2684 ATLASSERT(pstrPath);
\r
2685 ::SendMessage(m_hWnd, DLM_SETSELPATHNAME, 0, (LPARAM)pstrPath);
\r
2688 BOOL SetSortOrder()
\r
2690 ATLASSERT(::IsWindow(m_hWnd));
\r
2691 return (BOOL)::SendMessage(m_hWnd, DLM_SETSORTORDER, 0, 0L);
\r
2696 ATLASSERT(::IsWindow(m_hWnd));
\r
2697 return (HRESULT)::SendMessage(m_hWnd, DLM_UPDATE, 0, 0L);
\r
2700 BOOL ValidateFolder()
\r
2702 ATLASSERT(::IsWindow(m_hWnd));
\r
2703 return (BOOL)::SendMessage(m_hWnd, DLM_VALIDATEFOLDER, 0, 0L);
\r
2707 BOOL GetFirstSelectedWaveFile(int* pIndex, LPTSTR szPath, const size_t cchPath)
\r
2709 ATLASSERT(::IsWindow(m_hWnd));
\r
2710 return DocList_GetFirstSelectedWaveFile(m_hWnd, pIndex, szPath, cchPath);
\r
2713 BOOL GetNextSelectedWaveFile(int* pIndex, LPTSTR szPath, const size_t cchPath)
\r
2715 ATLASSERT(::IsWindow(m_hWnd));
\r
2716 return DocList_GetNextSelectedWaveFile(m_hWnd, pIndex, szPath, cchPath);
\r
2720 typedef CDocListCtrlT<ATL::CWindow> CDocListCtrl;
\r
2722 #endif // WIN32_PLATFORM_PSPC
\r
2725 ///////////////////////////////////////////////////////////////////////////////
\r
2728 template <class TBase>
\r
2729 class CCapEditT : public TBase
\r
2733 CCapEditT(HWND hWnd = NULL) : TBase(hWnd)
\r
2736 CCapEditT< TBase >& operator =(HWND hWnd)
\r
2742 HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
\r
2743 DWORD dwStyle = 0, DWORD dwExStyle = 0,
\r
2744 ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
\r
2746 HWND hWnd = /*TBase*/CWindow::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
\r
2747 ATLASSERT(hWnd != NULL); // Did you remember to call SHInitExtraControls() ??
\r
2752 static LPCTSTR GetWndClassName()
\r
2754 return WC_CAPEDIT;
\r
2758 typedef CCapEditT<WTL::CEdit> CCapEdit;
\r
2760 ///////////////////////////////////////////////////////////////////////////////
\r
2763 #ifndef WIN32_PLATFORM_WFSP // Tooltips not supported on SmartPhone
\r
2765 template <class TBase>
\r
2766 class CTTStaticT : public TBase
\r
2770 CTTStaticT(HWND hWnd = NULL) : TBase(hWnd)
\r
2773 CTTStaticT< TBase >& operator =(HWND hWnd)
\r
2779 HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
\r
2780 DWORD dwStyle = 0, DWORD dwExStyle = 0,
\r
2781 ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
\r
2783 HWND hWnd = TBase::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
\r
2784 ATLASSERT(hWnd != NULL); // Did you remember to call SHInitExtraControls() ??
\r
2789 static LPCTSTR GetWndClassName()
\r
2791 return WC_TSTATIC;
\r
2795 BOOL SetToolTipText(LPCTSTR pstrTipText)
\r
2797 ATLASSERT(::IsWindow(m_hWnd));
\r
2798 ATLASSERT(pstrTipText);
\r
2799 ATLASSERT(lstrlen(pstrTipText)<= 253);
\r
2800 CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
\r
2801 LPTSTR pstr = buff.Allocate(lstrlen(pstrTipText) + 3);
\r
2804 ::lstrcpy(pstr, _T("~~"));
\r
2805 ::lstrcat(pstr, pstrTipText);
\r
2806 return SetWindowText(pstr);
\r
2810 typedef CTTStaticT<WTL::CStatic> CTTStatic;
\r
2813 ///////////////////////////////////////////////////////////////////////////////
\r
2816 template <class TBase>
\r
2817 class CTTButtonT : public TBase
\r
2821 CTTButtonT(HWND hWnd = NULL) : TBase(hWnd)
\r
2824 CTTButtonT< TBase >& operator =(HWND hWnd)
\r
2830 HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
\r
2831 DWORD dwStyle = 0, DWORD dwExStyle = 0,
\r
2832 ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
\r
2834 HWND hWnd = TBase::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);
\r
2835 ATLASSERT(hWnd != NULL); // Did you remember to call SHInitExtraControls() ??
\r
2840 static LPCTSTR GetWndClassName()
\r
2842 return WC_TBUTTON;
\r
2846 BOOL SetToolTipText(LPCTSTR pstrTipText)
\r
2848 ATLASSERT(::IsWindow(m_hWnd));
\r
2849 ATLASSERT(pstrTipText);
\r
2850 ATLASSERT(lstrlen(pstrTipText)<= 253);
\r
2851 CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
\r
2852 LPTSTR pstr = buff.Allocate(lstrlen(pstrTipText) + 3);
\r
2855 ::lstrcpy(pstr, _T("~~"));
\r
2856 ::lstrcat(pstr, pstrTipText);
\r
2857 return SetWindowText(pstr);
\r
2861 typedef CTTButtonT<WTL::CButton> CTTButton;
\r
2863 #endif // !WIN32_PLATFORM_WFSP
\r
2866 // --- SmartPhone specific controls ---
\r
2868 #ifdef WIN32_PLATFORM_WFSP
\r
2870 ///////////////////////////////////////////////////////////////////////////////
\r
2871 // CSpinCtrlT - CSpinCtrl : SmartPhone adapted UpDown control
\r
2873 template <class TBase>
\r
2874 class CSpinCtrlT : public CUpDownCtrlT< TBase >
\r
2878 CSpinCtrlT(HWND hWnd = NULL) : CUpDownCtrlT< TBase >(hWnd)
\r
2881 CSpinCtrlT< TBase >& operator =(HWND hWnd)
\r
2887 HWND Create(HWND hWndParent, HWND hBuddy, DWORD dwStyle, int nID, LPCTSTR szExpandedName = NULL)
\r
2889 ATLASSERT(::IsWindow(hWndParent));
\r
2890 CUpDownCtrlT< TBase >::Create(hWndParent, NULL, szExpandedName, dwStyle, 0, nID, NULL);
\r
2891 ATLASSERT(m_hWnd != NULL); // Did you remember to call AtlInitCommonControls(ICC_UPDOWN_CLASS)?
\r
2892 if (hBuddy != NULL)
\r
2894 ATLASSERT(::IsWindow(hBuddy));
\r
2901 typedef CSpinCtrlT<ATL::CWindow> CSpinCtrl;
\r
2904 ///////////////////////////////////////////////////////////////////////////////
\r
2905 // CSpinned - SmartPhone association of control and Spin
\r
2907 template <class TBase, bool t_bExpandOnly>
\r
2908 class CSpinned : public TBase
\r
2911 CSpinCtrl m_SpinCtrl;
\r
2912 DWORD m_dwSpinnedStyle;
\r
2915 CSpinned(HWND hWnd = NULL) : TBase(hWnd)
\r
2917 m_dwSpinnedStyle = WS_VISIBLE | UDS_ALIGNRIGHT | UDS_EXPANDABLE;
\r
2919 if (t_bExpandOnly == true)
\r
2920 m_dwSpinnedStyle |= UDS_NOSCROLL;
\r
2922 m_dwSpinnedStyle |= UDS_HORZ | UDS_ARROWKEYS | UDS_SETBUDDYINT | UDS_WRAP;
\r
2925 AttachOrCreateSpinCtrl();
\r
2928 CSpinned<TBase, t_bExpandOnly>& operator =(HWND hWnd)
\r
2934 void Attach(HWND hWnd)
\r
2936 ATLASSERT(!IsWindow());
\r
2937 TBase* pT = static_cast<TBase*>(this);
\r
2938 pT->m_hWnd = hWnd;
\r
2940 AttachOrCreateSpinCtrl();
\r
2943 HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szExpandedName = NULL,
\r
2944 DWORD dwStyle = 0, DWORD dwExStyle = 0,
\r
2945 ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
\r
2948 TBase* pT = static_cast<TBase*>(this);
\r
2949 TBase::Create(hWndParent, rect, NULL, dwStyle, dwExStyle, MenuOrID, lpCreateParam);
\r
2950 ATLASSERT(pT->m_hWnd != NULL);
\r
2952 m_SpinCtrl.Create(hWndParent, pT->m_hWnd, m_dwSpinnedStyle, ATL_IDW_SPIN_ID + (int)MenuOrID.m_hMenu, szExpandedName);
\r
2954 ATLASSERT(m_SpinCtrl.m_hWnd != NULL); // Did you remember to call AtlInitCommonControls(ICC_UPDOWN_CLASS)?
\r
2956 return pT->m_hWnd;
\r
2960 CSpinCtrl& GetSpinCtrl()
\r
2962 return m_SpinCtrl;
\r
2966 // Attach our existing SpinCtrl or create one
\r
2967 bool AttachOrCreateSpinCtrl()
\r
2969 TBase* pT = static_cast<TBase*>(this);
\r
2971 HWND hSpin = ::GetDlgItem(pT->GetParent(), ATL_IDW_SPIN_ID + pT->GetDlgCtrlID());
\r
2973 if (hSpin != NULL)
\r
2975 m_SpinCtrl.Attach(hSpin);
\r
2977 TCHAR sClassName[16];
\r
2978 ::GetClassName(hSpin, sClassName, 16);
\r
2979 ATLASSERT(!_tcscmp(sClassName, UPDOWN_CLASS));
\r
2980 ATLASSERT(m_SpinCtrl.GetBuddy().m_hWnd == pT->m_hWnd);
\r
2985 m_SpinCtrl.Create(pT->GetParent(), pT->m_hWnd, m_dwSpinnedStyle, ATL_IDW_SPIN_ID + pT->GetDlgCtrlID());
\r
2988 return m_SpinCtrl.m_hWnd != NULL;
\r
2993 ///////////////////////////////////////////////////////////////////////////////
\r
2994 // CSpinListBox - SmartPhone spinned ListBox control
\r
2995 // CExpandListBox - SmartPhone expandable ListBox control
\r
2996 // CExpandEdit - SmartPhone expandable Edit control
\r
2997 // CExpandCapEdit - SmartPhone expandable CapEdit control
\r
2999 typedef CSpinned<CListBox, false> CSpinListBox;
\r
3000 typedef CSpinned<CListBox, true> CExpandListBox;
\r
3001 typedef CSpinned<CEdit, true> CExpandEdit;
\r
3002 typedef CSpinned<CCapEdit, true> CExpandCapEdit;
\r
3004 #endif // WIN32_PLATFORM_WFSP
\r
3006 #endif // _WTL_CE_NO_CONTROLS
\r
3008 }; // namespace WTL
\r
3010 #endif // __ATLWINCE_H__
\r