📄 atldlgs.h
字号:
// Commands - valid to call only from handlers
void EnableOK(BOOL bEnable)
{
ATLASSERT(m_hWnd != NULL);
::SendMessage(m_hWnd, BFFM_ENABLEOK, 0, bEnable);
}
void SetSelection(LPITEMIDLIST pItemIDList)
{
ATLASSERT(m_hWnd != NULL);
::SendMessage(m_hWnd, BFFM_SETSELECTION, FALSE, (LPARAM)pItemIDList);
}
void SetSelection(LPCTSTR lpstrFolderPath)
{
ATLASSERT(m_hWnd != NULL);
::SendMessage(m_hWnd, BFFM_SETSELECTION, TRUE, (LPARAM)lpstrFolderPath);
}
void SetStatusText(LPCTSTR lpstrText)
{
ATLASSERT(m_hWnd != NULL);
::SendMessage(m_hWnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)lpstrText);
}
};
class CFolderDialog : public CFolderDialogImpl<CFolderDialog>
{
public:
CFolderDialog(HWND hWndParent = NULL, LPCTSTR lpstrTitle = NULL, UINT uFlags = BIF_RETURNONLYFSDIRS)
: CFolderDialogImpl<CFolderDialog>(hWndParent, lpstrTitle, uFlags)
{
m_bi.lpfn = NULL;
}
};
#endif //!_WIN32_WCE
///////////////////////////////////////////////////////////////////////////////
// CCommonDialogImplBase - base class for common dialog classes
class ATL_NO_VTABLE CCommonDialogImplBase : public ATL::CWindowImplBase
{
public:
static UINT_PTR APIENTRY HookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if(uMsg != WM_INITDIALOG)
return 0;
#if (_ATL_VER >= 0x0700)
CCommonDialogImplBase* pT = (CCommonDialogImplBase*)ATL::_AtlWinModule.ExtractCreateWndData();
#else //!(_ATL_VER >= 0x0700)
CCommonDialogImplBase* pT = (CCommonDialogImplBase*)_Module.ExtractCreateWndData();
#endif //!(_ATL_VER >= 0x0700)
ATLASSERT(pT != NULL);
ATLASSERT(pT->m_hWnd == NULL);
ATLASSERT(::IsWindow(hWnd));
// subclass dialog's window
if(!pT->SubclassWindow(hWnd))
{
ATLTRACE2(atlTraceUI, 0, _T("Subclassing a common dialog failed\n"));
return 0;
}
// check message map for WM_INITDIALOG handler
LRESULT lRes = 0;
if(pT->ProcessWindowMessage(pT->m_hWnd, uMsg, wParam, lParam, lRes, 0) == FALSE)
return 0;
return lRes;
}
// Special override for common dialogs
BOOL EndDialog(INT_PTR /*nRetCode*/ = 0)
{
ATLASSERT(::IsWindow(m_hWnd));
SendMessage(WM_COMMAND, MAKEWPARAM(IDABORT, 0));
return TRUE;
}
// Implementation - try to override these, to prevent errors
HWND Create(HWND, ATL::_U_RECT, LPCTSTR, DWORD, DWORD, ATL::_U_MENUorID, ATOM, LPVOID)
{
ATLASSERT(FALSE); // should not be called
return NULL;
}
static LRESULT CALLBACK StartWindowProc(HWND /*hWnd*/, UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/)
{
ATLASSERT(FALSE); // should not be called
return 0;
}
};
///////////////////////////////////////////////////////////////////////////////
// CFontDialogImpl - font selection dialog
#ifndef _WIN32_WCE
template <class T>
class ATL_NO_VTABLE CFontDialogImpl : public CCommonDialogImplBase
{
public:
enum { _cchStyleName = 64 };
CHOOSEFONT m_cf;
TCHAR m_szStyleName[_cchStyleName]; // contains style name after return
LOGFONT m_lf; // default LOGFONT to store the info
// Constructors
CFontDialogImpl(LPLOGFONT lplfInitial = NULL,
DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,
HDC hDCPrinter = NULL,
HWND hWndParent = NULL)
{
memset(&m_cf, 0, sizeof(m_cf));
memset(&m_lf, 0, sizeof(m_lf));
memset(&m_szStyleName, 0, sizeof(m_szStyleName));
m_cf.lStructSize = sizeof(m_cf);
m_cf.hwndOwner = hWndParent;
m_cf.rgbColors = RGB(0, 0, 0);
m_cf.lpszStyle = (LPTSTR)&m_szStyleName;
m_cf.Flags = dwFlags | CF_ENABLEHOOK;
m_cf.lpfnHook = (LPCFHOOKPROC)T::HookProc;
if(lplfInitial != NULL)
{
m_cf.lpLogFont = lplfInitial;
m_cf.Flags |= CF_INITTOLOGFONTSTRUCT;
memcpy(&m_lf, m_cf.lpLogFont, sizeof(m_lf));
}
else
{
m_cf.lpLogFont = &m_lf;
}
if(hDCPrinter != NULL)
{
m_cf.hDC = hDCPrinter;
m_cf.Flags |= CF_PRINTERFONTS;
}
}
// Operations
INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow())
{
ATLASSERT((m_cf.Flags & CF_ENABLEHOOK) != 0);
ATLASSERT(m_cf.lpfnHook != NULL); // can still be a user hook
if(m_cf.hwndOwner == NULL) // set only if not specified before
m_cf.hwndOwner = hWndParent;
ATLASSERT(m_hWnd == NULL);
#if (_ATL_VER >= 0x0700)
ATL::_AtlWinModule.AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this);
#else //!(_ATL_VER >= 0x0700)
_Module.AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this);
#endif //!(_ATL_VER >= 0x0700)
BOOL bRet = ::ChooseFont(&m_cf);
m_hWnd = NULL;
if(bRet) // copy logical font from user's initialization buffer (if needed)
memcpy(&m_lf, m_cf.lpLogFont, sizeof(m_lf));
return bRet ? IDOK : IDCANCEL;
}
// Get the selected font (works during DoModal displayed or after)
void GetCurrentFont(LPLOGFONT lplf) const
{
ATLASSERT(lplf != NULL);
if(m_hWnd != NULL)
::SendMessage(m_hWnd, WM_CHOOSEFONT_GETLOGFONT, 0, (LPARAM)lplf);
else
*lplf = m_lf;
}
// Helpers for parsing information after successful return
LPCTSTR GetFaceName() const // return the face name of the font
{
return (LPCTSTR)m_cf.lpLogFont->lfFaceName;
}
LPCTSTR GetStyleName() const // return the style name of the font
{
return m_cf.lpszStyle;
}
int GetSize() const // return the pt size of the font
{
return m_cf.iPointSize;
}
COLORREF GetColor() const // return the color of the font
{
return m_cf.rgbColors;
}
int GetWeight() const // return the chosen font weight
{
return (int)m_cf.lpLogFont->lfWeight;
}
BOOL IsStrikeOut() const // return TRUE if strikeout
{
return (m_cf.lpLogFont->lfStrikeOut) ? TRUE : FALSE;
}
BOOL IsUnderline() const // return TRUE if underline
{
return (m_cf.lpLogFont->lfUnderline) ? TRUE : FALSE;
}
BOOL IsBold() const // return TRUE if bold font
{
return (m_cf.lpLogFont->lfWeight == FW_BOLD) ? TRUE : FALSE;
}
BOOL IsItalic() const // return TRUE if italic font
{
return m_cf.lpLogFont->lfItalic ? TRUE : FALSE;
}
};
class CFontDialog : public CFontDialogImpl<CFontDialog>
{
public:
CFontDialog(LPLOGFONT lplfInitial = NULL,
DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,
HDC hDCPrinter = NULL,
HWND hWndParent = NULL)
: CFontDialogImpl<CFontDialog>(lplfInitial, dwFlags, hDCPrinter, hWndParent)
{ }
DECLARE_EMPTY_MSG_MAP()
};
#endif // _WIN32_WCE
///////////////////////////////////////////////////////////////////////////////
// CRichEditFontDialogImpl - font selection for the Rich Edit ctrl
#if defined(_RICHEDIT_) && !defined(_WIN32_WCE)
template <class T>
class ATL_NO_VTABLE CRichEditFontDialogImpl : public CFontDialogImpl< T >
{
public:
CRichEditFontDialogImpl(const CHARFORMAT& charformat,
DWORD dwFlags = CF_SCREENFONTS,
HDC hDCPrinter = NULL,
HWND hWndParent = NULL)
: CFontDialogImpl< T >(NULL, dwFlags, hDCPrinter, hWndParent)
{
m_cf.Flags |= CF_INITTOLOGFONTSTRUCT;
m_cf.Flags |= FillInLogFont(charformat);
m_cf.lpLogFont = &m_lf;
if((charformat.dwMask & CFM_COLOR) != 0)
m_cf.rgbColors = charformat.crTextColor;
}
void GetCharFormat(CHARFORMAT& cf) const
{
USES_CONVERSION;
cf.dwEffects = 0;
cf.dwMask = 0;
if((m_cf.Flags & CF_NOSTYLESEL) == 0)
{
cf.dwMask |= CFM_BOLD | CFM_ITALIC;
cf.dwEffects |= IsBold() ? CFE_BOLD : 0;
cf.dwEffects |= IsItalic() ? CFE_ITALIC : 0;
}
if((m_cf.Flags & CF_NOSIZESEL) == 0)
{
cf.dwMask |= CFM_SIZE;
//GetSize() returns in tenths of points so mulitply by 2 to get twips
cf.yHeight = GetSize() * 2;
}
if((m_cf.Flags & CF_NOFACESEL) == 0)
{
cf.dwMask |= CFM_FACE;
cf.bPitchAndFamily = m_cf.lpLogFont->lfPitchAndFamily;
#if (_RICHEDIT_VER >= 0x0200)
lstrcpy(cf.szFaceName, GetFaceName());
#else
lstrcpyA(cf.szFaceName, T2A((LPTSTR)(LPCTSTR)GetFaceName()));
#endif //(_RICHEDIT_VER >= 0x0200)
}
if((m_cf.Flags & CF_EFFECTS) != 0)
{
cf.dwMask |= CFM_UNDERLINE | CFM_STRIKEOUT | CFM_COLOR;
cf.dwEffects |= IsUnderline() ? CFE_UNDERLINE : 0;
cf.dwEffects |= IsStrikeOut() ? CFE_STRIKEOUT : 0;
cf.crTextColor = GetColor();
}
if((m_cf.Flags & CF_NOSCRIPTSEL) == 0)
{
cf.bCharSet = m_cf.lpLogFont->lfCharSet;
cf.dwMask |= CFM_CHARSET;
}
cf.yOffset = 0;
}
DWORD FillInLogFont(const CHARFORMAT& cf)
{
USES_CONVERSION;
DWORD dwFlags = 0;
if((cf.dwMask & CFM_SIZE) != 0)
{
HDC hDC = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
LONG yPerInch = ::GetDeviceCaps(hDC, LOGPIXELSY);
m_lf.lfHeight = -(int)((cf.yHeight * yPerInch) / 1440);
}
else
m_lf.lfHeight = 0;
m_lf.lfWidth = 0;
m_lf.lfEscapement = 0;
m_lf.lfOrientation = 0;
if((cf.dwMask & (CFM_ITALIC | CFM_BOLD)) == (CFM_ITALIC | CFM_BOLD))
{
m_lf.lfWeight = ((cf.dwEffects & CFE_BOLD) != 0) ? FW_BOLD : FW_NORMAL;
m_lf.lfItalic = (BYTE)(((cf.dwEffects & CFE_ITALIC) != 0) ? TRUE : FALSE);
}
else
{
dwFlags |= CF_NOSTYLESEL;
m_lf.lfWeight = FW_DONTCARE;
m_lf.lfItalic = FALSE;
}
if((cf.dwMask & (CFM_UNDERLINE | CFM_STRIKEOUT | CFM_COLOR)) == (CFM_UNDERLINE|CFM_STRIKEOUT|CFM_COLOR))
{
dwFlags |= CF_EFFECTS;
m_lf.lfUnderline = (BYTE)(((cf.dwEffects & CFE_UNDERLINE) != 0) ? TRUE : FALSE);
m_lf.lfStrikeOut = (BYTE)(((cf.dwEffects & CFE_STRIKEOUT) != 0) ? TRUE : FALSE);
}
else
{
m_lf.lfUnderline = (BYTE)FALSE;
m_lf.lfStrikeOut = (BYTE)FALSE;
}
if((cf.dwMask & CFM_CHARSET) != 0)
m_lf.lfCharSet = cf.bCharSet;
else
dwFlags |= CF_NOSCRIPTSEL;
m_lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
m_lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
m_lf.lfQuality = DEFAULT_QUALITY;
if((cf.dwMask & CFM_FACE) != 0)
{
m_lf.lfPitchAndFamily = cf.bPitchAndFamily;
#if (_RICHEDIT_VER >= 0x0200)
lstrcpy(m_lf.lfFaceName, cf.szFaceName);
#else
lstrcpy(m_lf.lfFaceName, A2T((LPSTR)cf.szFaceName));
#endif //(_RICHEDIT_VER >= 0x0200)
}
else
{
m_lf.lfPitchAndFamily = DEFAULT_PITCH|FF_DONTCARE;
m_lf.lfFaceName[0] = (TCHAR)0;
}
return dwFlags;
}
};
class CRichEditFontDialog : public CRichEditFontDialogImpl<CRichEditFontDialog>
{
public:
CRichEditFontDialog(const CHARFORMAT& charformat,
DWORD dwFlags = CF_SCREENFONTS,
HDC hDCPrinter = NULL,
HWND hWndParent = NULL)
: CRichEditFontDialogImpl<CRichEditFontDialog>(charformat, dwFlags, hDCPrinter, hWndParent)
{ }
DECLARE_EMPTY_MSG_MAP()
};
#endif //defined(_RICHEDIT_) && !defined(_WIN32_WCE)
///////////////////////////////////////////////////////////////////////////////
// CColorDialogImpl - color selection
#ifndef _WIN32_WCE
template <class T>
class ATL_NO_VTABLE CColorDialogImpl : public CCommonDialogImplBase
{
public:
CHOOSECOLOR m_cc;
// Constructor
CColorDialogImpl(COLORREF clrInit = 0, DWORD dwFlags = 0, HWND hWndParent = NULL)
{
memset(&m_cc, 0, sizeof(m_cc));
m_cc.lStructSize = sizeof(m_cc);
m_cc.lpCustColors = GetCustomColors();
m_cc.hwndOwner = hWndParent;
m_cc.Flags = dwFlags | CC_ENABLEHOOK;
m_cc.lpfnHook = (LPCCHOOKPROC)T::HookProc;
if(clrInit != 0)
{
m_cc.rgbResult = clrInit;
m_cc.Flags |= CC_RGBINIT;
}
}
// Operations
INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow())
{
ATLASSERT((m_cc.Flags & CC_ENABLEHOOK) != 0);
ATLASSERT(m_cc.lpfnHook != NULL); // can still be a user hook
if(m_cc.hwndOwner == NULL) // set only if not specified before
m_cc.hwndOwner = hWndParent;
ATLASSERT(m_hWnd == NULL);
#if (_ATL_VER >= 0x0700)
ATL::_AtlWinModule.AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this);
#else //!(_ATL_VER >= 0x0700)
_Module.AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this);
#endif //!(_ATL_VER >= 0x0700)
BOOL bRet = ::ChooseColor(&m_cc);
m_hWnd = NULL;
return bRet ? IDOK : IDCANCEL;
}
// Set the current color while dialog is displayed
void SetCurrentColor(COLORREF clr)
{
ATLASSERT(::IsWindow(m_hWnd));
SendMessage(_GetSetRGBMessage(), 0, (LPARAM)clr);
}
// Get the selected color after DoModal returns, or in OnColorOK
COLORREF GetColor() const
{
return m_cc.rgbResult;
}
// Special override for the color dialog
static UINT_PTR APIENTRY HookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if(uMsg != WM_INITDIALOG && uMsg != _GetColorOKMessage())
return 0;
LPCHOOSECOLOR lpCC = (LPCHOOSECOLOR)lParam;
CCommonDialogImplBase* pT = NULL;
if(uMsg == WM_INITDIALOG)
{
#if (_ATL_VER >= 0x0700)
pT = (CCommonDialogImplBase*)ATL::_AtlWinModule.ExtractCreateWndData();
#else //!(_ATL_VER >= 0x0700)
pT = (CCommonDialogImplBase*)_Module.ExtractCreateWndData();
#endif //!(_ATL_VER >= 0x0700)
lpCC->lCustData = (LPARAM)pT;
ATLASSERT(pT != NULL);
ATLASSERT(pT->m_hWnd == NULL);
ATLASSERT(::IsWindow(hWnd));
// subclass dialog's window
if(!pT->SubclassWindow(hWnd))
{
ATLTRACE2(atlTraceUI, 0, _T("Subclassing a Color common dialog failed\n"));
return 0;
}
}
else if(uMsg == _GetColorOKMessage())
{
pT = (CCommonDialogImplBase*)lpCC->lCustData;
ATLASSERT(pT != NULL);
ATLASSERT(::IsWindow(pT->m_hWnd));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -