📄 atlwince.h
字号:
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" non-modal 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 T>
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);
};
};
///////////////////////////////////////////////////////////////////////////////
// CAppStdDialogImpl - PPC/SmartPhone implementation of non-modal standard dialog application
#ifdef WIN32_PLATFORM_WFSP
#define WTL_APP_SHIDIF WTL_SP_SHIDIF
#else
#define WTL_APP_SHIDIF WTL_STD_SHIDIF
#endif
template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF>
class ATL_NO_VTABLE CAppStdDialogImpl :
public ATL::CDialogImpl< T >,
public CStdDialogBase<T, t_shidiFlags, false>,
public CAppDialog< T >
{
public:
BEGIN_MSG_MAP(CAppStdDialogImpl)
#if defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key
MESSAGE_HANDLER(WM_HOTKEY, OnHotKey)
COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose)
#endif
MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd)
CHAIN_MSG_MAP(CAppDialog< T >)
END_MSG_MAP()
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
#ifdef WIN32_PLATFORM_WFSP
StdPlatformInit();
#endif
StdShidInit();
return bHandled = FALSE;
}
};
#endif // _WTL_CE_NO_DIALOGS
#endif // _WTL_CE_NO_APPWINDOW
// --- Full screen support ---
#ifndef _WTL_CE_NO_FULLSCREEN
///////////////////////////////////////////////////////////////////////////////
// CFullScreenFrame - PPC full screen frame implementation
#ifdef WIN32_PLATFORM_PSPC // Pocket PC code
template <class T, bool t_bHasSip = true>
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 <class D>
int FSDoModal(D& dlg)
{
T* pT = static_cast<T*>(this);
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<T*>(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<T*>(this);
ATLASSERT(pT->IsWindow());
RECT rect = { 0 };
SystemParametersInfo(SPI_GETWORKAREA, NULL, &rect, FALSE);
if (!bShow)
rect.top = 0;
UINT uShow = t_bHasSip ? SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON : SHFS_SHOWTASKBAR | SHFS_HIDESIPBUTTON;
SHFullScreen(pT->m_hWnd, bShow ? uShow : SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON);
pT->MoveWindow(&rect, bRepaint);
}
// Message map and handler
BEGIN_MSG_MAP(CFullScreenFrame)
MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
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;
}
};
#endif // WIN32_PLATFORM_PSPC
#endif // _WTL_CE_NO_FULLSCREEN
// --- WinCE zoom support ---
#ifndef _WTL_CE_NO_ZOOMSCROLL
///////////////////////////////////////////////////////////////////////////////
// CZoomScrollImpl - WinCE zooming implementation on top of CScrollImpl
template <class T>
class CZoomScrollImpl: public CScrollImpl< T >
{
public:
// Data members
CSize m_sizeTrue;
double m_fzoom;
// Creation
CZoomScrollImpl() : m_sizeTrue(0), m_fzoom(1.)
{ }
// Zoom operations and access
void SetZoomScrollSize(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(CSize(cx, cy), fzoom, bRedraw);
}
void SetZoom(double fzoom, BOOL bRedraw = TRUE)
{
CPoint ptCenter = WndtoTrue(m_sizeClient / 2);
CSize sizePage = GetScrollPage();
CSize sizeLine = GetScrollLine();
SetZoomScrollSize(GetScrollSize(), fzoom, bRedraw);
SetScrollLine(sizeLine);
SetScrollPage(sizePage);
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(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(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
CSize GetScrollSize()
{
return m_sizeTrue;
}
CSize GetScrollPage()
{
return m_sizePage * m_fzoom;
}
CSize GetScrollLine()
{
return m_sizeLine * m_fzoom;
}
CPoint GetScrollOffset()
{
return (CSize)m_ptOffset * m_fzoom;
}
// Helper coordinate functions
CPoint WndtoTrue(CPoint ptW)
{
return (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);
}
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);
CPoint ptOffset = GetScrollOffset();
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);
}
// 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<T*>(this);
ATLASSERT(::IsWindow(pT->m_hWnd));
if ((GetScrollExtendedStyle() & SCRL_ERASEBACKGROUND))
{
CRect rect;
pT->GetClientRect(rect);
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)
{
CRect rectBG(CPoint(m_sizeAll.cx, 0), sizeClient);
hdc.FillRect(rectBG, hbr);
}
if (m_sizeAll.cy < sizeClient.cy)
{
CRect rectBG(CPoint(0, m_sizeAll.cy), sizeClient);
hdc.FillRect(rectBG, hbr);
}
}
}
else
{
bHandled = FALSE;
}
return 1;
}
};
#endif // _WTL_CE_NO_ZOOMSCROLL
// --- PPC/SmartPhone controls ---
#ifndef _WTL_CE_NO_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<CMyHtml, CHtmlCtrl>
// {
// public:
// BEGIN_MSG_MAP(CMyHtml)
// // put your message handler entries here
// END_MSG_MAP()
// };
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// CHtmlCtrl
template <class TBase>
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)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -