📄 atldlgs.h
字号:
#ifdef UNICODE
const int BFFM_VALIDATEFAILED = 4;
#else
const int BFFM_VALIDATEFAILED = 3;
#endif
#endif // !BFFM_VALIDATEFAILED
#ifndef BFFM_IUNKNOWN
const int BFFM_IUNKNOWN = 5;
#endif // !BFFM_IUNKNOWN
#ifndef BIF_NEWDIALOGSTYLE
const UINT BIF_NEWDIALOGSTYLE = 0x0040;
#endif // !BIF_NEWDIALOGSTYLE
int nRet = 0;
T* pT = (T*)lpData;
bool bClear = false;
if(pT->m_hWnd == NULL)
{
pT->m_hWnd = hWnd;
bClear = true;
}
else
{
ATLASSERT(pT->m_hWnd == hWnd);
}
switch(uMsg)
{
case BFFM_INITIALIZED:
// Set initial selection
// Note that m_pidlInitialSelection, if set, takes precedence over m_lpstrInitialFolder
if(pT->m_pidlInitialSelection != NULL)
pT->SetSelection(pT->m_pidlInitialSelection);
else if(pT->m_lpstrInitialFolder != NULL)
pT->SetSelection(pT->m_lpstrInitialFolder);
// Expand initial selection if appropriate
if(pT->m_bExpandInitialSelection && ((pT->m_bi.ulFlags & BIF_NEWDIALOGSTYLE) != 0))
{
if(pT->m_pidlInitialSelection != NULL)
pT->SetExpanded(pT->m_pidlInitialSelection);
else if(pT->m_lpstrInitialFolder != NULL)
pT->SetExpanded(pT->m_lpstrInitialFolder);
}
pT->OnInitialized();
break;
case BFFM_SELCHANGED:
pT->OnSelChanged((LPITEMIDLIST)lParam);
break;
case BFFM_VALIDATEFAILED:
nRet = pT->OnValidateFailed((LPCTSTR)lParam);
break;
case BFFM_IUNKNOWN:
pT->OnIUnknown((IUnknown*)lParam);
break;
default:
ATLTRACE2(atlTraceUI, 0, _T("Unknown message received in CFolderDialogImpl::BrowseCallbackProc\n"));
break;
}
if(bClear)
pT->m_hWnd = NULL;
return nRet;
}
void OnInitialized()
{
}
void OnSelChanged(LPITEMIDLIST /*pItemIDList*/)
{
}
int OnValidateFailed(LPCTSTR /*lpstrFolderPath*/)
{
return 1; // 1=continue, 0=EndDialog
}
void OnIUnknown(IUnknown* /*pUnknown*/)
{
}
// Commands - valid to call only from handlers
void EnableOK(BOOL bEnable)
{
ATLASSERT(m_hWnd != NULL);
::SendMessage(m_hWnd, BFFM_ENABLEOK, 0, bEnable);
}
void SetSelection(LPCITEMIDLIST 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);
}
void SetOKText(LPCTSTR lpstrOKText)
{
#ifndef BFFM_SETOKTEXT
const UINT BFFM_SETOKTEXT = WM_USER + 105;
#endif
ATLASSERT(m_hWnd != NULL);
USES_CONVERSION;
LPCWSTR lpstr = T2CW(lpstrOKText);
::SendMessage(m_hWnd, BFFM_SETOKTEXT, (WPARAM)lpstr, 0L);
}
void SetExpanded(LPCITEMIDLIST pItemIDList)
{
#ifndef BFFM_SETEXPANDED
const UINT BFFM_SETEXPANDED = WM_USER + 106;
#endif
ATLASSERT(m_hWnd != NULL);
::SendMessage(m_hWnd, BFFM_SETEXPANDED, FALSE, (LPARAM)pItemIDList);
}
void SetExpanded(LPCTSTR lpstrFolderPath)
{
#ifndef BFFM_SETEXPANDED
const UINT BFFM_SETEXPANDED = WM_USER + 106;
#endif
ATLASSERT(m_hWnd != NULL);
USES_CONVERSION;
LPCWSTR lpstr = T2CW(lpstrFolderPath);
::SendMessage(m_hWnd, BFFM_SETEXPANDED, TRUE, (LPARAM)lpstr);
}
};
class CFolderDialog : public CFolderDialogImpl<CFolderDialog>
{
public:
CFolderDialog(HWND hWndParent = NULL, LPCTSTR lpstrTitle = NULL, UINT uFlags = BIF_RETURNONLYFSDIRS)
: CFolderDialogImpl<CFolderDialog>(hWndParent, lpstrTitle, uFlags)
{ }
};
#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;
CCommonDialogImplBase* pT = (CCommonDialogImplBase*)ModuleHelper::ExtractCreateWndData();
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;
m_lf = *lplfInitial;
}
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);
ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this);
BOOL bRet = ::ChooseFont(&m_cf);
m_hWnd = NULL;
if(bRet) // copy logical font from user's initialization buffer (if needed)
SecureHelper::memcpy_x(&m_lf, sizeof(m_lf), m_cf.lpLogFont, sizeof(m_lf));
return bRet ? IDOK : IDCANCEL;
}
// works only when the dialog is dislayed 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;
}
// works only when the dialog is dislayed or before
#ifndef _WIN32_WCE
void SetLogFont(LPLOGFONT lplf)
{
ATLASSERT(lplf != NULL);
#ifndef WM_CHOOSEFONT_SETLOGFONT
const UINT WM_CHOOSEFONT_SETLOGFONT = (WM_USER + 101);
#endif
if(m_hWnd != NULL)
{
::SendMessage(m_hWnd, WM_CHOOSEFONT_SETLOGFONT, 0, (LPARAM)lplf);
}
else
{
m_lf = *lplf;
m_cf.Flags |= CF_INITTOLOGFONTSTRUCT;
}
}
void SetFlags(DWORD dwFlags)
{
#ifndef WM_CHOOSEFONT_SETFLAGS
const UINT WM_CHOOSEFONT_SETFLAGS = (WM_USER + 102);
#endif
if(m_hWnd != NULL)
{
CHOOSEFONT cf = { sizeof(CHOOSEFONT) };
cf.Flags = dwFlags;
::SendMessage(m_hWnd, WM_CHOOSEFONT_SETFLAGS, 0, (LPARAM)&cf);
}
else
{
m_cf.Flags = dwFlags;
}
}
#endif // !_WIN32_WCE
// 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)
SecureHelper::strcpy_x(cf.szFaceName, _countof(cf.szFaceName), GetFaceName());
#else // !(_RICHEDIT_VER >= 0x0200)
SecureHelper::strcpyA_x(cf.szFaceName, _countof(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
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -