// Windows Template Library - WTL version 8.0 // Copyright (C) Microsoft Corporation. All rights reserved. // // This file is a part of the Windows Template Library. // The use and distribution terms for this software are covered by the // Microsoft Permissive License (Ms-PL) which can be found in the file // Ms-PL.txt at the root of this distribution. #ifndef __ATLWINCE_H__ #define __ATLWINCE_H__ #pragma once #ifndef __cplusplus #error ATL requires C++ compilation (use a .cpp suffix) #endif #ifndef __ATLAPP_H__ #error atlwince.h requires atlapp.h to be included first #endif #ifndef __ATLWIN_H__ #error atlwince.h requires atlwin.h to be included first #endif #ifndef _WIN32_WCE #error atlwince.h compiles under Windows CE only #elif (_WIN32_WCE < 300) #error atlwince.h requires Windows CE 3.0 or higher. #endif #if defined(WIN32_PLATFORM_WFSP) && _MSC_VER < 1400 // EVC compiling SmartPhone code #if (WIN32_PLATFORM_WFSP < 200) #error atlwince.h requires Smartphone 2003 or higher #endif #endif // WIN32_PLATFORM_WFSP #if defined(WIN32_PLATFORM_PSPC) && _MSC_VER < 1400 // EVC compiling Pocket PC code #if (WIN32_PLATFORM_PSPC < 310) #error atlwince.h requires Pocket PC 2002 or higher #endif #endif // WIN32_PLATFORM_PSPC #if !defined(_AYGSHELL_H_) && !defined(__AYGSHELL_H__) #error atlwince.h requires aygshell.h to be included first #else #if defined(WIN32_PLATFORM_WFSP) && !defined(_TPCSHELL_H_) #error SmartPhone dialog classes require tpcshell.h to be included first #endif #endif #if (_MSC_VER >= 1400) // VS2005 #include #define _WTL_CE_DRA #endif // (_MSC_VER >= 1400) #if !defined(_WTL_CE_NO_DIALOGS) && !defined(__ATLFRAME_H__) #error Orientation aware dialog classes require atlframe.h to be included first #endif #if !defined(_WTL_CE_NO_APPWINDOW) && !defined(__ATLFRAME_H__) #error Application window class require atlframe.h to be included first #endif #if !defined(_WTL_CE_NO_ZOOMSCROLL) && !defined(__ATLSCRL_H__) #error ZoomScroll implementation requires atlscrl.h to be included first #endif #if !defined(_WTL_CE_NO_ZOOMSCROLL) #if !(defined(__ATLTYPES_H__) || (defined(__ATLMISC_H__) && !defined(_WTL_NO_WTYPES))) #error ZoomScroll requires _WTL_NO_WTYPES not to be defined and either atlmisc.h or atltypes.h to be included first #endif // !(defined(__ATLTYPES_H__) || (defined(__ATLMISC_H__) && !defined(_WTL_NO_WTYPES))) #endif // !defined(_WTL_CE_NO_ZOOMSCROLL) #if !defined(WIN32_PLATFORM_WFSP) && !defined(WIN32_PLATFORM_PSPC) #define _WTL_CE_NO_CONTROLS #endif // !defined(WIN32_PLATFORM_WFSP) && !defined(WIN32_PLATFORM_PSPC) #ifndef _WTL_CE_NO_CONTROLS #ifndef __ATLCTRLS_H__ #error The PPC/SmartPhone controls classes require atlctrls.h to be included first #endif #include #pragma comment(lib, "htmlview.lib") #include #pragma comment(lib, "voicectl.lib") #ifdef WIN32_PLATFORM_PSPC #include #pragma comment(lib, "richink.lib") #include #pragma comment(lib, "inkx.lib") #include #pragma comment(lib, "doclist.lib") #endif #endif /////////////////////////////////////////////////////////////////////////////// // Classes in this file: // // CStdDialogBase : Standard PPC/SmartPhone dialog base class // CStdDialogImplBase - Base implementation of standard dialog // CStdDialogImpl : Standard dialog implementation // CStdIndirectDialogImpl - implementation of standard indirect PPC/SmartPhone dialog // CStdAxDialogImpl : Standard AxDialog implementation // CStdSimpleDialog : Standard simple dialog // CStdDialogResizeImplBase - Base implementation of orientation resizing standard dialog // CStdDialogResizeImpl : Orientation resizing standard dialog implementation // CStdAxDialogResizeImpl - implementation of orientation resizing standard AxDialog // CStdSimpleDialogResizeImpl : Standard resizing simple dialog implementation // CStdOrientedDialogBase - Oriented PPC standard dialog base class // CStdOrientedDialogImplBase - Oriented PPC standard dialog base implementation // CStdOrientedDialogImpl : Oriented PPC standard dialog implementation // CStdAxOrientedDialogImpl - Oriented PPC standard AxDialog implementation // CStdSimpleOrientedDialog : Standard simple orientable dialog // // CAppInfoBase : Helper for application state save/restore to registry // CAppInfoT : CAppInfoBase constructed from a CAppWindow // CAppWindowBase : Base class for PPC/SmartPhone well-behaved application window or dialog // CAppWindow : PPC/SmartPhone well-behaved application window class // CAppDialog : PPC/SmartPhone well-behaved application dialog class // CAppStdDialogImplBase - Base implementation of standard application dialogs // CAppStdDialogImpl : Implementation of standard application dialog // CAppStdDialogResizeImpl - implementation of orientation resizing standard application dialog // CAppStdAxDialogImpl - Implementation of standard application AxDialog // CAppStdAxDialogResizeImpl - implementation of orientation resizing standard application AxDialog // CAppStdOrientedDialogImpl - implementation of oriented PPC standard application dialog // CAppStdAxOrientedDialogImpl - implementation of oriented PPC standard application AxDialog // // CFullScreenFrame : Full screen frame class // // CZoomScrollImpl : WinCE zooming implementation // // CBottomTabViewImpl - CBottomTabView // CHtmlCtrlT - CHtmlCtrl // CRichInkCtrlT - CRichInkCtrl // CInkXCtrlT - CInkXCtrl // CVoiceRecorderCtrlT - CVoiceRecorderCtrl // CDocListCtrlT - CDocListCtrl // CCapEditT - CCapEdit // CTTStaticT - CTTStatic // CTTButtonT - CTTButton // // CSpinCtrlT - CSpinCtrl : SmartPhone specific UpDown control // CSpinned : SmartPhone association of control and Spin // CSpinListBox : SmartPhone spinned ListBox control // CExpandListBox : SmartPhone expandable ListBox control // CExpandEdit : SmartPhone expandable Edit control // CExpandCapEdit : SmartPhone expandable CapEdit control // // Global functions: // AtlCreateMenuBar() // AtlCreateEmptyMenuBar() // AtlIsEditFocus() // AtlActivateBackKey() namespace WTL { /////////////////////////////////////////////////////////////////////////////// // MenuBar creation functions for property sheets and dialogs // Frame windows use CreateSimpleCEMenuBar inline HWND AtlCreateMenuBar(SHMENUBARINFO& mbi) { ATLASSERT(::IsWindow(mbi.hwndParent)); ATLVERIFY(::SHCreateMenuBar(&mbi) != FALSE); return mbi.hwndMB; }; inline HWND AtlCreateMenuBar(HWND hWnd, UINT nToolBarId = ATL_IDW_TOOLBAR, DWORD dwFlags = 0, int nBmpId = 0, int cBmpImages = 0, COLORREF clrBk = 0) { SHMENUBARINFO mbi = { sizeof(mbi), hWnd, dwFlags, nToolBarId, ModuleHelper::GetResourceInstance(), nBmpId, cBmpImages, 0, clrBk }; return AtlCreateMenuBar(mbi); } inline HWND AtlCreateEmptyMenuBar(HWND hWnd, bool bSip = true) { SHMENUBARINFO embi = { sizeof(SHMENUBARINFO), hWnd, SHCMBF_EMPTYBAR }; if (!bSip) embi.dwFlags |= SHCMBF_HIDESIPBUTTON; return AtlCreateMenuBar(embi); } /////////////////////////////////////////////////////////////////////////////// // Helper functions for SmartPhone back key handling inline bool AtlIsEditFocus() { ATL::CWindow wCtrl = GetFocus(); if (wCtrl.IsWindow()) { TCHAR szClassName[8] = {0}; ATLVERIFY(::GetClassName(wCtrl.m_hWnd, szClassName, 8)); return !_tcscmp(szClassName, _T("Edit")) || !_tcscmp(szClassName, WC_CAPEDIT); } return false; } #if defined WIN32_PLATFORM_WFSP inline void AtlActivateBackKey(HWND hMenuBar) { ATLASSERT(::IsWindow(hMenuBar)); ::SendMessage(hMenuBar, SHCMBM_OVERRIDEKEY, VK_TBACK, MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, SHMBOF_NODEFAULT | SHMBOF_NOTIFY)); } #endif // WIN32_PLATFORM_WFSP // --- Standard PPC/SmartPhone dialogs --- #ifndef _WTL_CE_NO_DIALOGS /////////////////////////////////////////////////////////////////////////////// // CStdDialogBase - base class for standard PPC/SmartPhone dialogs #define WTL_STD_SHIDIF SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN #define WTL_SP_SHIDIF SHIDIF_SIZEDLGFULLSCREEN // Title setting macros #define WTL_DLG_TITLEHEIGHT(iHeight) static const int GetTitleHeight(){return iHeight;} #define WTL_DLG_NOTITLE WTL_DLG_TITLEHEIGHT(0) /////////////////////////////////////////////////////////////////////////////// // CStdDialogBase - Base class for standard PPC/SmartPhone dialog template class CStdDialogBase { public: #ifdef WIN32_PLATFORM_PSPC // Pocket PC only Dialog title handling const int nTitleHeight; CStdDialogBase() : nTitleHeight(T::GetTitleHeight()) { } // Overloads BOOL GetClientRect(LPRECT lpRect) { T* pT = static_cast(this); ATLASSERT(pT->IsWindow()); BOOL bRes = ::GetClientRect(pT->m_hWnd, lpRect); lpRect->top += nTitleHeight; return bRes; } BOOL SetWindowText(LPCTSTR lpszString) { T* pT = static_cast(this); ATLASSERT(pT->IsWindow()); BOOL bRes = ::SetWindowText(pT->m_hWnd, lpszString); if (nTitleHeight != 0) pT->DoPaintTitle(); return bRes; } // Overrideables static const int GetTitleHeight() { #ifdef _WTL_CE_DRA return DRA::SCALEY(24); #else // !_WTL_CE_DRA CWindowDC dc(NULL); return dc.GetDeviceCaps(LOGPIXELSY) >> 2; // LOGPIXELSY * 24 / 96, #endif // !_WTL_CE_DRA } // Title painting bool DoPaintTitle() { T* pT = static_cast(this); ATLASSERT(pT->IsWindow()); TCHAR sTitle[48]; // Preparation CPaintDC dc(pT->m_hWnd); CFont fontTitle = AtlCreateBoldFont(); CFontHandle fontOld = dc.SelectFont(fontTitle); dc.SetTextColor(GetSysColor(COLOR_HIGHLIGHT)); int nLen = pT->GetWindowText(sTitle, 48); int nWidth = dc.GetDeviceCaps(HORZRES); // Display title text RECT rTitle = { 0, 0, nWidth, nTitleHeight }; dc.FillRect(&rTitle, COLOR_3DHIGHLIGHT); #ifdef _WTL_CE_DRA rTitle.left = DRA::SCALEX(8); #else // !_WTL_CE_DRA rTitle.left = nTitleHeight / 3; // 8 == 24 / 3 #endif // !_WTL_CE_DRA dc.DrawText(sTitle, nLen, &rTitle, DT_VCENTER | DT_SINGLELINE); dc.SelectFont(fontOld); // Draw bottom line, 2 pixels thick if HI_RES_AWARE CPenHandle penOld = dc.SelectStockPen(BLACK_PEN); POINT line[4] = {{0, nTitleHeight}, {nWidth, nTitleHeight}, {0, nTitleHeight - 1}, {nWidth, nTitleHeight - 1}}; #ifdef _WTL_CE_DRA int nSeg = DRA::SCALEY(1); #else // !_WTL_CE_DRA int nSeg = nTitleHeight / 24; #endif // !_WTL_CE_DRA dc.Polyline(line, nSeg <= 2 ? nSeg * 2 : 4); dc.SelectPen(penOld); return false; } // Title preparation: move the dialog controls down to make room for title void DialogTitleInit() { T* pT = static_cast(this); ATLASSERT(pT->IsWindow()); ATL::CWindow wCtl = pT->GetWindow(GW_CHILD); while (wCtl.IsWindow()) { RECT rCtl = { 0 }; wCtl.GetWindowRect(&rCtl); ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rCtl, 2); ::OffsetRect(&rCtl, 0, nTitleHeight); wCtl.MoveWindow(&rCtl, FALSE); wCtl = wCtl.GetWindow(GW_HWNDNEXT); } } // SIP management void DoSipInfo() { T* pT = static_cast(this); ATLASSERT(pT->IsWindow()); SIPINFO si = {sizeof(SIPINFO)}; SipGetInfo(&si); if ((si.fdwFlags & SIPF_ON) ^ SIPF_ON) si.rcVisibleDesktop.bottom = si.rcSipRect.bottom; pT->MoveWindow(&si.rcVisibleDesktop, FALSE); } // Title painting handler LRESULT OnPaintTitle(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { T* pT = static_cast(this); return bHandled = nTitleHeight ? pT->DoPaintTitle() : FALSE; } // SIP handler LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) { T* pT = static_cast(this); if (wParam == SPI_SETSIPINFO) { pT->DoSipInfo(); return TRUE; } return bHandled = FALSE; } #elif defined WIN32_PLATFORM_WFSP // SmartPhone VK_TBACK key standard management LRESULT OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) { T* pT = static_cast(this); const UINT uModif = (UINT)LOWORD(lParam); const UINT uVirtKey = (UINT)HIWORD(lParam); if(uVirtKey == VK_TBACK) if (AtlIsEditFocus()) ::SHSendBackToFocusWindow(uMsg, wParam, lParam); else if (uModif & MOD_KEYUP) pT->StdCloseDialog(IDCANCEL); return 1; } // SmartPhone MenuBar and VK_TBACK key initialization void StdSPInit() { T* pT = static_cast(this); HWND hMenuBar = ::SHFindMenuBar(pT->m_hWnd); if (!hMenuBar && (t_shidiFlags & SHIDIF_DONEBUTTON)) hMenuBar = CreateMenuBar(ATL_IDM_MENU_DONE); if(hMenuBar != NULL) AtlActivateBackKey(hMenuBar); } void SetStaticBold() { T* pT = static_cast(this); ATLASSERT(pT->IsWindow()); CFontHandle fontBold = AtlCreateBoldFont(pT->GetFont()); ATL::CWindow wCtl = pT->GetWindow(GW_CHILD); while (wCtl.IsWindow()) { if ((short int)wCtl.GetDlgCtrlID() == IDC_STATIC) wCtl.SetFont(fontBold); wCtl = wCtl.GetWindow(GW_HWNDNEXT); } } #endif // WIN32_PLATFORM_WFSP // Platform dependant initialization void StdPlatformInit() { T* pT = static_cast(this); #ifdef WIN32_PLATFORM_PSPC // Pocket PC title initialization if (nTitleHeight != 0) pT->DialogTitleInit(); #elif defined(WIN32_PLATFORM_WFSP) pT->StdSPInit(); SetStaticBold(); #endif // WIN32_PLATFORM_WFSP } // Menu bar creation HWND CreateMenuBar(UINT uiMB = T::IDD, int nBmpImages = 0) { T* pT = static_cast(this); return AtlCreateMenuBar(pT->m_hWnd, uiMB, 0, nBmpImages ? uiMB : 0, nBmpImages); } // Dialog closing void StdCloseDialog(WORD wID) { T* pT = static_cast(this); if (t_bModal) ::EndDialog(pT->m_hWnd, wID); else pT->DestroyWindow(); } // Shell dialog layout initialization void StdShidInit() { T* pT = static_cast(this); SHINITDLGINFO shidi = { SHIDIM_FLAGS, pT->m_hWnd, t_shidiFlags }; ::SHInitDialog(&shidi); } // IDC_INFOSTATIC background setting LRESULT OnColorStatic(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (::GetDlgCtrlID((HWND)lParam) == IDC_INFOSTATIC) { ::SetBkMode((HDC)wParam, TRANSPARENT); return (LRESULT)::GetSysColorBrush(COLOR_INFOBK); } return bHandled = FALSE; } // Menu dialog ending LRESULT OnMenuClose(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { T* pT = static_cast(this); pT->StdCloseDialog((WORD)(wID - ID_MENU_OK + IDOK)); return 0; } // Standard dialog ending: may be used with any command LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { T* pT = static_cast(this); pT->StdCloseDialog(wID); return 0; } }; /////////////////////////////////////////////////////////////////////////////// // CStdDialogImplBase - Base implementation of standard PPC/SmartPhone dialog template > class ATL_NO_VTABLE CStdDialogImplBase : public TBase, public CStdDialogBase { public: #ifdef WIN32_PLATFORM_PSPC BOOL GetClientRect(LPRECT lpRect) { return CStdDialogBase::GetClientRect(lpRect); } BOOL SetWindowText(LPCTSTR lpszString) { return CStdDialogBase::SetWindowText(lpszString); } #endif BEGIN_MSG_MAP(CStdDialogImplBase) #ifdef WIN32_PLATFORM_PSPC // Pocket PC title and SIP MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) #elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) #endif MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd) COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) END_MSG_MAP() LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { #ifdef _DEBUG T* pT = static_cast(this); ATLASSERT(t_bModal == pT->m_bModal); #endif StdPlatformInit(); StdShidInit(); return bHandled = FALSE; } }; /////////////////////////////////////////////////////////////////////////////// // CStdDialogImpl - implementation of standard PPC/SmartPhone dialog template class ATL_NO_VTABLE CStdDialogImpl : public CStdDialogImplBase< T, t_shidiFlags, t_bModal> {}; /////////////////////////////////////////////////////////////////////////////// // CStdIndirectDialogImpl - implementation of standard indirect PPC/SmartPhone dialog #if defined __ATLDLGS_H__ template class ATL_NO_VTABLE CStdIndirectDialogImpl : public CIndirectDialogImpl< T, CMemDlgTemplate, CStdDialogImpl > { public: typedef CIndirectDialogImpl< T, CMemDlgTemplate, CStdDialogImpl > _baseClass; typedef CStdDialogImpl _baseStd; INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow(), LPARAM dwInitParam = NULL) { ATLASSERT(t_bModal); if (!m_Template.IsValid()) CreateTemplate(); if (m_Template.IsTemplateEx()) { if (m_Template.GetTemplateExPtr()->style & DS_CENTER) { ATLASSERT(m_Template.GetTemplateExPtr()->style ^ WS_CHILD); GetTemplateExPtr()->style |= WS_POPUP; } } else { if (m_Template.GetTemplatePtr()->style & DS_CENTER) { ATLASSERT(m_Template.GetTemplatePtr()->style ^ WS_CHILD); m_Template.GetTemplatePtr()->style |= WS_POPUP; } } return _baseClass::DoModal(hWndParent, dwInitParam); } HWND Create(HWND hWndParent, LPARAM dwInitParam = NULL) { ATLASSERT(!t_bModal); if (!m_Template.IsValid()) CreateTemplate(); if (m_Template.IsTemplateEx()) { if (GetTemplateExPtr()->style & DS_CENTER) { ATLASSERT(GetTemplateExPtr()->style ^ WS_CHILD); GetTemplateExPtr()->style |= WS_POPUP; } } else { if (GetTemplatePtr()->style & DS_CENTER) { ATLASSERT(GetTemplatePtr()->style ^ WS_CHILD); GetTemplatePtr()->style |= WS_POPUP; } } return _baseClass::Create(hWndParent, dwInitParam); } BEGIN_MSG_MAP(CStdIndirectDialogImpl) CHAIN_MSG_MAP(_baseStd) END_MSG_MAP() }; #endif // defined __ATLDLGS_H__ #ifndef _ATL_NO_HOSTING /////////////////////////////////////////////////////////////////////////////// // CStdAxDialogImpl - implementation of standard PPC/SmartPhone AxDialog template class ATL_NO_VTABLE CStdAxDialogImpl : public CStdDialogImplBase< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl< T > > {}; #endif // _ATL_NO_HOSTING /////////////////////////////////////////////////////////////////////////////// // CStdSimpleDialog - standard PPC/SmartPhone simple dialog with SHIDIF_xxx flags template class CStdSimpleDialog : public ATL::CSimpleDialog, public CStdDialogBase, t_shidiFlags> { public: typedef CStdDialogBase, t_shidiFlags> baseClass; #ifdef WIN32_PLATFORM_PSPC BOOL GetClientRect(LPRECT lpRect) { return baseClass::GetClientRect(lpRect); } BOOL SetWindowText(LPCTSTR lpszString) { return baseClass::SetWindowText(lpszString); } #endif BEGIN_MSG_MAP(CStdSimpleDialog) #ifdef WIN32_PLATFORM_PSPC // Pocket PC title and SIP MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) #elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) #endif MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd) END_MSG_MAP() LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { StdPlatformInit(); StdShidInit(); return bHandled = FALSE; } }; /////////////////////////////////////////////////////////////////////////////// // CStdDialogResizeImplBase - Base implementation of orientation resizing standard PPC/SmartPhone dialog template > class ATL_NO_VTABLE CStdDialogResizeImplBase : public CStdDialogImplBase< T, t_shidiFlags, t_bModal, TBase>, public CDialogResize { public: // Note: BEGIN_DLGRESIZE_MAP is required in the derived class. BEGIN_MSG_MAP(CStdResizeDialogImplBase) #ifdef WIN32_PLATFORM_PSPC // Pocket PC title MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) #elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) #endif MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd) COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) CHAIN_MSG_MAP(CDialogResize< T >) END_MSG_MAP() LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { #ifdef _DEBUG T* pT = static_cast(this); ATLASSERT(t_bModal == pT->m_bModal); #endif StdPlatformInit(); DlgResize_Init(FALSE); StdShidInit(); return bHandled = FALSE; } }; /////////////////////////////////////////////////////////////////////////////// // CStdDialogResizeImpl - implementation of orientation resizing standard PPC/SmartPhone dialog template class ATL_NO_VTABLE CStdDialogResizeImpl : public CStdDialogResizeImplBase< T, t_shidiFlags, t_bModal> {}; #ifndef _ATL_NO_HOSTING /////////////////////////////////////////////////////////////////////////////// // CStdAxDialogResizeImpl - implementation of orientation resizing standard PPC/SmartPhone AxDialog template class ATL_NO_VTABLE CStdAxDialogResizeImpl : public CStdDialogResizeImplBase< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl > {}; #endif // _ATL_NO_HOSTING /////////////////////////////////////////////////////////////////////////////// // CStdSimpleDialogResizeImpl - implementation of standard resizing simple dialog with SHIDIF_xxx flags // Usage: // class CMyDlg : public CStdSimpleDialogResize // { // public: // BEGIN_DLGRESIZE_MAP(CMyDlg) // ... // END_DLGRESIZE_MAP() // }; template class ATL_NO_VTABLE CStdSimpleDialogResizeImpl : public CStdSimpleDialog, public CDialogResize< T > { public: typedef CStdSimpleDialog::baseClass baseClass; BEGIN_MSG_MAP(CStdSimpleDialogResizeImpl) #ifdef WIN32_PLATFORM_PSPC // Pocket PC title MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) #elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) #endif MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd) COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) CHAIN_MSG_MAP(CDialogResize< T >) END_MSG_MAP() LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { StdPlatformInit(); DlgResize_Init(FALSE); StdShidInit(); return bHandled = FALSE; } }; #if defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC) /////////////////////////////////////////////////////////////////////////////// // CStdOrientedDialogBase - Oriented PPC standard dialog base class template class CStdOrientedDialogBase { public: // Operation BOOL SetOrientation(DRA::DisplayMode mode) { T* pT = static_cast(this); ATLASSERT(pT->IsWindow()); ATLASSERT(mode == DRA::GetDisplayMode()); // Derived dialog must enumerate TWO dialog templates with the same control ids and types ie: // enum { IDD = IDD_MYDLG, IDD_LANDSCAPE = IDD_MYDLG_L }; UINT iResource = (mode == DRA::Landscape)? T::IDD_LANDSCAPE : T::IDD; BOOL bRes = DRA::RelayoutDialog(ModuleHelper::GetResourceInstance(), pT->m_hWnd, MAKEINTRESOURCE(iResource)); pT->OnOrientation(mode); return bRes; } // Override void OnOrientation(DRA::DisplayMode /*mode*/) {} // Message handlers LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) { T* pT = static_cast(this); ATLASSERT(pT->IsWindow()); if (wParam == SETTINGCHANGE_RESET) { SetOrientation(DRA::GetDisplayMode()); pT->StdPlatformInit(); pT->StdShidInit(); } else if (wParam == SPI_SETSIPINFO) { pT->DoSipInfo(); return TRUE; } return bHandled = FALSE; } }; /////////////////////////////////////////////////////////////////////////////// // CStdOrientedDialogImplBase - Oriented PPC standard dialog base implementation template > class ATL_NO_VTABLE CStdOrientedDialogImplBase : public CStdDialogImplBase< T, t_shidiFlags, t_bModal, TBase>, public CStdOrientedDialogBase { public: BEGIN_MSG_MAP(CStdOrientedDialogImpl) MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) MESSAGE_HANDLER(WM_SETTINGCHANGE, CStdOrientedDialogBase::OnSettingChange) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd) COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) END_MSG_MAP() LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { T* pT = static_cast(this); #ifdef _DEBUG ATLASSERT(t_bModal == pT->m_bModal); #endif if (DRA::GetDisplayMode() == DRA::Landscape) SetOrientation(DRA::Landscape); pT->StdPlatformInit(); pT->StdShidInit(); return bHandled = FALSE; } }; /////////////////////////////////////////////////////////////////////////////// // CStdOrientedDialogImpl - Oriented PPC standard dialog implementation template class ATL_NO_VTABLE CStdOrientedDialogImpl : public CStdOrientedDialogImplBase< T, t_shidiFlags, t_bModal> {}; #ifndef _ATL_NO_HOSTING /////////////////////////////////////////////////////////////////////////////// // CStdAxOrientedDialogImpl - Oriented PPC standard AxDialog implementation template class ATL_NO_VTABLE CStdAxOrientedDialogImpl : public CStdOrientedDialogImplBase< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl > {}; #endif // _ATL_NO_HOSTING /////////////////////////////////////////////////////////////////////////////// // CStdSimpleOrientedDialog - Standard simple orientable dialog template class CStdSimpleOrientedDialog : public CStdSimpleDialog, public CStdOrientedDialogBase > { public: typedef CStdSimpleDialog::baseClass baseClass; typedef CStdOrientedDialogBase > baseOriented; enum {IDD = t_wDlgTemplateID, IDD_LANDSCAPE = t_wDlgLandscapeID}; BEGIN_MSG_MAP(CStdSimpleDialog) MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) MESSAGE_HANDLER(WM_SETTINGCHANGE, baseOriented::OnSettingChange) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd) COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) END_MSG_MAP() LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { if (DRA::GetDisplayMode() == DRA::Landscape) SetOrientation(DRA::Landscape); StdPlatformInit(); StdShidInit(); return bHandled = FALSE; } }; #endif // _WTL_CE_DRA #endif // _WTL_CE_NO_DIALOGS // --- PPC/SmartPhone application window and helpers --- #ifndef _WTL_CE_NO_APPWINDOW /////////////////////////////////////////////////////////////////////////////// // CAppInfoBase - Helper for application state save/restore to registry class CAppInfoBase { public: ATL::CRegKey m_Key; CAppInfoBase(ATL::_U_STRINGorID sAppKey) { m_Key.Create(HKEY_CURRENT_USER, sAppKey.m_lpstr); ATLASSERT(m_Key.m_hKey); } template LONG Save(V& val, ATL::_U_STRINGorID sName) { return ::RegSetValueEx(m_Key, sName.m_lpstr, 0, REG_BINARY, (LPBYTE)&val, sizeof(V)); } template LONG Save(int nb, V& val0, ATL::_U_STRINGorID sName) { return ::RegSetValueEx(m_Key, sName.m_lpstr, 0, REG_BINARY, (LPBYTE)&val0, nb * sizeof(V)); } template LONG Restore(V& val, ATL::_U_STRINGorID sName) { DWORD valtype; DWORD bufSize = sizeof(V); return ::RegQueryValueEx(m_Key, sName.m_lpstr, 0, &valtype, (LPBYTE)&val, &bufSize); } template LONG Restore(int nb, V& val0, ATL::_U_STRINGorID sName) { DWORD valtype; DWORD bufSize = nb * sizeof(V); return ::RegQueryValueEx(m_Key, sName.m_lpstr, 0, &valtype, (LPBYTE)&val0, &bufSize); } #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) #if (_ATL_VER < 0x0800) LONG Save(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName) { return m_Key.SetValue(sval, sName.m_lpstr); } LONG Restore(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName) { DWORD size = MAX_PATH; LONG res = m_Key.QueryValue(sval.GetBuffer(size), sName.m_lpstr, &size); sval.ReleaseBuffer(); return res; } #else // !(_ATL_VER < 0x0800) LONG Save(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName) { return m_Key.SetStringValue(sName.m_lpstr, sval); } LONG Restore(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName) { DWORD size = MAX_PATH; LONG res = m_Key.QueryStringValue(sName.m_lpstr, sval.GetBuffer(size), &size); sval.ReleaseBuffer(); return res; } #endif // !(_ATL_VER < 0x0800) #else #pragma message("Warning: CAppInfoBase compiles without CString support. Do not use CString in Save or Restore.") #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) #if (_ATL_VER < 0x0800) LONG Save(LPCTSTR sval, ATL::_U_STRINGorID sName) { return m_Key.SetValue(sval, sName.m_lpstr); } LONG Restore(LPTSTR sval, ATL::_U_STRINGorID sName, DWORD *plength) { return m_Key.QueryValue(sval, sName.m_lpstr, plength); } #else // !(_ATL_VER < 0x0800) LONG Save(LPCTSTR sval, ATL::_U_STRINGorID sName) { return m_Key.SetStringValue(sName.m_lpstr, sval); } LONG Restore(LPTSTR sval, ATL::_U_STRINGorID sName, DWORD *plength) { return m_Key.QueryStringValue(sName.m_lpstr, sval, plength); } #endif // !(_ATL_VER < 0x0800) LONG Delete(ATL::_U_STRINGorID sName) { return m_Key.DeleteValue(sName.m_lpstr); } }; /////////////////////////////////////////////////////////////////////////////// // CAppInfoT - CAppInfoBase constructed from a class with T::GetAppKey() // Macro for declaring AppKey #define DECLARE_APPKEY(uAppKey) \ static LPCTSTR GetAppKey() \ { \ static LPCTSTR sAppKey = ATL::_U_STRINGorID(uAppKey).m_lpstr; \ return sAppKey; \ } template class CAppInfoT : public CAppInfoBase { public: CAppInfoT() : CAppInfoBase(T::GetAppKey()){} }; /////////////////////////////////////////////////////////////////////////////// // CAppWindowBase - Base class for PPC/SmartPhone "well-behaved" application window or dialog // Macros for declaring frame WNDCLASS and AppKey #define DECLARE_APP_FRAME_CLASS(WndClassName, uCommonResourceID, uAppKey) \ DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \ DECLARE_APPKEY(uAppKey) #define DECLARE_APP_FRAME_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd, uAppKey) \ DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \ DECLARE_APPKEY(uAppKey) template class CAppWindowBase { public: typedef class CAppInfoT< T > CAppInfo; #ifndef WIN32_PLATFORM_WFSP SHACTIVATEINFO m_sai; // NoOp on SmartPhones #endif // WIN32_PLATFORM_WFSP bool m_bHibernate; CAppWindowBase< T >() : m_bHibernate(false) { #ifndef WIN32_PLATFORM_WFSP SHACTIVATEINFO sai = { sizeof(SHACTIVATEINFO) }; m_sai = sai; #endif // WIN32_PLATFORM_WFSP }; // Same as WTL 7.1 AppWizard generated ActivatePreviousInstance + SendMessage WM_COPYDATA static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR lpstrCmdLine, bool bDialog) { // requires T does DECLARE_APP_FRAME_CLASS, DECLARE_APP_FRAME_CLASS_EX or DECLARE_APP_DLG_CLASS CFrameWndClassInfo& classInfo = T::GetWndClassInfo(); ATLVERIFY(::LoadString(hInstance, classInfo.m_uCommonResourceID, classInfo.m_szAutoName, sizeof(classInfo.m_szAutoName)/sizeof(classInfo.m_szAutoName[0])) != 0); classInfo.m_wc.lpszClassName = classInfo.m_szAutoName; const TCHAR* pszClass = classInfo.m_wc.lpszClassName; if(NULL == pszClass || '\0' == *pszClass) { return E_FAIL; } const DWORD dRetryInterval = 100; const int iMaxRetries = 25; for(int i = 0; i < iMaxRetries; ++i) { HANDLE hMutex = CreateMutex(NULL, FALSE, pszClass); DWORD dw = GetLastError(); if(NULL == hMutex) { HRESULT hr; switch(dw) { case ERROR_INVALID_HANDLE: // A non-mutext object with this name already exists. hr = E_INVALIDARG; break; default: // This should never happen... hr = E_FAIL; } return hr; } // If the mutex already exists, then there should be another instance running if(dw == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); HWND hwnd = NULL; if (bDialog) hwnd = FindWindow(NULL, pszClass); else hwnd = FindWindow(pszClass, NULL); if(hwnd == NULL) { Sleep(dRetryInterval); continue; } else { // Transmit our params to previous instance if (lpstrCmdLine && *lpstrCmdLine) { COPYDATASTRUCT cd = { NULL, sizeof(TCHAR) * (wcslen(lpstrCmdLine) + 1), (PVOID)lpstrCmdLine }; ::SendMessage(hwnd, WM_COPYDATA, NULL, (LPARAM)&cd); } // Set the previous instance as the foreground window if(0 != SetForegroundWindow(reinterpret_cast(reinterpret_cast(hwnd) | 0x1))) return S_FALSE; } } else { return S_OK; } } return S_OK; } // Operations overriden in derived class bool AppHibernate(bool /*bHibernate*/) { return false; } bool AppNewInstance(LPCTSTR /*lpstrCmdLine*/) { return false; } void AppSave() { } #ifdef WIN32_PLATFORM_WFSP void AppBackKey() { ::SHNavigateBack(); } #endif // Message map and handlers BEGIN_MSG_MAP(CAppWindowBase) MESSAGE_HANDLER(WM_ACTIVATE, OnActivate) #ifdef WIN32_PLATFORM_WFSP MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) #else MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) #endif // WIN32_PLATFORM_WFSP MESSAGE_HANDLER(WM_HIBERNATE, OnHibernate) MESSAGE_HANDLER(WM_COPYDATA, OnNewInstance) MESSAGE_HANDLER(WM_CLOSE, OnClose) END_MSG_MAP() LRESULT OnActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { T* pT = static_cast(this); if (m_bHibernate) m_bHibernate = pT->AppHibernate(false); #ifndef WIN32_PLATFORM_WFSP ::SHHandleWMActivate(pT->m_hWnd, wParam, lParam, &m_sai, 0); #else wParam; lParam; #endif // WIN32_PLATFORM_WFSP return bHandled = FALSE; } #ifdef WIN32_PLATFORM_WFSP // SmartPhone VK_TBACK key standard management LRESULT OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) { T* pT = static_cast(this); const UINT uModif = (UINT)LOWORD(lParam); const UINT uVirtKey = (UINT)HIWORD(lParam); if(uVirtKey == VK_TBACK) if (AtlIsEditFocus()) ::SHSendBackToFocusWindow(uMsg, wParam, lParam); else if (uModif & MOD_KEYUP) pT->AppBackKey(); return 1; } #else // !WIN32_PLATFORM_WFSP // PPC SIP handling LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { T* pT = static_cast(this); bHandled = FALSE; return ::SHHandleWMSettingChange(pT->m_hWnd, wParam, lParam, &m_sai); } #endif // !WIN32_PLATFORM_WFSP LRESULT OnHibernate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { T* pT = static_cast(this); return m_bHibernate = pT->AppHibernate(true); } LRESULT OnNewInstance(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) { T* pT = static_cast(this); PCOPYDATASTRUCT pcds = (PCOPYDATASTRUCT)lParam; return pT->AppNewInstance((LPCTSTR)pcds->lpData); } LRESULT OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { T* pT = static_cast(this); pT->AppSave(); bHandled = FALSE; return 1; } }; /////////////////////////////////////////////////////////////////////////////// // CAppWindow - PPC/SmartPhone "well-behaved" application window class template class CAppWindow : public CAppWindowBase< T > { public: // Same as WTL 7.1 AppWizard generated Run + lpstrCmdLine in CreateEx static int AppRun(LPTSTR lpstrCmdLine = NULL, int nCmdShow = SW_SHOWNORMAL) { CMessageLoop theLoop; _Module.AddMessageLoop(&theLoop); T wndMain; if(wndMain.CreateEx(NULL, NULL, 0, 0, lpstrCmdLine) == NULL) { ATLTRACE2(atlTraceUI, 0, _T("Main window creation failed!\n")); return 0; } wndMain.ShowWindow(nCmdShow); int nRet = theLoop.Run(); _Module.RemoveMessageLoop(); return nRet; } static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR lpstrCmdLine) { return CAppWindowBase< T >::ActivatePreviousInstance(hInstance, lpstrCmdLine, false); } }; #ifndef _WTL_CE_NO_DIALOGS /////////////////////////////////////////////////////////////////////////////// // CAppDialog - PPC/SmartPhone "well-behaved" dialog application class // Macro for declaring dialog WNDCLASS and AppKey #define DECLARE_APP_DLG_CLASS(WndClassName, uCommonResourceID, uAppKey) \ static WTL::CFrameWndClassInfo& GetWndClassInfo() \ { \ static WTL::CFrameWndClassInfo wc = \ { \ { 0, (WNDPROC)StartDialogProc, \ 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName }, \ NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ }; \ return wc; \ }; \ DECLARE_APPKEY(uAppKey) template class CAppDialog : public CAppWindowBase< T > { public: static int AppRun(LPTSTR lpstrCmdLine = NULL, int nCmdShow = SW_SHOWNORMAL) { CMessageLoop theLoop; _Module.AddMessageLoop(&theLoop); T dlgMain; if(dlgMain.Create(NULL, (LPARAM)lpstrCmdLine) == NULL) { ATLTRACE2(atlTraceUI, 0, _T("Main dialog creation failed!\n")); return 0; } dlgMain.ShowWindow(nCmdShow); int nRet = theLoop.Run(); _Module.RemoveMessageLoop(); return nRet; } static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR lpstrCmdLine) { return CAppWindowBase< T >::ActivatePreviousInstance(hInstance, lpstrCmdLine, true); }; }; // PPC/SmartPhone standard application dialogs #ifdef WIN32_PLATFORM_WFSP #define WTL_APP_SHIDIF WTL_SP_SHIDIF #else #define WTL_APP_SHIDIF WTL_STD_SHIDIF #endif /////////////////////////////////////////////////////////////////////////////// // CAppStdDialogImplBase - Base implementation of standard application dialogs template class ATL_NO_VTABLE CAppStdDialogImplBase : public TImplBase, public CAppDialog< T > { public: WTL_DLG_NOTITLE; void StdCloseDialog(int nVal) { T* pT = static_cast(this); if (nVal != IDCANCEL) pT->AppSave(); if (t_bModal == false) { pT->DestroyWindow(); ::PostQuitMessage(nVal); } else ::EndDialog(pT->m_hWnd, nVal); } BEGIN_MSG_MAP(CAppStdDialogImplBase) MESSAGE_HANDLER(WM_CLOSE, OnSystemClose) CHAIN_MSG_MAP(TImplBase) CHAIN_MSG_MAP(CAppDialog< T >) END_MSG_MAP() LRESULT OnSystemClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { T* pT = static_cast(this); pT->StdCloseDialog(IDCANCEL); return 0; } }; /////////////////////////////////////////////////////////////////////////////// // CAppStdDialogImpl - Implementation of standard application dialog template class ATL_NO_VTABLE CAppStdDialogImpl : public CAppStdDialogImplBase, t_shidiFlags, t_bModal> {}; /////////////////////////////////////////////////////////////////////////////// // CAppStdDialogResizeImpl - implementation of orientation resizing standard application dialog template class ATL_NO_VTABLE CAppStdDialogResizeImpl : public CAppStdDialogImplBase, t_shidiFlags, t_bModal> {}; #ifndef _ATL_NO_HOSTING /////////////////////////////////////////////////////////////////////////////// // CAppStdAxDialogImpl - Implementation of standard application AxDialog template class ATL_NO_VTABLE CAppStdAxDialogImpl : public CAppStdDialogImplBase, t_shidiFlags, t_bModal> {}; /////////////////////////////////////////////////////////////////////////////// // CAppStdAxDialogResizeImpl - implementation of orientation resizing standard application AxDialog template class ATL_NO_VTABLE CAppStdAxDialogResizeImpl : public CAppStdDialogImplBase, t_shidiFlags, t_bModal> {}; #endif // _ATL_NO_HOSTING #if defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC) /////////////////////////////////////////////////////////////////////////////// // CAppStdOrientedDialogImpl - implementation of oriented PPC standard application dialog template class ATL_NO_VTABLE CAppStdOrientedDialogImpl : public CAppStdDialogImplBase, t_shidiFlags, t_bModal> {}; #ifndef _ATL_NO_HOSTING /////////////////////////////////////////////////////////////////////////////// // CAppStdAxOrientedDialogImpl - implementation of oriented PPC standard application AxDialog template class ATL_NO_VTABLE CAppStdAxOrientedDialogImpl : public CAppStdDialogImplBase, t_shidiFlags, t_bModal> {}; #endif // _ATL_NO_HOSTING #endif // defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC) #endif // _WTL_CE_NO_DIALOGS #endif // _WTL_CE_NO_APPWINDOW // --- Full screen support --- #ifndef _WTL_CE_NO_FULLSCREEN /////////////////////////////////////////////////////////////////////////////// // CFullScreenFrame - full screen frame implementation template class CFullScreenFrame { public: bool m_bFullScreen; CFullScreenFrame() : m_bFullScreen(false) { } // Operation void SetFullScreen(bool bFull) { m_bFullScreen = bFull; ShowTaskBar(!bFull, false); ShowMenuBar(!bFull); } // Manage TaskBar for modal dialogs and property sheets template int FSDoModal(D& dlg) { T* pT = static_cast(this); pT; // avoid level 4 warning ATLASSERT(pT->IsWindow()); if (m_bFullScreen) // Show taskbar if hidden ShowTaskBar(true, false); int iRet = dlg.DoModal(); if (m_bFullScreen) // Hide taskbar if restored ShowTaskBar(false); return iRet; } // Implementation void ShowMenuBar(bool bShow) { T* pT = static_cast(this); ATLASSERT(pT->IsWindow()); ATL::CWindow MenuBar = pT->m_hWndCECommandBar; ATLASSERT(MenuBar.IsWindow()); MenuBar.ShowWindow(bShow ? SW_SHOWNORMAL : SW_HIDE); pT->SizeToMenuBar(); } void ShowTaskBar(bool bShow, bool bRepaint = true) { T* pT = static_cast(this); ATLASSERT(pT->IsWindow()); RECT rect = { 0 }; SystemParametersInfo(SPI_GETWORKAREA, NULL, &rect, FALSE); if (!bShow) rect.top = 0; #ifdef WIN32_PLATFORM_PSPC // Pocket PC code UINT uShow = t_bHasSip ? SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON : SHFS_SHOWTASKBAR | SHFS_HIDESIPBUTTON; SHFullScreen(pT->m_hWnd, bShow ? uShow : SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON); #elif _WIN32_WCE > 0x500 // Smartphone 2005 code SHFullScreen(pT->m_hWnd, bShow ? SHFS_SHOWTASKBAR : SHFS_HIDETASKBAR); #else // Smartphone 2003 HWND hTaskBar = FindWindow(_T("tray"), NULL); ATLASSERT(::IsWindow(hTaskBar)); ::ShowWindow(hTaskBar, bShow ? SW_SHOW : SW_HIDE); #endif // WIN32_PLATFORM_PSPC pT->MoveWindow(&rect, bRepaint); } // Message map and handler BEGIN_MSG_MAP(CFullScreenFrame) MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) MESSAGE_HANDLER(WM_ACTIVATE, OnActivate) END_MSG_MAP() LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) { #ifndef SETTINGCHANGE_RESET // not defined for PPC 2002 #define SETTINGCHANGE_RESET SPI_SETWORKAREA #endif if (m_bFullScreen && (wParam & SETTINGCHANGE_RESET)) SetFullScreen(m_bFullScreen); return bHandled = FALSE; } LRESULT OnActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) { if (m_bFullScreen) { ShowTaskBar(!wParam); ShowMenuBar(!wParam); } return bHandled = FALSE; } }; #endif // _WTL_CE_NO_FULLSCREEN // --- WinCE zoom support --- #ifndef _WTL_CE_NO_ZOOMSCROLL /////////////////////////////////////////////////////////////////////////////// // CZoomScrollImpl - WinCE zooming implementation on top of CScrollImpl template class CZoomScrollImpl: public CScrollImpl< T > { public: // Data members _WTYPES_NS::CSize m_sizeTrue; double m_fzoom; // Creation CZoomScrollImpl() : m_sizeTrue(0), m_fzoom(1.) { } // Zoom operations and access void SetZoomScrollSize(_WTYPES_NS::CSize sizeTrue, double fzoom = 1., BOOL bRedraw = TRUE) { ATLASSERT(fzoom > 0.); m_sizeTrue = sizeTrue; m_fzoom = fzoom; CScrollImpl< T >::SetScrollSize(sizeTrue / fzoom, bRedraw); } void SetZoomScrollSize(int cx, int cy, double fzoom=1., BOOL bRedraw = TRUE) { SetZoomScrollSize(_WTYPES_NS::CSize(cx, cy), fzoom, bRedraw); } void SetZoom(double fzoom, BOOL bRedraw = TRUE) { _WTYPES_NS::CPoint ptCenter = WndtoTrue(m_sizeClient / 2); _WTYPES_NS::CSize sizePage = GetScrollPage(); _WTYPES_NS::CSize sizeLine = GetScrollLine(); SetZoomScrollSize(GetScrollSize(), fzoom, bRedraw); SetScrollLine(sizeLine); SetScrollPage(sizePage); _WTYPES_NS::CPoint ptOffset = ptCenter - (m_sizeClient / 2) * fzoom; SetScrollOffset(ptOffset, bRedraw); } double GetZoom() { return m_fzoom; } // CScrollImpl overrides void SetScrollOffset(int x, int y, BOOL bRedraw = TRUE) { CScrollImpl< T >::SetScrollOffset((int)(x / m_fzoom), (int)(y / m_fzoom), bRedraw); } void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE) { SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw); } void GetScrollOffset(POINT& ptOffset) { ptOffset.x = (LONG)(m_ptOffset.x * m_fzoom); ptOffset.y = (LONG)(m_ptOffset.y * m_fzoom); } void SetScrollSize(int cx, int cy, BOOL bRedraw = TRUE) { SetZoomScrollSize(cx, cy, GetZoom(), bRedraw); } void SetScrollSize(SIZE sizeTrue, BOOL bRedraw = TRUE) { SetZoomScrollSize(sizeTrue, GetZoom(), bRedraw); } void GetScrollSize(SIZE& sizeTrue) const { sizeTrue = m_sizeTrue; } void SetScrollPage(int cxPage, int cyPage) { SetScrollPage(_WTYPES_NS::CSize(cxPage, cyPage)); } void SetScrollPage(SIZE sizePage) { CScrollImpl< T >::SetScrollPage(sizePage / m_fzoom); } void GetScrollPage(SIZE& sizePage) const { sizePage = m_sizePage * m_fzoom; } void SetScrollLine(int cxLine, int cyLine) { SetScrollLine(_WTYPES_NS::CSize(cxLine, cyLine)); } void SetScrollLine(SIZE sizeLine) { CScrollImpl< T >::SetScrollLine(sizeLine / m_fzoom); } void GetScrollLine(SIZE& sizeLine) const { sizeLine = m_sizeLine * m_fzoom; } // Data access complements _WTYPES_NS::CSize GetScrollSize() { return m_sizeTrue; } _WTYPES_NS::CSize GetScrollPage() { return m_sizePage * m_fzoom; } _WTYPES_NS::CSize GetScrollLine() { return m_sizeLine * m_fzoom; } _WTYPES_NS::CPoint GetScrollOffset() { return (_WTYPES_NS::CSize)m_ptOffset * m_fzoom; } // Helper coordinate functions _WTYPES_NS::CPoint WndtoTrue(CPoint ptW) { return (_WTYPES_NS::CSize)ptW * GetZoom() + GetScrollOffset(); } void WndtoTrue(LPPOINT aptW, int nPts) // in place coord transformation { for (int i = 0 ; i < nPts ; i++) aptW[i] = WndtoTrue(aptW[i]); } void WndtoTrue(LPRECT prectW) // in place coord transformation { WndtoTrue((LPPOINT)prectW, 2); } _WTYPES_NS::CPoint TruetoWnd(CPoint ptT) { return (ptT - GetScrollOffset()) / GetZoom(); } void TruetoWnd(LPPOINT aptT, int nPts) // in place coord transformation { for (int i = 0 ; i < nPts ; i++) aptT[i] = TruetoWnd(aptT[i]); } void TruetoWnd(LPRECT prectT) // in place coord transformation { TruetoWnd((LPPOINT)prectT, 2); } // Drawing operations : assume adequate setting of data members BOOL Draw(HBITMAP hbm, HDC hdestDC, DWORD dwROP = SRCCOPY) { CDC memDC = CreateCompatibleDC(hdestDC); CBitmapHandle bmpOld = memDC.SelectBitmap(hbm); BOOL bRes = Draw(memDC, hdestDC, dwROP); memDC.SelectBitmap(bmpOld); return bRes; } BOOL Draw(HDC hsourceDC, HDC hdestDC, DWORD dwROP = SRCCOPY) { CDCHandle destDC = hdestDC; destDC.SetViewportOrg(0,0); _WTYPES_NS::CPoint ptOffset = GetScrollOffset(); _WTYPES_NS::CSize sizeZClient = m_sizeClient * GetZoom(); return destDC.StretchBlt(0, 0, m_sizeClient.cx, m_sizeClient.cy, hsourceDC, ptOffset.x, ptOffset.y, sizeZClient.cx, sizeZClient.cy, dwROP); } #ifdef _IMAGING_H BOOL Draw(IImage* pIImage, HDC hdestDC) { CDCHandle destDC = hdestDC; destDC.SetViewportOrg(0,0); return SUCCEEDED(pIImage->Draw(destDC, _WTYPES_NS::CRect(-_WTYPES_NS::CPoint(m_ptOffset), m_sizeAll), NULL)); } #endif // Message map and handlers BEGIN_MSG_MAP(CZoomScrollImpl< T >) MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) CHAIN_MSG_MAP(CScrollImpl< T >) END_MSG_MAP() LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) { T* pT = static_cast(this); ATLASSERT(::IsWindow(pT->m_hWnd)); if ((GetScrollExtendedStyle() & SCRL_ERASEBACKGROUND)) { _WTYPES_NS::CRect rect; pT->GetClientRect(rect); _WTYPES_NS::CSize sizeClient=rect.Size(); if (m_sizeAll.cx < sizeClient.cx || m_sizeAll.cy < sizeClient.cy) { CDCHandle hdc = (HDC)wParam; HBRUSH hbr = GetSysColorBrush((int)T::GetWndClassInfo().m_wc.hbrBackground - 1); if (m_sizeAll.cx < sizeClient.cx) { _WTYPES_NS::CRect rectBG(_WTYPES_NS::CPoint(m_sizeAll.cx, 0), sizeClient); hdc.FillRect(rectBG, hbr); } if (m_sizeAll.cy < sizeClient.cy) { _WTYPES_NS::CRect rectBG(_WTYPES_NS::CPoint(0, m_sizeAll.cy), sizeClient); hdc.FillRect(rectBG, hbr); } } } else { bHandled = FALSE; } return 1; } }; #endif // _WTL_CE_NO_ZOOMSCROLL #ifndef _WTL_CE_NO_CONTROLS // --- PPC bottom TabView control --- #if defined(__ATLCTRLX_H__) && defined(WIN32_PLATFORM_PSPC) /////////////////////////////////////////////////////////////////////////////// // CBottomTabViewImpl template class ATL_NO_VTABLE CBottomTabViewImpl : public CTabViewImpl { public: DECLARE_WND_CLASS_EX(NULL, 0, COLOR_APPWORKSPACE) // Implementation overrideables bool CreateTabControl() { m_tab.Create(m_hWnd, rcDefault, NULL, WS_CHILD | TCS_BOTTOM, 0, m_nTabID); ATLASSERT(m_tab.m_hWnd != NULL); if(m_tab.m_hWnd == NULL) return false; m_tab.SendMessage(CCM_SETVERSION, COMCTL32_VERSION); m_tab.SetItemExtra(sizeof(TABVIEWPAGE)); T* pT = static_cast(this); m_cyTabHeight = pT->CalcTabHeight(); return true; } int CalcTabHeight() { int nCount = m_tab.GetItemCount(); TCITEMEXTRA tcix = { 0 }; tcix.tciheader.mask = TCIF_TEXT; tcix.tciheader.pszText = _T("NS"); int nIndex = m_tab.InsertItem(nCount, tcix); RECT rect = { 0 }; SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0); RECT rcWnd = rect; m_tab.AdjustRect(FALSE, &rect); rcWnd.top = rect.bottom; ::AdjustWindowRectEx(&rcWnd, m_tab.GetStyle(), FALSE, m_tab.GetExStyle()); m_tab.DeleteItem(nIndex); return rcWnd.bottom - rcWnd.top; } void UpdateLayout() { RECT rect; GetClientRect(&rect); if(m_tab.IsWindow() && ((m_tab.GetStyle() & WS_VISIBLE) != 0)) m_tab.SetWindowPos(NULL, 0, rect.bottom - m_cyTabHeight, rect.right - rect.left, m_cyTabHeight, SWP_NOZORDER /*| SWP_SHOWWINDOW*/); if(m_nActivePage != -1) ::SetWindowPos(GetPageHWND(m_nActivePage), NULL, 0, 0, rect.right - rect.left, rect.bottom - m_cyTabHeight, SWP_NOZORDER); } }; class CBottomTabView : public CBottomTabViewImpl { public: DECLARE_WND_CLASS_EX(_T("WTL_BottomTabView"), 0, COLOR_APPWORKSPACE) }; #endif // defined(__ATLCTRLX_H__) && defined(WIN32_PLATFORM_PSPC) // --- PPC/SmartPhone controls --- //////////////////////////////////////////////////////////////////////////////// // These are wrapper classes for the Pocket PC 2002/2003 and SmartPhone 2003 controls // To implement a window based on a control, use following: // Example: Implementing a window based on a Html control // // class CMyHtml : CWindowImpl // { // public: // BEGIN_MSG_MAP(CMyHtml) // // put your message handler entries here // END_MSG_MAP() // }; /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // CHtmlCtrl template class CHtmlCtrlT : public TBase { public: // Constructors CHtmlCtrlT(HWND hWnd = NULL) : TBase(hWnd) { } CHtmlCtrlT< TBase >& operator =(HWND hWnd) { m_hWnd = hWnd; return *this; } HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) { HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); ATLASSERT(hWnd != NULL); // Did you remember to call InitHTMLControl(hInstance) ?? return hWnd; } // Attributes static LPCTSTR GetWndClassName() { return WC_HTML; } #if (_WIN32_WCE >= 400) void AddStyle(LPCWSTR pszStyle) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_ADDSTYLE, 0, (LPARAM)pszStyle); } #endif // (_WIN32_WCE >= 400) void AddText(BOOL bPlainText, LPCSTR pszText) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_ADDTEXT, (WPARAM)bPlainText, (LPARAM)pszText); } void AddHTML(LPCSTR pszHTML) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_ADDTEXT, (WPARAM)FALSE, (LPARAM)pszHTML); } void AddText(BOOL bPlainText, LPCWSTR pszText) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_ADDTEXTW, (WPARAM)bPlainText, (LPARAM)pszText); } void AddHTML(LPCWSTR pszHTML) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_ADDTEXTW, (WPARAM)FALSE, (LPARAM)pszHTML); } void Anchor(LPCSTR pszAnchor) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_ANCHOR, 0, (LPARAM)pszAnchor); } void Anchor(LPCWSTR pszAnchor) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_ANCHORW, 0, (LPARAM)pszAnchor); } #if (_WIN32_WCE >= 420) void GetBrowserDispatch(IDispatch** ppDispatch) { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(ppDispatch); ATLASSERT(*ppDispatch==NULL); ::SendMessage(m_hWnd, DTM_BROWSERDISPATCH, 0, (LPARAM)ppDispatch); } void GetDocumentDispatch(IDispatch** ppDispatch) { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(ppDispatch); ATLASSERT(*ppDispatch==NULL); ::SendMessage(m_hWnd, DTM_DOCUMENTDISPATCH , 0, (LPARAM)ppDispatch); } #endif // (_WIN32_WCE >= 420) void Clear() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_CLEAR, 0, 0L); } void EnableClearType(BOOL bEnable = TRUE) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_ENABLECLEARTYPE, 0, (LPARAM)bEnable); } void EnableContextMenu(BOOL bEnable = TRUE) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_ENABLECONTEXTMENU, 0, (LPARAM)bEnable); } void EnableScripting(BOOL bEnable = TRUE) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_ENABLESCRIPTING, 0, (LPARAM)bEnable); } void EnableShrink(BOOL bEnable = TRUE) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_ENABLESHRINK, 0, (LPARAM)bEnable); } void EndOfSource() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_ENDOFSOURCE, 0, 0L); } void ImageFail(DWORD dwCookie) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_IMAGEFAIL, 0, (LPARAM)dwCookie); } int GetLayoutHeight() const { ATLASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, DTM_LAYOUTHEIGHT, 0, 0L); } int GetLayoutWidth() const { ATLASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, DTM_LAYOUTWIDTH, 0, 0L); } void Navigate(LPCTSTR pstrURL, UINT uFlags = 0) { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(pstrURL); ::SendMessage(m_hWnd, DTM_NAVIGATE, (WPARAM)uFlags, (LPARAM)pstrURL); } void SelectAll() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_SELECTALL, 0, 0L); } void SetImage(INLINEIMAGEINFO* pImageInfo) { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(pImageInfo); ::SendMessage(m_hWnd, DTM_SETIMAGE, 0, (LPARAM)pImageInfo); } void ZoomLevel(int iLevel) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_ZOOMLEVEL, 0, (LPARAM)iLevel); } #if (_WIN32_WCE >= 400) void Stop() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DTM_STOP, 0, 0L); } #endif // (_WIN32_WCE >= 400) void GetScriptDispatch(IDispatch** ppDispatch) { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(ppDispatch); ATLASSERT(*ppDispatch==NULL); ::SendMessage(m_hWnd, DTM_SCRIPTDISPATCH, 0, (LPARAM)ppDispatch); } }; typedef CHtmlCtrlT CHtmlCtrl; #ifdef WIN32_PLATFORM_PSPC /////////////////////////////////////////////////////////////////////////////// // CRichInkCtrl template class CRichInkCtrlT : public TBase { public: // Constructors CRichInkCtrlT(HWND hWnd = NULL) : TBase(hWnd) { } CRichInkCtrlT< TBase >& operator =(HWND hWnd) { m_hWnd = hWnd; return *this; } HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) { HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); ATLASSERT(hWnd != NULL); // Did you remember to call InitRichInkDLL() ?? return hWnd; } // Attributes static LPCTSTR GetWndClassName() { return WC_RICHINK; } BOOL CanPaste(UINT uFormat = 0) const { ATLASSERT(::IsWindow(m_hWnd)); return (BOOL)::SendMessage(m_hWnd, EM_CANPASTE, (WPARAM)uFormat, 0L); } BOOL CanRedo() const { ATLASSERT(::IsWindow(m_hWnd)); return (BOOL)::SendMessage(m_hWnd, EM_CANREDO, 0, 0L); } BOOL CanUndo() const { ATLASSERT(::IsWindow(m_hWnd)); return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L); } void ClearAll(BOOL bRepaint = TRUE) const { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, EM_CLEARALL, (WPARAM)bRepaint, 0L); } BOOL GetModify() const { ATLASSERT(::IsWindow(m_hWnd)); return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L); } UINT GetPageStyle() const { ATLASSERT(::IsWindow(m_hWnd)); return (UINT)::SendMessage(m_hWnd, EM_GETPAGESTYLE, 0, 0L); } UINT GetPenMode() const { ATLASSERT(::IsWindow(m_hWnd)); return (UINT)::SendMessage(m_hWnd, EM_GETPENMODE, 0, 0L); } UINT GetViewStyle() const { ATLASSERT(::IsWindow(m_hWnd)); return (UINT)::SendMessage(m_hWnd, EM_GETVIEW, 0, 0L); } UINT GetWrapMode() const { ATLASSERT(::IsWindow(m_hWnd)); return (UINT)::SendMessage(m_hWnd, EM_GETWRAPMODE, 0, 0L); } UINT GetZoomPercent() const { ATLASSERT(::IsWindow(m_hWnd)); return (UINT)::SendMessage(m_hWnd, EM_GETZOOMPERCENT, 0, 0L); } void InsertLinks(LPWSTR lpString, int cchLength = -1) { ATLASSERT(::IsWindow(m_hWnd)); if(cchLength == -1) cchLength = lstrlen(lpString); ::SendMessage(m_hWnd, EM_INSERTLINKS, (WPARAM)cchLength, (LPARAM)lpString); } void RedoEvent() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, EM_REDOEVENT, 0, 0L); } UINT SetInkLayer(UINT uLayer) { ATLASSERT(::IsWindow(m_hWnd)); return (UINT)::SendMessage(m_hWnd, EM_SETINKLAYER, (WPARAM)uLayer, 0L); } void SetPageStyle(UINT uStyle) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, EM_SETPAGESTYLE, (WPARAM)uStyle, 0L); } void SetPenMode(UINT uMode) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, EM_SETPENMODE, (WPARAM)uMode, 0L); } void SetViewStyle(UINT uStyle) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, EM_SETVIEW, (WPARAM)uStyle, 0L); } void SetViewAttributes(VIEWATTRIBUTES* pAttribs) { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(pAttribs); ::SendMessage(m_hWnd, EM_SETVIEWATTRIBUTES, 0, (LPARAM)pAttribs); } void SetWrapMode(UINT uMode) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, EM_SETWRAPMODE, (WPARAM)uMode, 0L); } void SetZoomPercent(UINT uPercent) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, EM_SETZOOMPERCENT, (WPARAM)uPercent, 0L); } LONG StreamIn(UINT uFormat, EDITSTREAM& es) { ATLASSERT(::IsWindow(m_hWnd)); return (LONG)::SendMessage(m_hWnd, EM_STREAMIN, (WPARAM)uFormat, (LPARAM)&es); } LONG StreamOut(UINT uFormat, EDITSTREAM& es) { ATLASSERT(::IsWindow(m_hWnd)); return (LONG)::SendMessage(m_hWnd, EM_STREAMOUT, (WPARAM)uFormat, (LPARAM)&es); } void UndoEvent() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, EM_UNDOEVENT, 0, 0L); } // Standard EM_xxx messages DWORD GetSel() const { ATLASSERT(::IsWindow(m_hWnd)); return (DWORD)::SendMessage(m_hWnd, EM_GETSEL, 0, 0L); } void GetSel(int& nStartChar, int& nEndChar) const { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar); } void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM)bCanUndo, (LPARAM)lpszNewText); } void SetModify(BOOL bModified = TRUE) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, EM_SETMODIFY, (WPARAM)bModified, 0L); } int GetTextLength() const { ATLASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, WM_GETTEXTLENGTH, 0, 0L); } // Clipboard operations void Clear() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, WM_CLEAR, 0, 0L); } void Copy() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, WM_COPY, 0, 0L); } void Cut() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, WM_CUT, 0, 0L); } void Paste() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, WM_PASTE, 0, 0L); } }; typedef CRichInkCtrlT CRichInkCtrl; /////////////////////////////////////////////////////////////////////////////// // CInkXCtrl template class CInkXCtrlT : public TBase { public: // Constructors CInkXCtrlT(HWND hWnd = NULL) : TBase(hWnd) { } CInkXCtrlT< TBase >& operator =(HWND hWnd) { m_hWnd = hWnd; return *this; } HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) { HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); ATLASSERT(hWnd != NULL); // Did you remember to call InitInkX() ?? return hWnd; } // Attributes static LPCTSTR GetWndClassName() { return WC_INKX; } static UINT GetHotRecordingMessage() { return ::RegisterWindowMessage(szHotRecording); } void ClearAll() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, IM_CLEARALL, 0, 0L); } int GetData(BYTE* lpBuffer, INT cbBuffer) const { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(lpBuffer); return (int)::SendMessage(m_hWnd, IM_GETDATA, (WPARAM)cbBuffer, (LPARAM)lpBuffer); } int GetDataLen() const { ATLASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, IM_GETDATALEN, 0, 0L); } CRichInkCtrl GetRichInk() const { ATLASSERT(::IsWindow(m_hWnd)); return (HWND)::SendMessage(m_hWnd, IM_GETRICHINK, 0, 0L); } BOOL IsRecording() const { ATLASSERT(::IsWindow(m_hWnd)); return (BOOL)::SendMessage(m_hWnd, IM_RECORDING, 0, 0L); } void ReInit() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, IM_REINIT, 0, 0L); } void SetData(const BYTE* lpInkData, INT cbInkData) { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(lpInkData); ::SendMessage(m_hWnd, IM_SETDATA, (WPARAM)cbInkData, (LPARAM)lpInkData); } void VoicePlay() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, IM_VOICE_PLAY, 0, 0L); } BOOL IsVoicePlaying() const { ATLASSERT(::IsWindow(m_hWnd)); return (BOOL)::SendMessage(m_hWnd, IM_VOICE_PLAYING, 0, 0L); } BOOL VoiceRecord() { ATLASSERT(::IsWindow(m_hWnd)); return (BOOL)::SendMessage(m_hWnd, IM_VOICE_RECORD, 0, 0L); } void VoiceStop() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, IM_VOICE_STOP, 0, 0L); } void ShowVoiceBar(BOOL bShow = TRUE) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, IM_VOICEBAR, (WPARAM)bShow, 0L); } }; typedef CInkXCtrlT CInkXCtrl; #endif // WIN32_PLATFORM_PSPC /////////////////////////////////////////////////////////////////////////////// // CVoiceRecorderCtrl template class CVoiceRecorderCtrlT : public TBase { public: // Constructors CVoiceRecorderCtrlT(HWND hWnd = NULL) : TBase(hWnd) { } CVoiceRecorderCtrlT< TBase >& operator =(HWND hWnd) { m_hWnd = hWnd; return *this; } HWND Create(HWND hWndParent, const POINT pt, LPTSTR pstrFileName, UINT nID, DWORD dwStyle = 0) { ATLASSERT(pstrFileName != NULL); CM_VOICE_RECORDER cmvr = { 0 }; cmvr.cb = sizeof(CM_VOICE_RECORDER); cmvr.dwStyle = dwStyle; cmvr.xPos = pt.x; cmvr.yPos = pt.y; cmvr.hwndParent = hWndParent; cmvr.id = nID; cmvr.lpszRecordFileName = pstrFileName; m_hWnd = VoiceRecorder_Create(&cmvr); return m_hWnd; } HWND Create(LPCM_VOICE_RECORDER pAttribs) { ATLASSERT(pAttribs); m_hWnd = VoiceRecorder_Create(pAttribs); return m_hWnd; } // Attributes void Record() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, VRM_RECORD, 0, 0L); } void Play() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, VRM_PLAY, 0, 0L); } void Stop() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, VRM_STOP, 0, 0L); } void Cancel() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, VRM_CANCEL, 0, 0L); } void Done() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, VRM_OK, 0, 0L); } }; typedef CVoiceRecorderCtrlT CVoiceRecorderCtrl; #ifdef WIN32_PLATFORM_PSPC /////////////////////////////////////////////////////////////////////////////// // CDocListCtrl template class CDocListCtrlT : public TBase { public: // Attributes DOCLISTCREATE m_dlc; TCHAR m_szPath[MAX_PATH]; // Constructors CDocListCtrlT(HWND hWnd = NULL) : TBase(hWnd) { } CDocListCtrlT< TBase >& operator =(HWND hWnd) { m_hWnd = hWnd; return *this; } HWND Create(HWND hWndParent, WORD wId, LPCTSTR pszFolder = NULL, LPCTSTR pstrFilter = NULL, WORD wFilterIndex = 0, DWORD dwFlags = DLF_SHOWEXTENSION) { ATLASSERT(pstrFilter != NULL); // It seems to need a filter badly!! ::ZeroMemory(&m_dlc, sizeof(DOCLISTCREATE)); ::ZeroMemory(m_szPath, sizeof(m_szPath)); if(pszFolder != NULL) ::lstrcpyn(m_szPath, pszFolder, MAX_PATH - 1); m_dlc.dwStructSize = sizeof(DOCLISTCREATE); m_dlc.hwndParent = hWndParent; m_dlc.pszFolder = m_szPath; m_dlc.pstrFilter = pstrFilter; m_dlc.wFilterIndex = wFilterIndex; m_dlc.wId = wId; m_dlc.dwFlags = dwFlags; m_hWnd = DocList_Create(&m_dlc); return m_hWnd; } HWND Create(DOCLISTCREATE* pDlc) { m_dlc = *pDlc; m_hWnd = DocList_Create(&m_dlc); return m_hWnd; } // Attributes void DeleteSel() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DLM_DELETESEL, 0, 0L); } void DisableUpdates() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DLM_DISABLEUPDATES, 0, 0L); } void EnableUpdates() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DLM_ENABLEUPDATES, 0, 0L); } int GetFilterIndex() const { ATLASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, DLM_GETFILTERINDEX, 0, 0L); } int GetItemCount() const { ATLASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, DLM_GETITEMCOUNT, 0, 0L); } int GetNextItem(int iIndex, DWORD dwRelation = LVNI_ALL) const { ATLASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, DLM_GETNEXTITEM, (WPARAM)iIndex, (LPARAM)dwRelation); } int GetFirstItem(DWORD dwRelation = LVNI_ALL) const { ATLASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, DLM_GETNEXTITEM, (WPARAM)-1, (LPARAM)dwRelation); } BOOL GetNextWave(int* pIndex) const { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(pIndex); return (BOOL)::SendMessage(m_hWnd, DLM_GETNEXTWAVE, 0, (LPARAM)pIndex); } BOOL GetPrevWave(int* pIndex) const { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(pIndex); return (BOOL)::SendMessage(m_hWnd, DLM_GETPREVWAVE, 0, (LPARAM)pIndex); } int GetSelCount() const { ATLASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, DLM_GETSELCOUNT, 0, 0L); } BOOL GetSelPathName(LPTSTR pstrPath, int cchMax) const { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(pstrPath); return (BOOL)::SendMessage(m_hWnd, DLM_GETSELPATHNAME, (WPARAM)cchMax, (LPARAM)pstrPath); } void ReceiveIR(LPCTSTR pstrPath) const { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(pstrPath); ::SendMessage(m_hWnd, DLM_RECEIVEIR, 0, (LPARAM)pstrPath); } void Refresh() { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DLM_REFRESH, 0, 0L); } BOOL RenameMoveSelectedItems() { ATLASSERT(::IsWindow(m_hWnd)); return (BOOL)::SendMessage(m_hWnd, DLM_RENAMEMOVE, 0, 0L); } int SelectAll() { ATLASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, DLM_SELECTALL, 0, 0L); } HRESULT SelectItem(LPCTSTR pstrPath, BOOL bVisible = TRUE) { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(pstrPath); return (HRESULT)::SendMessage(m_hWnd, DLM_SELECTITEM, (WPARAM)bVisible, (LPARAM)pstrPath); } void SendEMail(LPCTSTR pstrAttachment) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DLM_SENDEMAIL, 0, (LPARAM)pstrAttachment); } void SendIR(LPCTSTR pstrPath) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DLM_SENDIR, 0, (LPARAM)pstrPath); } HRESULT SetFilterIndex(int iIndex) { ATLASSERT(::IsWindow(m_hWnd)); return (HRESULT)::SendMessage(m_hWnd, DLM_SETFILTERINDEX, (WPARAM)iIndex, 0L); } void SetFolder(LPCTSTR pstrPath) { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(pstrPath); ::SendMessage(m_hWnd, DLM_SETFOLDER, 0, (LPARAM)pstrPath); } BOOL SetItemState(int iIndex, const LVITEM* pItem) { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(pItem); return (BOOL)::SendMessage(m_hWnd, DLM_SETITEMSTATE, (WPARAM)iIndex, (LPARAM)pItem); } BOOL SetItemState(int iIndex, UINT uState, UINT uMask) { ATLASSERT(::IsWindow(m_hWnd)); LV_ITEM lvi = { 0 }; lvi.stateMask = uMask; lvi.state = uState; return (BOOL)::SendMessage(m_hWnd, DLM_SETITEMSTATE, (WPARAM)iIndex, (LPARAM)&lvi); } void SetOneItem(int iIndex, LPCVOID pPA) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DLM_SETONEITEM, (WPARAM)iIndex, (LPARAM)pPA); } void SetSelect(int iIndex) { ATLASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, DLM_SETSELECT, (WPARAM)iIndex, 0L); } void SetSelPathName(LPCTSTR pstrPath) { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(pstrPath); ::SendMessage(m_hWnd, DLM_SETSELPATHNAME, 0, (LPARAM)pstrPath); } BOOL SetSortOrder() { ATLASSERT(::IsWindow(m_hWnd)); return (BOOL)::SendMessage(m_hWnd, DLM_SETSORTORDER, 0, 0L); } HRESULT Update() { ATLASSERT(::IsWindow(m_hWnd)); return (HRESULT)::SendMessage(m_hWnd, DLM_UPDATE, 0, 0L); } BOOL ValidateFolder() { ATLASSERT(::IsWindow(m_hWnd)); return (BOOL)::SendMessage(m_hWnd, DLM_VALIDATEFOLDER, 0, 0L); } // Functions BOOL GetFirstSelectedWaveFile(int* pIndex, LPTSTR szPath, const size_t cchPath) { ATLASSERT(::IsWindow(m_hWnd)); return DocList_GetFirstSelectedWaveFile(m_hWnd, pIndex, szPath, cchPath); } BOOL GetNextSelectedWaveFile(int* pIndex, LPTSTR szPath, const size_t cchPath) { ATLASSERT(::IsWindow(m_hWnd)); return DocList_GetNextSelectedWaveFile(m_hWnd, pIndex, szPath, cchPath); } }; typedef CDocListCtrlT CDocListCtrl; #endif // WIN32_PLATFORM_PSPC /////////////////////////////////////////////////////////////////////////////// // CCapEdit template class CCapEditT : public TBase { public: // Constructors CCapEditT(HWND hWnd = NULL) : TBase(hWnd) { } CCapEditT< TBase >& operator =(HWND hWnd) { m_hWnd = hWnd; return *this; } HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) { HWND hWnd = /*TBase*/CWindow::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); ATLASSERT(hWnd != NULL); // Did you remember to call SHInitExtraControls() ?? return hWnd; } // Attributes static LPCTSTR GetWndClassName() { return WC_CAPEDIT; } }; typedef CCapEditT CCapEdit; /////////////////////////////////////////////////////////////////////////////// // CTTStatic #ifndef WIN32_PLATFORM_WFSP // Tooltips not supported on SmartPhone template class CTTStaticT : public TBase { public: // Constructors CTTStaticT(HWND hWnd = NULL) : TBase(hWnd) { } CTTStaticT< TBase >& operator =(HWND hWnd) { m_hWnd = hWnd; return *this; } HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) { HWND hWnd = TBase::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); ATLASSERT(hWnd != NULL); // Did you remember to call SHInitExtraControls() ?? return hWnd; } // Attributes static LPCTSTR GetWndClassName() { return WC_TSTATIC; } // Operations BOOL SetToolTipText(LPCTSTR pstrTipText) { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(pstrTipText); ATLASSERT(lstrlen(pstrTipText)<= 253); CTempBuffer buff; LPTSTR pstr = buff.Allocate(lstrlen(pstrTipText) + 3); if(pstr == NULL) return FALSE; ::lstrcpy(pstr, _T("~~")); ::lstrcat(pstr, pstrTipText); return SetWindowText(pstr); } }; typedef CTTStaticT CTTStatic; /////////////////////////////////////////////////////////////////////////////// // CTTButton template class CTTButtonT : public TBase { public: // Constructors CTTButtonT(HWND hWnd = NULL) : TBase(hWnd) { } CTTButtonT< TBase >& operator =(HWND hWnd) { m_hWnd = hWnd; return *this; } HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) { HWND hWnd = TBase::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); ATLASSERT(hWnd != NULL); // Did you remember to call SHInitExtraControls() ?? return hWnd; } // Attributes static LPCTSTR GetWndClassName() { return WC_TBUTTON; } // Operations BOOL SetToolTipText(LPCTSTR pstrTipText) { ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(pstrTipText); ATLASSERT(lstrlen(pstrTipText)<= 253); CTempBuffer buff; LPTSTR pstr = buff.Allocate(lstrlen(pstrTipText) + 3); if(pstr == NULL) return FALSE; ::lstrcpy(pstr, _T("~~")); ::lstrcat(pstr, pstrTipText); return SetWindowText(pstr); } }; typedef CTTButtonT CTTButton; #endif // !WIN32_PLATFORM_WFSP // --- SmartPhone specific controls --- #ifdef WIN32_PLATFORM_WFSP /////////////////////////////////////////////////////////////////////////////// // CSpinCtrlT - CSpinCtrl : SmartPhone adapted UpDown control template class CSpinCtrlT : public CUpDownCtrlT< TBase > { public: // Constructors CSpinCtrlT(HWND hWnd = NULL) : CUpDownCtrlT< TBase >(hWnd) { } CSpinCtrlT< TBase >& operator =(HWND hWnd) { m_hWnd = hWnd; return *this; } HWND Create(HWND hWndParent, HWND hBuddy, DWORD dwStyle, int nID, LPCTSTR szExpandedName = NULL) { ATLASSERT(::IsWindow(hWndParent)); CUpDownCtrlT< TBase >::Create(hWndParent, NULL, szExpandedName, dwStyle, 0, nID, NULL); ATLASSERT(m_hWnd != NULL); // Did you remember to call AtlInitCommonControls(ICC_UPDOWN_CLASS)? if (hBuddy != NULL) { ATLASSERT(::IsWindow(hBuddy)); SetBuddy(hBuddy); } return m_hWnd; } }; typedef CSpinCtrlT CSpinCtrl; /////////////////////////////////////////////////////////////////////////////// // CSpinned - SmartPhone association of control and Spin template class CSpinned : public TBase { public: CSpinCtrl m_SpinCtrl; DWORD m_dwSpinnedStyle; // Constructors CSpinned(HWND hWnd = NULL) : TBase(hWnd) { m_dwSpinnedStyle = WS_VISIBLE | UDS_ALIGNRIGHT | UDS_EXPANDABLE; if (t_bExpandOnly == true) m_dwSpinnedStyle |= UDS_NOSCROLL; else m_dwSpinnedStyle |= UDS_HORZ | UDS_ARROWKEYS | UDS_SETBUDDYINT | UDS_WRAP; if (hWnd != NULL) AttachOrCreateSpinCtrl(); } CSpinned& operator =(HWND hWnd) { Attach(hWnd); return *this; } void Attach(HWND hWnd) { ATLASSERT(!IsWindow()); TBase* pT = static_cast(this); pT->m_hWnd = hWnd; if (hWnd != NULL) AttachOrCreateSpinCtrl(); } HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szExpandedName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) { TBase* pT = static_cast(this); TBase::Create(hWndParent, rect, NULL, dwStyle, dwExStyle, MenuOrID, lpCreateParam); ATLASSERT(pT->m_hWnd != NULL); m_SpinCtrl.Create(hWndParent, pT->m_hWnd, m_dwSpinnedStyle, ATL_IDW_SPIN_ID + (int)MenuOrID.m_hMenu, szExpandedName); ATLASSERT(m_SpinCtrl.m_hWnd != NULL); // Did you remember to call AtlInitCommonControls(ICC_UPDOWN_CLASS)? return pT->m_hWnd; } // Attributes CSpinCtrl& GetSpinCtrl() { return m_SpinCtrl; } // Implementation // Attach our existing SpinCtrl or create one bool AttachOrCreateSpinCtrl() { TBase* pT = static_cast(this); HWND hSpin = ::GetDlgItem(pT->GetParent(), ATL_IDW_SPIN_ID + pT->GetDlgCtrlID()); if (hSpin != NULL) { m_SpinCtrl.Attach(hSpin); #ifdef DEBUG TCHAR sClassName[16]; ::GetClassName(hSpin, sClassName, 16); ATLASSERT(!_tcscmp(sClassName, UPDOWN_CLASS)); ATLASSERT(m_SpinCtrl.GetBuddy().m_hWnd == pT->m_hWnd); #endif // DEBUG } else { m_SpinCtrl.Create(pT->GetParent(), pT->m_hWnd, m_dwSpinnedStyle, ATL_IDW_SPIN_ID + pT->GetDlgCtrlID()); } return m_SpinCtrl.m_hWnd != NULL; } }; /////////////////////////////////////////////////////////////////////////////// // CSpinListBox - SmartPhone spinned ListBox control // CExpandListBox - SmartPhone expandable ListBox control // CExpandEdit - SmartPhone expandable Edit control // CExpandCapEdit - SmartPhone expandable CapEdit control typedef CSpinned CSpinListBox; typedef CSpinned CExpandListBox; typedef CSpinned CExpandEdit; typedef CSpinned CExpandCapEdit; #endif // WIN32_PLATFORM_WFSP #endif // _WTL_CE_NO_CONTROLS }; // namespace WTL #endif // __ATLWINCE_H__