Update wtl to 8.1

This commit is contained in:
Nicholas 2015-01-23 11:32:27 +11:00
parent 2dd4e99ed6
commit 7de6792283
25 changed files with 5705 additions and 914 deletions

View File

@ -17,107 +17,15 @@
<Configurations> <Configurations>
<Configuration <Configuration
Name="Debug|Win32" Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" InheritedPropertySheets="$(SolutionDir)PropertySheets/Win32.Debug.vsprops"
> >
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration> </Configuration>
<Configuration <Configuration
Name="Release|Win32" Name="Release|Win32"
ConfigurationType="4" ConfigurationType="4"
InheritedPropertySheets="$(SolutionDir)PropertySheets/Win32.Release.vsprops" InheritedPropertySheets="$(SolutionDir)PropertySheets/Win32.Release.vsprops"
> >
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration> </Configuration>
</Configurations> </Configurations>
<References> <References>

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -15,7 +15,7 @@
#pragma once #pragma once
#ifndef __cplusplus #ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix) #error WTL requires C++ compilation (use a .cpp suffix)
#endif #endif
#ifndef __ATLBASE_H__ #ifndef __ATLBASE_H__
@ -34,11 +34,15 @@
#ifdef _ATL_NO_COMMODULE #ifdef _ATL_NO_COMMODULE
#error WTL requires that _ATL_NO_COMMODULE is not defined #error WTL requires that _ATL_NO_COMMODULE is not defined
#endif // _ATL_NO_COMMODULE #endif
#if (_ATL_VER >= 0x0900) && defined(_ATL_MIN_CRT)
#error _ATL_MIN_CRT is not supported with ATL 9.0 and higher
#endif
#if defined(_WIN32_WCE) && defined(_ATL_MIN_CRT) #if defined(_WIN32_WCE) && defined(_ATL_MIN_CRT)
#pragma message("Warning: WTL for Windows CE doesn't use _ATL_MIN_CRT") #pragma message("Warning: WTL for Windows CE doesn't use _ATL_MIN_CRT")
#endif // defined(_WIN32_WCE) && defined(_ATL_MIN_CRT) #endif
#include <limits.h> #include <limits.h>
#if !defined(_ATL_MIN_CRT) && defined(_MT) && !defined(_WIN32_WCE) #if !defined(_ATL_MIN_CRT) && defined(_MT) && !defined(_WIN32_WCE)
@ -51,8 +55,8 @@
#include <commctrl.h> #include <commctrl.h>
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
#pragma comment(lib, "comctl32.lib") #pragma comment(lib, "comctl32.lib")
#endif // !_WIN32_WCE #endif
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
#include "atlres.h" #include "atlres.h"
@ -63,11 +67,15 @@
// We need to disable this warning because of template class arguments // We need to disable this warning because of template class arguments
#pragma warning(disable: 4127) #pragma warning(disable: 4127)
#if (_ATL_VER >= 0x0900) && !defined(_SECURE_ATL)
#define _SECURE_ATL 1
#endif
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// WTL version number // WTL version number
#define _WTL_VER 0x0800 #define _WTL_VER 0x0810
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -80,8 +88,11 @@
// CAppModule // CAppModule
// CServerAppModule // CServerAppModule
// //
// CRegKeyEx
//
// Global functions: // Global functions:
// AtlGetDefaultGuiFont() // AtlGetDefaultGuiFont()
// AtlCreateControlFont()
// AtlCreateBoldFont() // AtlCreateBoldFont()
// AtlInitCommonControls() // AtlInitCommonControls()
@ -460,11 +471,15 @@ static CWndClassInfo& GetWndClassInfo() \
#endif // ATLVERIFY #endif // ATLVERIFY
#endif // (_ATL_VER < 0x0700) #endif // (_ATL_VER < 0x0700)
// Forward declaration for ATL3 fix // Forward declaration for ATL3 and ATL11 fix
#if (_ATL_VER < 0x0700) && defined(_ATL_DLL) && !defined(_WIN32_WCE) #if (((_ATL_VER < 0x0700) && defined(_ATL_DLL)) || (_ATL_VER >= 0x0B00)) && !defined(_WIN32_WCE)
namespace ATL { HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor); }; namespace ATL { HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor); };
#endif #endif
#ifndef WM_MOUSEHWHEEL
#define WM_MOUSEHWHEEL 0x020E
#endif
namespace WTL namespace WTL
{ {
@ -490,7 +505,7 @@ inline bool AtlIsOldWindows()
return (!bRet || !((ovi.dwMajorVersion >= 5) || (ovi.dwMajorVersion == 4 && ovi.dwMinorVersion >= 90))); return (!bRet || !((ovi.dwMajorVersion >= 5) || (ovi.dwMajorVersion == 4 && ovi.dwMinorVersion >= 90)));
} }
// default GUI font helper // Default GUI font helper - "MS Shell Dlg" stock font
inline HFONT AtlGetDefaultGuiFont() inline HFONT AtlGetDefaultGuiFont()
{ {
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
@ -500,24 +515,39 @@ inline HFONT AtlGetDefaultGuiFont()
#endif // _WIN32_WCE #endif // _WIN32_WCE
} }
// bold font helper (NOTE: Caller owns the font, and should destroy it when done using it) // Control font helper - default font for controls not in a dialog
// (NOTE: Caller owns the font, and should destroy it when it's no longer needed)
inline HFONT AtlCreateControlFont()
{
#ifndef _WIN32_WCE
LOGFONT lf = { 0 };
ATLVERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0) != FALSE);
HFONT hFont = ::CreateFontIndirect(&lf);
ATLASSERT(hFont != NULL);
return hFont;
#else // CE specific
return (HFONT)::GetStockObject(SYSTEM_FONT);
#endif // _WIN32_WCE
}
// Bold font helper
// (NOTE: Caller owns the font, and should destroy it when it's no longer needed)
inline HFONT AtlCreateBoldFont(HFONT hFont = NULL) inline HFONT AtlCreateBoldFont(HFONT hFont = NULL)
{ {
if(hFont == NULL)
hFont = AtlGetDefaultGuiFont();
ATLASSERT(hFont != NULL);
HFONT hFontBold = NULL;
LOGFONT lf = { 0 }; LOGFONT lf = { 0 };
if(::GetObject(hFont, sizeof(LOGFONT), &lf) == sizeof(LOGFONT)) #ifndef _WIN32_WCE
{ if(hFont == NULL)
lf.lfWeight = FW_BOLD; ATLVERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0) != FALSE);
hFontBold = ::CreateFontIndirect(&lf);
ATLASSERT(hFontBold != NULL);
}
else else
{ ATLVERIFY(::GetObject(hFont, sizeof(LOGFONT), &lf) == sizeof(LOGFONT));
ATLASSERT(FALSE); #else // CE specific
} if(hFont == NULL)
hFont = (HFONT)::GetStockObject(SYSTEM_FONT);
ATLVERIFY(::GetObject(hFont, sizeof(LOGFONT), &lf) == sizeof(LOGFONT));
#endif // _WIN32_WCE
lf.lfWeight = FW_BOLD;
HFONT hFontBold = ::CreateFontIndirect(&lf);
ATLASSERT(hFontBold != NULL);
return hFontBold; return hFontBold;
} }
@ -583,6 +613,70 @@ namespace RunTimeHelper
BOOL bRet = ::GetVersionEx(&ovi); BOOL bRet = ::GetVersionEx(&ovi);
return ((bRet != FALSE) && (ovi.dwMajorVersion >= 6)); return ((bRet != FALSE) && (ovi.dwMajorVersion >= 6));
} }
inline bool IsThemeAvailable()
{
bool bRet = false;
if(IsCommCtrl6())
{
HMODULE hThemeDLL = ::LoadLibrary(_T("uxtheme.dll"));
if(hThemeDLL != NULL)
{
typedef BOOL (STDAPICALLTYPE *PFN_IsThemeActive)();
PFN_IsThemeActive pfnIsThemeActive = (PFN_IsThemeActive)::GetProcAddress(hThemeDLL, "IsThemeActive");
ATLASSERT(pfnIsThemeActive != NULL);
bRet = (pfnIsThemeActive != NULL) && (pfnIsThemeActive() != FALSE);
if(bRet)
{
typedef BOOL (STDAPICALLTYPE *PFN_IsAppThemed)();
PFN_IsAppThemed pfnIsAppThemed = (PFN_IsAppThemed)::GetProcAddress(hThemeDLL, "IsAppThemed");
ATLASSERT(pfnIsAppThemed != NULL);
bRet = (pfnIsAppThemed != NULL) && (pfnIsAppThemed() != FALSE);
}
::FreeLibrary(hThemeDLL);
}
}
return bRet;
}
inline bool IsWin7()
{
OSVERSIONINFO ovi = { sizeof(OSVERSIONINFO) };
BOOL bRet = ::GetVersionEx(&ovi);
return ((bRet != FALSE) && (ovi.dwMajorVersion == 6) && (ovi.dwMinorVersion >= 1));
}
inline bool IsRibbonUIAvailable()
{
static INT iRibbonUI = -1;
#if defined(NTDDI_WIN7) && (NTDDI_VERSION >= NTDDI_WIN7)
if (iRibbonUI == -1)
{
HMODULE hRibbonDLL = ::LoadLibrary(_T("propsys.dll"));
if (hRibbonDLL != NULL)
{
const GUID CLSID_UIRibbonFramework = { 0x926749fa, 0x2615, 0x4987, { 0x88, 0x45, 0xc3, 0x3e, 0x65, 0xf2, 0xb9, 0x57 } };
// block - create instance
{
ATL::CComPtr<IUnknown> pIUIFramework;
iRibbonUI = SUCCEEDED(pIUIFramework.CoCreateInstance(CLSID_UIRibbonFramework)) ? 1 : 0;
}
::FreeLibrary(hRibbonDLL);
}
else
{
iRibbonUI = 0;
}
}
#endif // defined(NTDDI_WIN7) && (NTDDI_VERSION >= NTDDI_WIN7)
return (iRibbonUI == 1);
}
#endif // !_WIN32_WCE #endif // !_WIN32_WCE
inline int SizeOf_REBARBANDINFO() inline int SizeOf_REBARBANDINFO()
@ -848,7 +942,9 @@ namespace SecureHelper
return _vstprintf_s(lpstrBuff, cchBuff, lpstrFormat, args); return _vstprintf_s(lpstrBuff, cchBuff, lpstrFormat, args);
#else #else
cchBuff; // Avoid unused argument warning cchBuff; // Avoid unused argument warning
#pragma warning(disable: 4996)
return _vstprintf(lpstrBuff, lpstrFormat, args); return _vstprintf(lpstrBuff, lpstrFormat, args);
#pragma warning(default: 4996)
#endif #endif
} }
@ -882,6 +978,91 @@ namespace SecureHelper
}; // namespace SecureHelper }; // namespace SecureHelper
///////////////////////////////////////////////////////////////////////////////
// MinCrtHelper - helper functions for using _ATL_MIN_CRT
namespace MinCrtHelper
{
inline int _isspace(TCHAR ch)
{
#ifndef _ATL_MIN_CRT
return _istspace(ch);
#else // _ATL_MIN_CRT
WORD type = 0;
::GetStringTypeEx(::GetThreadLocale(), CT_CTYPE1, &ch, 1, &type);
return (type & C1_SPACE) == C1_SPACE;
#endif // _ATL_MIN_CRT
}
inline int _isdigit(TCHAR ch)
{
#ifndef _ATL_MIN_CRT
return _istdigit(ch);
#else // _ATL_MIN_CRT
WORD type = 0;
::GetStringTypeEx(::GetThreadLocale(), CT_CTYPE1, &ch, 1, &type);
return (type & C1_DIGIT) == C1_DIGIT;
#endif // _ATL_MIN_CRT
}
inline int _atoi(LPCTSTR str)
{
#ifndef _ATL_MIN_CRT
return _ttoi(str);
#else // _ATL_MIN_CRT
while(_isspace(*str) != 0)
++str;
TCHAR ch = *str++;
TCHAR sign = ch; // save sign indication
if(ch == _T('-') || ch == _T('+'))
ch = *str++; // skip sign
int total = 0;
while(_isdigit(ch) != 0)
{
total = 10 * total + (ch - '0'); // accumulate digit
ch = *str++; // get next char
}
return (sign == '-') ? -total : total; // return result, negated if necessary
#endif // _ATL_MIN_CRT
}
inline LPCTSTR _strrchr(LPCTSTR str, TCHAR ch)
{
#ifndef _ATL_MIN_CRT
return _tcsrchr(str, ch);
#else // _ATL_MIN_CRT
LPCTSTR lpsz = NULL;
while(*str != 0)
{
if(*str == ch)
lpsz = str;
str = ::CharNext(str);
}
return lpsz;
#endif // _ATL_MIN_CRT
}
inline LPTSTR _strrchr(LPTSTR str, TCHAR ch)
{
#ifndef _ATL_MIN_CRT
return _tcsrchr(str, ch);
#else // _ATL_MIN_CRT
LPTSTR lpsz = NULL;
while(*str != 0)
{
if(*str == ch)
lpsz = str;
str = ::CharNext(str);
}
return lpsz;
#endif // _ATL_MIN_CRT
}
}; // namespace MinCrtHelper
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// CMessageFilter - Interface for message filter support // CMessageFilter - Interface for message filter support
@ -1542,6 +1723,261 @@ public:
}; };
///////////////////////////////////////////////////////////////////////////////
// CRegKeyEx - adds type-specific methods to ATL3 CRegKey
#if (_ATL_VER < 0x0700)
class CRegKeyEx : public ATL::CRegKey
{
public:
// Constructors and operators
CRegKeyEx(HKEY hKey = NULL)
{
m_hKey = hKey;
}
CRegKeyEx(CRegKeyEx& key)
{
Attach(key.Detach());
}
CRegKeyEx& operator =(CRegKeyEx& key)
{
Close();
Attach(key.Detach());
return *this;
}
// Methods
LONG SetValue(LPCTSTR pszValueName, DWORD dwType, const void* pValue, ULONG nBytes)
{
ATLASSERT(m_hKey != NULL);
return ::RegSetValueEx(m_hKey, pszValueName, NULL, dwType, static_cast<const BYTE*>(pValue), nBytes);
}
LONG SetGUIDValue(LPCTSTR pszValueName, REFGUID guidValue)
{
ATLASSERT(m_hKey != NULL);
OLECHAR szGUID[64] = { 0 };
::StringFromGUID2(guidValue, szGUID, 64);
USES_CONVERSION;
LPCTSTR lpstr = OLE2CT(szGUID);
#ifndef _UNICODE
if(lpstr == NULL)
return E_OUTOFMEMORY;
#endif
return SetStringValue(pszValueName, lpstr);
}
LONG SetBinaryValue(LPCTSTR pszValueName, const void* pValue, ULONG nBytes)
{
ATLASSERT(m_hKey != NULL);
return ::RegSetValueEx(m_hKey, pszValueName, NULL, REG_BINARY, reinterpret_cast<const BYTE*>(pValue), nBytes);
}
LONG SetDWORDValue(LPCTSTR pszValueName, DWORD dwValue)
{
ATLASSERT(m_hKey != NULL);
return ::RegSetValueEx(m_hKey, pszValueName, NULL, REG_DWORD, reinterpret_cast<const BYTE*>(&dwValue), sizeof(DWORD));
}
#ifndef _WIN32_WCE
LONG SetQWORDValue(LPCTSTR pszValueName, ULONGLONG qwValue)
{
ATLASSERT(m_hKey != NULL);
return ::RegSetValueEx(m_hKey, pszValueName, NULL, REG_QWORD, reinterpret_cast<const BYTE*>(&qwValue), sizeof(ULONGLONG));
}
#endif
LONG SetStringValue(LPCTSTR pszValueName, LPCTSTR pszValue, DWORD dwType = REG_SZ)
{
ATLASSERT(m_hKey != NULL);
if(pszValue == NULL)
{
ATLASSERT(FALSE);
return ERROR_INVALID_DATA;
}
ATLASSERT((dwType == REG_SZ) || (dwType == REG_EXPAND_SZ));
return ::RegSetValueEx(m_hKey, pszValueName, NULL, dwType, reinterpret_cast<const BYTE*>(pszValue), (lstrlen(pszValue) + 1) * sizeof(TCHAR));
}
LONG SetMultiStringValue(LPCTSTR pszValueName, LPCTSTR pszValue)
{
ATLASSERT(m_hKey != NULL);
if(pszValue == NULL)
{
ATLASSERT(FALSE);
return ERROR_INVALID_DATA;
}
ULONG nBytes = 0;
ULONG nLength = 0;
LPCTSTR pszTemp = pszValue;
do
{
nLength = lstrlen(pszTemp) + 1;
pszTemp += nLength;
nBytes += nLength * sizeof(TCHAR);
} while (nLength != 1);
return ::RegSetValueEx(m_hKey, pszValueName, NULL, REG_MULTI_SZ, reinterpret_cast<const BYTE*>(pszValue), nBytes);
}
LONG QueryValue(LPCTSTR pszValueName, DWORD* pdwType, void* pData, ULONG* pnBytes)
{
ATLASSERT(m_hKey != NULL);
return ::RegQueryValueEx(m_hKey, pszValueName, NULL, pdwType, static_cast<LPBYTE>(pData), pnBytes);
}
LONG QueryGUIDValue(LPCTSTR pszValueName, GUID& guidValue)
{
ATLASSERT(m_hKey != NULL);
guidValue = GUID_NULL;
TCHAR szGUID[64] = { 0 };
ULONG nCount = 64;
LONG lRes = QueryStringValue(pszValueName, szGUID, &nCount);
if (lRes != ERROR_SUCCESS)
return lRes;
if(szGUID[0] != _T('{'))
return ERROR_INVALID_DATA;
USES_CONVERSION;
LPOLESTR lpstr = T2OLE(szGUID);
#ifndef _UNICODE
if(lpstr == NULL)
return E_OUTOFMEMORY;
#endif
HRESULT hr = ::CLSIDFromString(lpstr, &guidValue);
if (FAILED(hr))
return ERROR_INVALID_DATA;
return ERROR_SUCCESS;
}
LONG QueryBinaryValue(LPCTSTR pszValueName, void* pValue, ULONG* pnBytes)
{
ATLASSERT(pnBytes != NULL);
ATLASSERT(m_hKey != NULL);
DWORD dwType = 0;
LONG lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast<LPBYTE>(pValue), pnBytes);
if (lRes != ERROR_SUCCESS)
return lRes;
if (dwType != REG_BINARY)
return ERROR_INVALID_DATA;
return ERROR_SUCCESS;
}
LONG QueryDWORDValue(LPCTSTR pszValueName, DWORD& dwValue)
{
ATLASSERT(m_hKey != NULL);
ULONG nBytes = sizeof(DWORD);
DWORD dwType = 0;
LONG lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast<LPBYTE>(&dwValue), &nBytes);
if (lRes != ERROR_SUCCESS)
return lRes;
if (dwType != REG_DWORD)
return ERROR_INVALID_DATA;
return ERROR_SUCCESS;
}
LONG QueryQWORDValue(LPCTSTR pszValueName, ULONGLONG& qwValue)
{
ATLASSERT(m_hKey != NULL);
ULONG nBytes = sizeof(ULONGLONG);
DWORD dwType = 0;
LONG lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast<LPBYTE>(&qwValue), &nBytes);
if (lRes != ERROR_SUCCESS)
return lRes;
if (dwType != REG_QWORD)
return ERROR_INVALID_DATA;
return ERROR_SUCCESS;
}
LONG QueryStringValue(LPCTSTR pszValueName, LPTSTR pszValue, ULONG* pnChars)
{
ATLASSERT(m_hKey != NULL);
ATLASSERT(pnChars != NULL);
ULONG nBytes = (*pnChars) * sizeof(TCHAR);
DWORD dwType = 0;
*pnChars = 0;
LONG lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast<LPBYTE>(pszValue), &nBytes);
if (lRes != ERROR_SUCCESS)
{
return lRes;
}
if(dwType != REG_SZ && dwType != REG_EXPAND_SZ)
{
return ERROR_INVALID_DATA;
}
if (pszValue != NULL)
{
if(nBytes != 0)
{
if ((nBytes % sizeof(TCHAR) != 0) || (pszValue[nBytes / sizeof(TCHAR) -1] != 0))
return ERROR_INVALID_DATA;
}
else
{
pszValue[0] = _T('\0');
}
}
*pnChars = nBytes / sizeof(TCHAR);
return ERROR_SUCCESS;
}
LONG QueryMultiStringValue(LPCTSTR pszValueName, LPTSTR pszValue, ULONG* pnChars)
{
ATLASSERT(m_hKey != NULL);
ATLASSERT(pnChars != NULL);
if (pszValue != NULL && *pnChars < 2)
return ERROR_INSUFFICIENT_BUFFER;
ULONG nBytes = (*pnChars) * sizeof(TCHAR);
DWORD dwType = 0;
*pnChars = 0;
LONG lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast<LPBYTE>(pszValue), &nBytes);
if (lRes != ERROR_SUCCESS)
return lRes;
if (dwType != REG_MULTI_SZ)
return ERROR_INVALID_DATA;
if (pszValue != NULL && (nBytes % sizeof(TCHAR) != 0 || nBytes / sizeof(TCHAR) < 1 || pszValue[nBytes / sizeof(TCHAR) - 1] != 0 || ((nBytes / sizeof(TCHAR)) > 1 && pszValue[nBytes / sizeof(TCHAR) - 2] != 0)))
return ERROR_INVALID_DATA;
*pnChars = nBytes / sizeof(TCHAR);
return ERROR_SUCCESS;
}
};
#else // !(_ATL_VER < 0x0700)
typedef ATL::CRegKey CRegKeyEx;
#endif // !(_ATL_VER < 0x0700)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// CString forward reference (enables CString use in atluser.h and atlgdi.h) // CString forward reference (enables CString use in atluser.h and atlgdi.h)
@ -1575,9 +2011,10 @@ public:
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// General DLL version helpers (excluded from atlbase.h if _ATL_DLL is defined) // General DLL version helpers
// (ATL3: excluded from atlbase.h if _ATL_DLL is defined; ATL11: removed)
#if (_ATL_VER < 0x0700) && defined(_ATL_DLL) && !defined(_WIN32_WCE) #if (((_ATL_VER < 0x0700) && defined(_ATL_DLL)) || (_ATL_VER >= 0x0B00)) && !defined(_WIN32_WCE)
namespace ATL namespace ATL
{ {

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,6 +14,10 @@
#pragma once #pragma once
#ifndef __ATLAPP_H__
#error atlcrack.h requires atlapp.h to be included first
#endif
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Message map macro for cracked handlers // Message map macro for cracked handlers
@ -566,7 +570,7 @@ public: \
return TRUE; \ return TRUE; \
} }
// void OnNcPaint(CRgn rgn) // void OnNcPaint(CRgnHandle rgn)
#define MSG_WM_NCPAINT(func) \ #define MSG_WM_NCPAINT(func) \
if (uMsg == WM_NCPAINT) \ if (uMsg == WM_NCPAINT) \
{ \ { \
@ -795,7 +799,7 @@ public: \
return TRUE; \ return TRUE; \
} }
// void OnSysCommand(UINT nID, LPARAM lParam) // void OnSysCommand(UINT nID, CPoint point)
#define MSG_WM_SYSCOMMAND(func) \ #define MSG_WM_SYSCOMMAND(func) \
if (uMsg == WM_SYSCOMMAND) \ if (uMsg == WM_SYSCOMMAND) \
{ \ { \
@ -850,7 +854,7 @@ public: \
return TRUE; \ return TRUE; \
} }
// void OnInitMenu(CMenu menu) // void OnInitMenu(CMenuHandle menu)
#define MSG_WM_INITMENU(func) \ #define MSG_WM_INITMENU(func) \
if (uMsg == WM_INITMENU) \ if (uMsg == WM_INITMENU) \
{ \ { \
@ -861,7 +865,7 @@ public: \
return TRUE; \ return TRUE; \
} }
// void OnInitMenuPopup(CMenu menuPopup, UINT nIndex, BOOL bSysMenu) // void OnInitMenuPopup(CMenuHandle menuPopup, UINT nIndex, BOOL bSysMenu)
#define MSG_WM_INITMENUPOPUP(func) \ #define MSG_WM_INITMENUPOPUP(func) \
if (uMsg == WM_INITMENUPOPUP) \ if (uMsg == WM_INITMENUPOPUP) \
{ \ { \
@ -872,7 +876,7 @@ public: \
return TRUE; \ return TRUE; \
} }
// void OnMenuSelect(UINT nItemID, UINT nFlags, CMenu menu) // void OnMenuSelect(UINT nItemID, UINT nFlags, CMenuHandle menu)
#define MSG_WM_MENUSELECT(func) \ #define MSG_WM_MENUSELECT(func) \
if (uMsg == WM_MENUSELECT) \ if (uMsg == WM_MENUSELECT) \
{ \ { \
@ -883,7 +887,7 @@ public: \
return TRUE; \ return TRUE; \
} }
// LRESULT OnMenuChar(UINT nChar, UINT nFlags, CMenu menu) // LRESULT OnMenuChar(UINT nChar, UINT nFlags, CMenuHandle menu)
#define MSG_WM_MENUCHAR(func) \ #define MSG_WM_MENUCHAR(func) \
if (uMsg == WM_MENUCHAR) \ if (uMsg == WM_MENUCHAR) \
{ \ { \
@ -1544,7 +1548,7 @@ public: \
return TRUE; \ return TRUE; \
} }
// void OnSetFont(CFont font, BOOL bRedraw) // void OnSetFont(CFontHandle font, BOOL bRedraw)
#define MSG_WM_SETFONT(func) \ #define MSG_WM_SETFONT(func) \
if (uMsg == WM_SETFONT) \ if (uMsg == WM_SETFONT) \
{ \ { \
@ -1638,7 +1642,7 @@ public: \
#if(WINVER >= 0x0500) #if(WINVER >= 0x0500)
// void OnMenuRButtonUp(WPARAM wParam, CMenu menu) // void OnMenuRButtonUp(WPARAM wParam, CMenuHandle menu)
#define MSG_WM_MENURBUTTONUP(func) \ #define MSG_WM_MENURBUTTONUP(func) \
if (uMsg == WM_MENURBUTTONUP) \ if (uMsg == WM_MENURBUTTONUP) \
{ \ { \
@ -1649,7 +1653,7 @@ public: \
return TRUE; \ return TRUE; \
} }
// LRESULT OnMenuDrag(WPARAM wParam, CMenu menu) // LRESULT OnMenuDrag(WPARAM wParam, CMenuHandle menu)
#define MSG_WM_MENUDRAG(func) \ #define MSG_WM_MENUDRAG(func) \
if (uMsg == WM_MENUDRAG) \ if (uMsg == WM_MENUDRAG) \
{ \ { \
@ -1669,7 +1673,7 @@ public: \
return TRUE; \ return TRUE; \
} }
// void OnUnInitMenuPopup(UINT nID, CMenu menu) // void OnUnInitMenuPopup(UINT nID, CMenuHandle menu)
#define MSG_WM_UNINITMENUPOPUP(func) \ #define MSG_WM_UNINITMENUPOPUP(func) \
if (uMsg == WM_UNINITMENUPOPUP) \ if (uMsg == WM_UNINITMENUPOPUP) \
{ \ { \
@ -1680,7 +1684,7 @@ public: \
return TRUE; \ return TRUE; \
} }
// void OnMenuCommand(WPARAM nIndex, CMenu menu) // void OnMenuCommand(WPARAM nIndex, CMenuHandle menu)
#define MSG_WM_MENUCOMMAND(func) \ #define MSG_WM_MENUCOMMAND(func) \
if (uMsg == WM_MENUCOMMAND) \ if (uMsg == WM_MENUCOMMAND) \
{ \ { \

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifndef __ATLAPP_H__ #ifndef __ATLAPP_H__
#error atlctrls.h requires atlapp.h to be included first #error atlctrls.h requires atlapp.h to be included first
#endif #endif
@ -26,10 +22,6 @@
#error atlctrls.h requires atlwin.h to be included first #error atlctrls.h requires atlwin.h to be included first
#endif #endif
#if (_WIN32_IE < 0x0300)
#error atlctrls.h requires IE Version 3.0 or higher
#endif
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
#include <richedit.h> #include <richedit.h>
#include <richole.h> #include <richole.h>
@ -3922,15 +3914,19 @@ public:
} }
#endif // (_WIN32_WINNT >= 0x0600) #endif // (_WIN32_WINNT >= 0x0600)
// single-selection only // Note: selects only one item
BOOL SelectItem(int nIndex) BOOL SelectItem(int nIndex)
{ {
ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT((GetStyle() & LVS_SINGLESEL) != 0);
// multi-selection only: de-select all items
if((GetStyle() & LVS_SINGLESEL) == 0)
SetItemState(-1, 0, LVIS_SELECTED);
BOOL bRet = SetItemState(nIndex, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); BOOL bRet = SetItemState(nIndex, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
if(bRet) if(bRet)
bRet = EnsureVisible(nIndex, FALSE); bRet = EnsureVisible(nIndex, FALSE);
return bRet; return bRet;
} }
}; };

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifdef _WIN32_WCE #ifdef _WIN32_WCE
#error atlctrlw.h is not supported on Windows CE #error atlctrlw.h is not supported on Windows CE
#endif #endif
@ -3147,16 +3143,16 @@ public:
void _AddVistaBitmapsFromImageList(int nStartIndex, int nCount) void _AddVistaBitmapsFromImageList(int nStartIndex, int nCount)
{ {
// Create display compatible memory DC // Create display compatible memory DC
HDC hDC = ::GetDC(NULL); CClientDC dc(NULL);
CDC dcMem; CDC dcMem;
dcMem.CreateCompatibleDC(hDC); dcMem.CreateCompatibleDC(dc);
HBITMAP hBitmapSave = dcMem.GetCurrentBitmap(); HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();
T* pT = static_cast<T*>(this); T* pT = static_cast<T*>(this);
// Create bitmaps for all menu items // Create bitmaps for all menu items
for(int i = 0; i < nCount; i++) for(int i = 0; i < nCount; i++)
{ {
HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nStartIndex + i, hDC, dcMem); HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nStartIndex + i, dc, dcMem);
dcMem.SelectBitmap(hBitmapSave); dcMem.SelectBitmap(hBitmapSave);
m_arrVistaBitmap.Add(hBitmap); m_arrVistaBitmap.Add(hBitmap);
} }
@ -3165,14 +3161,14 @@ public:
void _AddVistaBitmapFromImageList(int nIndex) void _AddVistaBitmapFromImageList(int nIndex)
{ {
// Create display compatible memory DC // Create display compatible memory DC
HDC hDC = ::GetDC(NULL); CClientDC dc(NULL);
CDC dcMem; CDC dcMem;
dcMem.CreateCompatibleDC(hDC); dcMem.CreateCompatibleDC(dc);
HBITMAP hBitmapSave = dcMem.GetCurrentBitmap(); HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();
// Create bitmap for menu item // Create bitmap for menu item
T* pT = static_cast<T*>(this); T* pT = static_cast<T*>(this);
HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, hDC, dcMem); HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, dc, dcMem);
// Select saved bitmap back and add bitmap to the array // Select saved bitmap back and add bitmap to the array
dcMem.SelectBitmap(hBitmapSave); dcMem.SelectBitmap(hBitmapSave);
@ -3186,14 +3182,14 @@ public:
::DeleteObject(m_arrVistaBitmap[nIndex]); ::DeleteObject(m_arrVistaBitmap[nIndex]);
// Create display compatible memory DC // Create display compatible memory DC
HDC hDC = ::GetDC(NULL); CClientDC dc(NULL);
CDC dcMem; CDC dcMem;
dcMem.CreateCompatibleDC(hDC); dcMem.CreateCompatibleDC(dc);
HBITMAP hBitmapSave = dcMem.GetCurrentBitmap(); HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();
// Create bitmap for menu item // Create bitmap for menu item
T* pT = static_cast<T*>(this); T* pT = static_cast<T*>(this);
HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, hDC, dcMem); HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, dc, dcMem);
// Select saved bitmap back and replace bitmap in the array // Select saved bitmap back and replace bitmap in the array
dcMem.SelectBitmap(hBitmapSave); dcMem.SelectBitmap(hBitmapSave);

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifndef __ATLAPP_H__ #ifndef __ATLAPP_H__
#error atlctrlx.h requires atlapp.h to be included first #error atlctrlx.h requires atlapp.h to be included first
#endif #endif
@ -52,8 +48,6 @@
// CTabViewImpl<T, TBase, TWinTraits> // CTabViewImpl<T, TBase, TWinTraits>
// CTabView // CTabView
#include <ShellAPI.h>
namespace WTL namespace WTL
{ {
@ -572,7 +566,6 @@ public:
} }
}; };
class CBitmapButton : public CBitmapButtonImpl<CBitmapButton> class CBitmapButton : public CBitmapButtonImpl<CBitmapButton>
{ {
public: public:
@ -759,14 +752,16 @@ __declspec(selectany) struct
}; };
#endif // (WINVER < 0x0500) && !defined(_WIN32_WCE) #endif // (WINVER < 0x0500) && !defined(_WIN32_WCE)
#define HLINK_UNDERLINED 0x00000000 #define HLINK_UNDERLINED 0x00000000
#define HLINK_NOTUNDERLINED 0x00000001 #define HLINK_NOTUNDERLINED 0x00000001
#define HLINK_UNDERLINEHOVER 0x00000002 #define HLINK_UNDERLINEHOVER 0x00000002
#define HLINK_COMMANDBUTTON 0x00000004 #define HLINK_COMMANDBUTTON 0x00000004
#define HLINK_NOTIFYBUTTON 0x0000000C #define HLINK_NOTIFYBUTTON 0x0000000C
#define HLINK_USETAGS 0x00000010 #define HLINK_USETAGS 0x00000010
#define HLINK_USETAGSBOLD 0x00000030 #define HLINK_USETAGSBOLD 0x00000030
#define HLINK_NOTOOLTIP 0x00000040 #define HLINK_NOTOOLTIP 0x00000040
#define HLINK_AUTOCREATELINKFONT 0x00000080
#define HLINK_SINGLELINE 0x00000100
// Notes: // Notes:
// - HLINK_USETAGS and HLINK_USETAGSBOLD are always left-aligned // - HLINK_USETAGS and HLINK_USETAGSBOLD are always left-aligned
@ -780,7 +775,7 @@ public:
LPTSTR m_lpstrHyperLink; LPTSTR m_lpstrHyperLink;
HCURSOR m_hCursor; HCURSOR m_hCursor;
HFONT m_hFont; HFONT m_hFontLink;
HFONT m_hFontNormal; HFONT m_hFontNormal;
RECT m_rcLink; RECT m_rcLink;
@ -797,16 +792,17 @@ public:
bool m_bVisited:1; bool m_bVisited:1;
bool m_bHover:1; bool m_bHover:1;
bool m_bInternalLinkFont:1; bool m_bInternalLinkFont:1;
bool m_bInternalNormalFont:1;
// Constructor/Destructor // Constructor/Destructor
CHyperLinkImpl(DWORD dwExtendedStyle = HLINK_UNDERLINED) : CHyperLinkImpl(DWORD dwExtendedStyle = HLINK_UNDERLINED) :
m_lpstrLabel(NULL), m_lpstrHyperLink(NULL), m_lpstrLabel(NULL), m_lpstrHyperLink(NULL),
m_hCursor(NULL), m_hFont(NULL), m_hFontNormal(NULL), m_hCursor(NULL), m_hFontLink(NULL), m_hFontNormal(NULL),
m_clrLink(RGB(0, 0, 255)), m_clrVisited(RGB(128, 0, 128)), m_clrLink(RGB(0, 0, 255)), m_clrVisited(RGB(128, 0, 128)),
m_dwExtendedStyle(dwExtendedStyle), m_dwExtendedStyle(dwExtendedStyle),
m_bPaintLabel(true), m_bVisited(false), m_bPaintLabel(true), m_bVisited(false),
m_bHover(false), m_bInternalLinkFont(false) m_bHover(false), m_bInternalLinkFont(false), m_bInternalNormalFont(false)
{ {
::SetRectEmpty(&m_rcLink); ::SetRectEmpty(&m_rcLink);
} }
@ -815,8 +811,6 @@ public:
{ {
delete [] m_lpstrLabel; delete [] m_lpstrLabel;
delete [] m_lpstrHyperLink; delete [] m_lpstrHyperLink;
if(m_bInternalLinkFont && m_hFont != NULL)
::DeleteObject(m_hFont);
#if (WINVER < 0x0500) && !defined(_WIN32_WCE) #if (WINVER < 0x0500) && !defined(_WIN32_WCE)
// It was created, not loaded, so we have to destroy it // It was created, not loaded, so we have to destroy it
if(m_hCursor != NULL) if(m_hCursor != NULL)
@ -912,17 +906,21 @@ public:
HFONT GetLinkFont() const HFONT GetLinkFont() const
{ {
return m_hFont; return m_hFontLink;
} }
void SetLinkFont(HFONT hFont) void SetLinkFont(HFONT hFont)
{ {
if(m_bInternalLinkFont && m_hFont != NULL) if(m_bInternalLinkFont)
{ {
::DeleteObject(m_hFont); ::DeleteObject(m_hFontLink);
m_bInternalLinkFont = false; m_bInternalLinkFont = false;
} }
m_hFont = hFont;
m_hFontLink = hFont;
T* pT = static_cast<T*>(this);
pT->CalcLabelRect();
} }
int GetIdealHeight() const int GetIdealHeight() const
@ -933,15 +931,17 @@ public:
if(!m_bPaintLabel) if(!m_bPaintLabel)
return -1; return -1;
UINT uFormat = IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK;
CClientDC dc(m_hWnd); CClientDC dc(m_hWnd);
RECT rect = { 0 }; RECT rect = { 0 };
GetClientRect(&rect); GetClientRect(&rect);
HFONT hFontOld = dc.SelectFont(m_hFontNormal); HFONT hFontOld = dc.SelectFont(m_hFontNormal);
RECT rcText = rect; RECT rcText = rect;
dc.DrawText(_T("NS"), -1, &rcText, DT_LEFT | DT_WORDBREAK | DT_CALCRECT); dc.DrawText(_T("NS"), -1, &rcText, DT_LEFT | uFormat | DT_CALCRECT);
dc.SelectFont(m_hFont); dc.SelectFont(m_hFontLink);
RECT rcLink = rect; RECT rcLink = rect;
dc.DrawText(_T("NS"), -1, &rcLink, DT_LEFT | DT_WORDBREAK | DT_CALCRECT); dc.DrawText(_T("NS"), -1, &rcLink, DT_LEFT | uFormat | DT_CALCRECT);
dc.SelectFont(hFontOld); dc.SelectFont(hFontOld);
return max(rcText.bottom - rcText.top, rcLink.bottom - rcLink.top); return max(rcText.bottom - rcText.top, rcLink.bottom - rcLink.top);
} }
@ -985,17 +985,19 @@ public:
pT->CalcLabelParts(lpstrLeft, cchLeft, lpstrLink, cchLink, lpstrRight, cchRight); pT->CalcLabelParts(lpstrLeft, cchLeft, lpstrLink, cchLink, lpstrRight, cchRight);
// get label part rects // get label part rects
UINT uFormat = IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK;
HFONT hFontOld = dc.SelectFont(m_hFontNormal); HFONT hFontOld = dc.SelectFont(m_hFontNormal);
RECT rcLeft = rcClient; RECT rcLeft = rcClient;
dc.DrawText(lpstrLeft, cchLeft, &rcLeft, DT_LEFT | DT_WORDBREAK | DT_CALCRECT); dc.DrawText(lpstrLeft, cchLeft, &rcLeft, DT_LEFT | uFormat | DT_CALCRECT);
dc.SelectFont(m_hFont); dc.SelectFont(m_hFontLink);
RECT rcLink = { rcLeft.right, rcLeft.top, rcClient.right, rcClient.bottom }; RECT rcLink = { rcLeft.right, rcLeft.top, rcClient.right, rcClient.bottom };
dc.DrawText(lpstrLink, cchLink, &rcLink, DT_LEFT | DT_WORDBREAK | DT_CALCRECT); dc.DrawText(lpstrLink, cchLink, &rcLink, DT_LEFT | uFormat | DT_CALCRECT);
dc.SelectFont(m_hFontNormal); dc.SelectFont(m_hFontNormal);
RECT rcRight = { rcLink.right, rcLink.top, rcClient.right, rcClient.bottom }; RECT rcRight = { rcLink.right, rcLink.top, rcClient.right, rcClient.bottom };
dc.DrawText(lpstrRight, cchRight, &rcRight, DT_LEFT | DT_WORDBREAK | DT_CALCRECT); dc.DrawText(lpstrRight, cchRight, &rcRight, DT_LEFT | uFormat | DT_CALCRECT);
dc.SelectFont(hFontOld); dc.SelectFont(hFontOld);
@ -1005,17 +1007,18 @@ public:
else else
{ {
HFONT hOldFont = NULL; HFONT hOldFont = NULL;
if(m_hFont != NULL) if(m_hFontLink != NULL)
hOldFont = dc.SelectFont(m_hFont); hOldFont = dc.SelectFont(m_hFontLink);
LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink; LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink;
DWORD dwStyle = GetStyle(); DWORD dwStyle = GetStyle();
int nDrawStyle = DT_LEFT; UINT uFormat = DT_LEFT;
if (dwStyle & SS_CENTER) if (dwStyle & SS_CENTER)
nDrawStyle = DT_CENTER; uFormat = DT_CENTER;
else if (dwStyle & SS_RIGHT) else if (dwStyle & SS_RIGHT)
nDrawStyle = DT_RIGHT; uFormat = DT_RIGHT;
dc.DrawText(lpstrText, -1, &rcAll, nDrawStyle | DT_WORDBREAK | DT_CALCRECT); uFormat |= IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK;
if(m_hFont != NULL) dc.DrawText(lpstrText, -1, &rcAll, uFormat | DT_CALCRECT);
if(m_hFontLink != NULL)
dc.SelectFont(hOldFont); dc.SelectFont(hOldFont);
if (dwStyle & SS_CENTER) if (dwStyle & SS_CENTER)
{ {
@ -1053,6 +1056,8 @@ public:
{ {
ATLASSERT(m_hWnd == NULL); ATLASSERT(m_hWnd == NULL);
ATLASSERT(::IsWindow(hWnd)); ATLASSERT(::IsWindow(hWnd));
if(m_hFontNormal == NULL)
m_hFontNormal = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0L);
#if (_MSC_VER >= 1300) #if (_MSC_VER >= 1300)
BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits>::SubclassWindow(hWnd); BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits>::SubclassWindow(hWnd);
#else // !(_MSC_VER >= 1300) #else // !(_MSC_VER >= 1300)
@ -1102,6 +1107,28 @@ public:
return bRet; return bRet;
} }
void CreateLinkFontFromNormal()
{
if(m_bInternalLinkFont)
{
::DeleteObject(m_hFontLink);
m_bInternalLinkFont = false;
}
CFontHandle font = (m_hFontNormal != NULL) ? m_hFontNormal : (HFONT)::GetStockObject(SYSTEM_FONT);
LOGFONT lf = { 0 };
font.GetLogFont(&lf);
if(IsUsingTagsBold())
lf.lfWeight = FW_BOLD;
else if(!IsNotUnderlined())
lf.lfUnderline = TRUE;
m_hFontLink = ::CreateFontIndirect(&lf);
m_bInternalLinkFont = true;
ATLASSERT(m_hFontLink != NULL);
}
// Message map and handlers // Message map and handlers
BEGIN_MSG_MAP(CHyperLinkImpl) BEGIN_MSG_MAP(CHyperLinkImpl)
MESSAGE_HANDLER(WM_CREATE, OnCreate) MESSAGE_HANDLER(WM_CREATE, OnCreate)
@ -1147,6 +1174,21 @@ public:
m_tip.DestroyWindow(); m_tip.DestroyWindow();
m_tip.m_hWnd = NULL; m_tip.m_hWnd = NULL;
} }
if(m_bInternalLinkFont)
{
::DeleteObject(m_hFontLink);
m_hFontLink = NULL;
m_bInternalLinkFont = false;
}
if(m_bInternalNormalFont)
{
::DeleteObject(m_hFontNormal);
m_hFontNormal = NULL;
m_bInternalNormalFont = false;
}
bHandled = FALSE; bHandled = FALSE;
return 1; return 1;
} }
@ -1315,12 +1357,28 @@ public:
LRESULT OnSetFont(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) LRESULT OnSetFont(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{ {
if(m_bInternalNormalFont)
{
::DeleteObject(m_hFontNormal);
m_bInternalNormalFont = false;
}
bool bCreateLinkFont = m_bInternalLinkFont;
m_hFontNormal = (HFONT)wParam; m_hFontNormal = (HFONT)wParam;
if(bCreateLinkFont || IsAutoCreateLinkFont())
CreateLinkFontFromNormal();
T* pT = static_cast<T*>(this);
pT->CalcLabelRect();
if((BOOL)lParam) if((BOOL)lParam)
{ {
Invalidate(); Invalidate();
UpdateWindow(); UpdateWindow();
} }
return 0; return 0;
} }
@ -1373,26 +1431,17 @@ public:
#endif #endif
ATLASSERT(m_hCursor != NULL); ATLASSERT(m_hCursor != NULL);
// set font // set fonts
if(m_bPaintLabel) if(m_bPaintLabel)
{ {
ATL::CWindow wnd = GetParent();
m_hFontNormal = wnd.GetFont();
if(m_hFontNormal == NULL) if(m_hFontNormal == NULL)
m_hFontNormal = (HFONT)::GetStockObject(SYSTEM_FONT);
if(m_hFontNormal != NULL && m_hFont == NULL)
{ {
LOGFONT lf = { 0 }; m_hFontNormal = AtlCreateControlFont();
CFontHandle font = m_hFontNormal; m_bInternalNormalFont = true;
font.GetLogFont(&lf);
if(IsUsingTagsBold())
lf.lfWeight = FW_BOLD;
else if(!IsNotUnderlined())
lf.lfUnderline = TRUE;
m_hFont = ::CreateFontIndirect(&lf);
m_bInternalLinkFont = true;
ATLASSERT(m_hFont != NULL);
} }
if(m_hFontLink == NULL)
CreateLinkFontFromNormal();
} }
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
@ -1407,11 +1456,9 @@ public:
int nLen = GetWindowTextLength(); int nLen = GetWindowTextLength();
if(nLen > 0) if(nLen > 0)
{ {
CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff; ATLTRY(m_lpstrLabel = new TCHAR[nLen + 1]);
LPTSTR lpstrText = buff.Allocate(nLen + 1); if(m_lpstrLabel != NULL)
ATLASSERT(lpstrText != NULL); ATLVERIFY(GetWindowText(m_lpstrLabel, nLen + 1) > 0);
if((lpstrText != NULL) && (GetWindowText(lpstrText, nLen + 1) > 0))
SetLabel(lpstrText);
} }
} }
@ -1435,20 +1482,15 @@ public:
// set link colors // set link colors
if(m_bPaintLabel) if(m_bPaintLabel)
{ {
ATL::CRegKey rk; CRegKeyEx rk;
LONG lRet = rk.Open(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Internet Explorer\\Settings")); LONG lRet = rk.Open(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Internet Explorer\\Settings"));
if(lRet == 0) if(lRet == ERROR_SUCCESS)
{ {
const int cchValue = 12; const int cchValue = 12;
TCHAR szValue[cchValue] = { 0 }; TCHAR szValue[cchValue] = { 0 };
#if (_ATL_VER >= 0x0700)
ULONG ulCount = cchValue; ULONG ulCount = cchValue;
lRet = rk.QueryStringValue(_T("Anchor Color"), szValue, &ulCount); lRet = rk.QueryStringValue(_T("Anchor Color"), szValue, &ulCount);
#else if(lRet == ERROR_SUCCESS)
DWORD dwCount = cchValue * sizeof(TCHAR);
lRet = rk.QueryValue(szValue, _T("Anchor Color"), &dwCount);
#endif
if(lRet == 0)
{ {
COLORREF clr = pT->_ParseColorString(szValue); COLORREF clr = pT->_ParseColorString(szValue);
ATLASSERT(clr != CLR_INVALID); ATLASSERT(clr != CLR_INVALID);
@ -1456,14 +1498,9 @@ public:
m_clrLink = clr; m_clrLink = clr;
} }
#if (_ATL_VER >= 0x0700)
ulCount = cchValue; ulCount = cchValue;
lRet = rk.QueryStringValue(_T("Anchor Color Visited"), szValue, &ulCount); lRet = rk.QueryStringValue(_T("Anchor Color Visited"), szValue, &ulCount);
#else if(lRet == ERROR_SUCCESS)
dwCount = cchValue * sizeof(TCHAR);
lRet = rk.QueryValue(szValue, _T("Anchor Color Visited"), &dwCount);
#endif
if(lRet == 0)
{ {
COLORREF clr = pT->_ParseColorString(szValue); COLORREF clr = pT->_ParseColorString(szValue);
ATLASSERT(clr != CLR_INVALID); ATLASSERT(clr != CLR_INVALID);
@ -1485,7 +1522,7 @@ public:
if(*p == _T(',')) if(*p == _T(','))
{ {
*p = _T('\0'); *p = _T('\0');
c[i] = T::_xttoi(lpstr); c[i] = MinCrtHelper::_atoi(lpstr);
lpstr = &p[1]; lpstr = &p[1];
break; break;
} }
@ -1495,7 +1532,7 @@ public:
} }
if(*lpstr == _T('\0')) if(*lpstr == _T('\0'))
return CLR_INVALID; return CLR_INVALID;
c[2] = T::_xttoi(lpstr); c[2] = MinCrtHelper::_atoi(lpstr);
return RGB(c[0], c[1], c[2]); return RGB(c[0], c[1], c[2]);
} }
@ -1532,15 +1569,17 @@ public:
// get label part rects // get label part rects
HFONT hFontOld = dc.SelectFont(m_hFontNormal); HFONT hFontOld = dc.SelectFont(m_hFontNormal);
UINT uFormat = IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK;
RECT rcLeft = rcClient; RECT rcLeft = rcClient;
if(lpstrLeft != NULL) if(lpstrLeft != NULL)
dc.DrawText(lpstrLeft, cchLeft, &rcLeft, DT_LEFT | DT_WORDBREAK | DT_CALCRECT); dc.DrawText(lpstrLeft, cchLeft, &rcLeft, DT_LEFT | uFormat | DT_CALCRECT);
dc.SelectFont(m_hFont); dc.SelectFont(m_hFontLink);
RECT rcLink = rcClient; RECT rcLink = rcClient;
if(lpstrLeft != NULL) if(lpstrLeft != NULL)
rcLink.left = rcLeft.right; rcLink.left = rcLeft.right;
dc.DrawText(lpstrLink, cchLink, &rcLink, DT_LEFT | DT_WORDBREAK | DT_CALCRECT); dc.DrawText(lpstrLink, cchLink, &rcLink, DT_LEFT | uFormat | DT_CALCRECT);
dc.SelectFont(hFontOld); dc.SelectFont(hFontOld);
@ -1549,17 +1588,18 @@ public:
else else
{ {
HFONT hOldFont = NULL; HFONT hOldFont = NULL;
if(m_hFont != NULL) if(m_hFontLink != NULL)
hOldFont = dc.SelectFont(m_hFont); hOldFont = dc.SelectFont(m_hFontLink);
LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink; LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink;
DWORD dwStyle = GetStyle(); DWORD dwStyle = GetStyle();
int nDrawStyle = DT_LEFT; UINT uFormat = DT_LEFT;
if (dwStyle & SS_CENTER) if (dwStyle & SS_CENTER)
nDrawStyle = DT_CENTER; uFormat = DT_CENTER;
else if (dwStyle & SS_RIGHT) else if (dwStyle & SS_RIGHT)
nDrawStyle = DT_RIGHT; uFormat = DT_RIGHT;
dc.DrawText(lpstrText, -1, &m_rcLink, nDrawStyle | DT_WORDBREAK | DT_CALCRECT); uFormat |= IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK;
if(m_hFont != NULL) dc.DrawText(lpstrText, -1, &m_rcLink, uFormat | DT_CALCRECT);
if(m_hFontLink != NULL)
dc.SelectFont(hOldFont); dc.SelectFont(hOldFont);
if (dwStyle & SS_CENTER) if (dwStyle & SS_CENTER)
{ {
@ -1656,23 +1696,25 @@ public:
dc.SetBkMode(TRANSPARENT); dc.SetBkMode(TRANSPARENT);
HFONT hFontOld = dc.SelectFont(m_hFontNormal); HFONT hFontOld = dc.SelectFont(m_hFontNormal);
UINT uFormat = IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK;
if(lpstrLeft != NULL) if(lpstrLeft != NULL)
dc.DrawText(lpstrLeft, cchLeft, &rcClient, DT_LEFT | DT_WORDBREAK); dc.DrawText(lpstrLeft, cchLeft, &rcClient, DT_LEFT | uFormat);
COLORREF clrOld = dc.SetTextColor(IsWindowEnabled() ? (m_bVisited ? m_clrVisited : m_clrLink) : (::GetSysColor(COLOR_GRAYTEXT))); COLORREF clrOld = dc.SetTextColor(IsWindowEnabled() ? (m_bVisited ? m_clrVisited : m_clrLink) : (::GetSysColor(COLOR_GRAYTEXT)));
if(m_hFont != NULL && (!IsUnderlineHover() || (IsUnderlineHover() && m_bHover))) if(m_hFontLink != NULL && (!IsUnderlineHover() || (IsUnderlineHover() && m_bHover)))
dc.SelectFont(m_hFont); dc.SelectFont(m_hFontLink);
else else
dc.SelectFont(m_hFontNormal); dc.SelectFont(m_hFontNormal);
dc.DrawText(lpstrLink, cchLink, &m_rcLink, DT_LEFT | DT_WORDBREAK); dc.DrawText(lpstrLink, cchLink, &m_rcLink, DT_LEFT | uFormat);
dc.SetTextColor(clrOld); dc.SetTextColor(clrOld);
dc.SelectFont(m_hFontNormal); dc.SelectFont(m_hFontNormal);
if(lpstrRight != NULL) if(lpstrRight != NULL)
{ {
RECT rcRight = { m_rcLink.right, m_rcLink.top, rcClient.right, rcClient.bottom }; RECT rcRight = { m_rcLink.right, m_rcLink.top, rcClient.right, rcClient.bottom };
dc.DrawText(lpstrRight, cchRight, &rcRight, DT_LEFT | DT_WORDBREAK); dc.DrawText(lpstrRight, cchRight, &rcRight, DT_LEFT | uFormat);
} }
if(GetFocus() == m_hWnd) if(GetFocus() == m_hWnd)
@ -1686,21 +1728,22 @@ public:
COLORREF clrOld = dc.SetTextColor(IsWindowEnabled() ? (m_bVisited ? m_clrVisited : m_clrLink) : (::GetSysColor(COLOR_GRAYTEXT))); COLORREF clrOld = dc.SetTextColor(IsWindowEnabled() ? (m_bVisited ? m_clrVisited : m_clrLink) : (::GetSysColor(COLOR_GRAYTEXT)));
HFONT hFontOld = NULL; HFONT hFontOld = NULL;
if(m_hFont != NULL && (!IsUnderlineHover() || (IsUnderlineHover() && m_bHover))) if(m_hFontLink != NULL && (!IsUnderlineHover() || (IsUnderlineHover() && m_bHover)))
hFontOld = dc.SelectFont(m_hFont); hFontOld = dc.SelectFont(m_hFontLink);
else else
hFontOld = dc.SelectFont(m_hFontNormal); hFontOld = dc.SelectFont(m_hFontNormal);
LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink; LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink;
DWORD dwStyle = GetStyle(); DWORD dwStyle = GetStyle();
int nDrawStyle = DT_LEFT; UINT uFormat = DT_LEFT;
if (dwStyle & SS_CENTER) if (dwStyle & SS_CENTER)
nDrawStyle = DT_CENTER; uFormat = DT_CENTER;
else if (dwStyle & SS_RIGHT) else if (dwStyle & SS_RIGHT)
nDrawStyle = DT_RIGHT; uFormat = DT_RIGHT;
uFormat |= IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK;
dc.DrawText(lpstrText, -1, &m_rcLink, nDrawStyle | DT_WORDBREAK); dc.DrawText(lpstrText, -1, &m_rcLink, uFormat);
if(GetFocus() == m_hWnd) if(GetFocus() == m_hWnd)
dc.DrawFocusRect(&m_rcLink); dc.DrawFocusRect(&m_rcLink);
@ -1762,33 +1805,17 @@ public:
return ((m_dwExtendedStyle & HLINK_NOTOOLTIP) == 0); return ((m_dwExtendedStyle & HLINK_NOTOOLTIP) == 0);
} }
static int _xttoi(const TCHAR* nptr) bool IsAutoCreateLinkFont() const
{ {
#ifndef _ATL_MIN_CRT return ((m_dwExtendedStyle & HLINK_AUTOCREATELINKFONT) == HLINK_AUTOCREATELINKFONT);
return _ttoi(nptr); }
#else // _ATL_MIN_CRT
while(*nptr == _T(' ')) // skip spaces
++nptr;
int c = (int)(_TUCHAR)*nptr++; bool IsSingleLine() const
int sign = c; // save sign indication {
if (c == _T('-') || c == _T('+')) return ((m_dwExtendedStyle & HLINK_SINGLELINE) == HLINK_SINGLELINE);
c = (int)(_TUCHAR)*nptr++; // skip sign
int total = 0;
while((TCHAR)c >= _T('0') && (TCHAR)c <= _T('9'))
{
total = 10 * total + ((TCHAR)c - _T('0')); // accumulate digit
c = (int)(_TUCHAR)*nptr++; // get next char
}
// return result, negated if necessary
return ((TCHAR)sign != _T('-')) ? total : -total;
#endif // _ATL_MIN_CRT
} }
}; };
class CHyperLink : public CHyperLinkImpl<CHyperLink> class CHyperLink : public CHyperLinkImpl<CHyperLink>
{ {
public: public:
@ -2244,10 +2271,12 @@ public:
int m_cxyHeader; int m_cxyHeader;
TCHAR m_szTitle[m_cchTitle]; TCHAR m_szTitle[m_cchTitle];
DWORD m_dwExtendedStyle; // Pane container specific extended styles DWORD m_dwExtendedStyle; // Pane container specific extended styles
HFONT m_hFont;
bool m_bInternalFont;
// Constructor // Constructor
CPaneContainerImpl() : m_cxyHeader(0), m_dwExtendedStyle(0) CPaneContainerImpl() : m_cxyHeader(0), m_dwExtendedStyle(0), m_hFont(NULL), m_bInternalFont(false)
{ {
m_szTitle[0] = 0; m_szTitle[0] = 0;
} }
@ -2391,8 +2420,11 @@ public:
// Message map and handlers // Message map and handlers
BEGIN_MSG_MAP(CPaneContainerImpl) BEGIN_MSG_MAP(CPaneContainerImpl)
MESSAGE_HANDLER(WM_CREATE, OnCreate) MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_SIZE, OnSize) MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
MESSAGE_HANDLER(WM_GETFONT, OnGetFont)
MESSAGE_HANDLER(WM_SETFONT, OnSetFont)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
MESSAGE_HANDLER(WM_PAINT, OnPaint) MESSAGE_HANDLER(WM_PAINT, OnPaint)
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
@ -2405,6 +2437,27 @@ public:
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{ {
if(m_hFont == NULL)
{
// The same as AtlCreateControlFont() for horizontal pane
#ifndef _WIN32_WCE
LOGFONT lf = { 0 };
ATLVERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0) != FALSE);
if(IsVertical())
lf.lfEscapement = 900; // 90 degrees
m_hFont = ::CreateFontIndirect(&lf);
#else // CE specific
m_hFont = (HFONT)::GetStockObject(SYSTEM_FONT);
if(IsVertical())
{
CLogFont lf(m_hFont);
lf.lfEscapement = 900; // 90 degrees
m_hFont = ::CreateFontIndirect(&lf);
}
#endif // _WIN32_WCE
m_bInternalFont = true;
}
T* pT = static_cast<T*>(this); T* pT = static_cast<T*>(this);
pT->CalcSize(); pT->CalcSize();
@ -2414,6 +2467,18 @@ public:
return 0; return 0;
} }
LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
if(m_bInternalFont)
{
::DeleteObject(m_hFont);
m_hFont = NULL;
m_bInternalFont = false;
}
return 0;
}
LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{ {
T* pT = static_cast<T*>(this); T* pT = static_cast<T*>(this);
@ -2428,6 +2493,30 @@ public:
return 0; return 0;
} }
LRESULT OnGetFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
return (LRESULT)m_hFont;
}
LRESULT OnSetFont(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
if(m_bInternalFont)
{
::DeleteObject(m_hFont);
m_bInternalFont = false;
}
m_hFont = (HFONT)wParam;
T* pT = static_cast<T*>(this);
pT->CalcSize();
if((BOOL)lParam != FALSE)
pT->UpdateLayout();
return 0;
}
LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{ {
return 1; // no background needed return 1; // no background needed
@ -2624,6 +2713,8 @@ public:
{ {
T* pT = static_cast<T*>(this); T* pT = static_cast<T*>(this);
CFontHandle font = pT->GetTitleFont(); CFontHandle font = pT->GetTitleFont();
if(font.IsNull())
font = (HFONT)::GetStockObject(SYSTEM_FONT);
LOGFONT lf = { 0 }; LOGFONT lf = { 0 };
font.GetLogFont(lf); font.GetLogFont(lf);
if(IsVertical()) if(IsVertical())
@ -2640,7 +2731,7 @@ public:
HFONT GetTitleFont() const HFONT GetTitleFont() const
{ {
return AtlGetDefaultGuiFont(); return m_hFont;
} }
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
@ -2675,23 +2766,42 @@ public:
} }
dc.FillRect(&rect, COLOR_3DFACE); dc.FillRect(&rect, COLOR_3DFACE);
if(!IsVertical()) // draw title only for horizontal pane container // draw title text
dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
dc.SetBkMode(TRANSPARENT);
T* pT = static_cast<T*>(this);
HFONT hFontOld = dc.SelectFont(pT->GetTitleFont());
#ifdef _WIN32_WCE
const UINT DT_END_ELLIPSIS = 0;
#endif // _WIN32_WCE
if(IsVertical())
{
rect.top += m_cxyTextOffset;
rect.bottom -= m_cxyTextOffset;
if(m_tb.m_hWnd != NULL)
rect.top += m_cxToolBar;;
RECT rcCalc = { rect.left, rect.bottom, rect.right, rect.top };
int cxFont = dc.DrawText(m_szTitle, -1, &rcCalc, DT_TOP | DT_SINGLELINE | DT_END_ELLIPSIS | DT_CALCRECT);
RECT rcText = { 0 };
rcText.left = (rect.right - rect.left - cxFont) / 2;
rcText.right = rcText.left + (rect.bottom - rect.top);
rcText.top = rect.bottom;
rcText.bottom = rect.top;
dc.DrawText(m_szTitle, -1, &rcText, DT_TOP | DT_SINGLELINE | DT_END_ELLIPSIS);
}
else
{ {
dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
dc.SetBkMode(TRANSPARENT);
T* pT = static_cast<T*>(this);
HFONT hFontOld = dc.SelectFont(pT->GetTitleFont());
rect.left += m_cxyTextOffset; rect.left += m_cxyTextOffset;
rect.right -= m_cxyTextOffset; rect.right -= m_cxyTextOffset;
if(m_tb.m_hWnd != NULL) if(m_tb.m_hWnd != NULL)
rect.right -= m_cxToolBar;; rect.right -= m_cxToolBar;;
#ifndef _WIN32_WCE
dc.DrawText(m_szTitle, -1, &rect, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS); dc.DrawText(m_szTitle, -1, &rect, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS);
#else // CE specific
dc.DrawText(m_szTitle, -1, &rect, DT_LEFT | DT_SINGLELINE | DT_VCENTER);
#endif // _WIN32_WCE
dc.SelectFont(hFontOld);
} }
dc.SelectFont(hFontOld);
} }
// called only if pane is empty // called only if pane is empty
@ -3687,9 +3797,11 @@ public:
bool m_bActiveAsDefaultMenuItem:1; bool m_bActiveAsDefaultMenuItem:1;
bool m_bEmptyMenuItem:1; bool m_bEmptyMenuItem:1;
bool m_bWindowsMenuItem:1; bool m_bWindowsMenuItem:1;
bool m_bNoTabDrag:1;
// internal // internal
bool m_bTabCapture:1; bool m_bTabCapture:1;
bool m_bTabDrag:1; bool m_bTabDrag:1;
bool m_bInternalFont:1;
// Constructor/destructor // Constructor/destructor
CTabViewImpl() : CTabViewImpl() :
@ -3707,8 +3819,10 @@ public:
m_bActiveAsDefaultMenuItem(false), m_bActiveAsDefaultMenuItem(false),
m_bEmptyMenuItem(false), m_bEmptyMenuItem(false),
m_bWindowsMenuItem(false), m_bWindowsMenuItem(false),
m_bNoTabDrag(false),
m_bTabCapture(false), m_bTabCapture(false),
m_bTabDrag(false) m_bTabDrag(false),
m_bInternalFont(false)
{ {
m_ptStartDrag.x = 0; m_ptStartDrag.x = 0;
m_ptStartDrag.y = 0; m_ptStartDrag.y = 0;
@ -4260,6 +4374,8 @@ public:
MESSAGE_HANDLER(WM_DESTROY, OnDestroy) MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_SIZE, OnSize) MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
MESSAGE_HANDLER(WM_GETFONT, OnGetFont)
MESSAGE_HANDLER(WM_SETFONT, OnSetFont)
NOTIFY_HANDLER(m_nTabID, TCN_SELCHANGE, OnTabChanged) NOTIFY_HANDLER(m_nTabID, TCN_SELCHANGE, OnTabChanged)
NOTIFY_ID_HANDLER(m_nTabID, OnTabNotification) NOTIFY_ID_HANDLER(m_nTabID, OnTabNotification)
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
@ -4294,6 +4410,14 @@ public:
il.Destroy(); il.Destroy();
} }
if(m_bInternalFont)
{
HFONT hFont = m_tab.GetFont();
m_tab.SetFont(NULL, FALSE);
::DeleteObject(hFont);
m_bInternalFont = false;
}
return 0; return 0;
} }
@ -4311,6 +4435,32 @@ public:
return 0; return 0;
} }
LRESULT OnGetFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
return m_tab.SendMessage(WM_GETFONT);
}
LRESULT OnSetFont(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
if(m_bInternalFont)
{
HFONT hFont = m_tab.GetFont();
m_tab.SetFont(NULL, FALSE);
::DeleteObject(hFont);
m_bInternalFont = false;
}
m_tab.SendMessage(WM_SETFONT, wParam, lParam);
T* pT = static_cast<T*>(this);
m_cyTabHeight = pT->CalcTabHeight();
if((BOOL)lParam != FALSE)
pT->UpdateLayout();
return 0;
}
LRESULT OnTabChanged(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) LRESULT OnTabChanged(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
{ {
SetActivePage(m_tab.GetCurSel()); SetActivePage(m_tab.GetCurSel());
@ -4348,7 +4498,7 @@ public:
// Tab control message handlers // Tab control message handlers
LRESULT OnTabLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) LRESULT OnTabLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
{ {
if(m_tab.GetItemCount() > 1) if(!m_bNoTabDrag && (m_tab.GetItemCount() > 1))
{ {
m_bTabCapture = true; m_bTabCapture = true;
m_tab.SetCapture(); m_tab.SetCapture();
@ -4565,7 +4715,8 @@ public:
if(m_tab.m_hWnd == NULL) if(m_tab.m_hWnd == NULL)
return false; return false;
m_tab.SetFont(AtlGetDefaultGuiFont()); m_tab.SetFont(AtlCreateControlFont());
m_bInternalFont = true;
m_tab.SetItemExtra(sizeof(TABVIEWPAGE)); m_tab.SetItemExtra(sizeof(TABVIEWPAGE));
@ -4817,7 +4968,6 @@ public:
} }
}; };
class CTabView : public CTabViewImpl<CTabView> class CTabView : public CTabViewImpl<CTabView>
{ {
public: public:

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifndef __ATLAPP_H__ #ifndef __ATLAPP_H__
#error atlddx.h requires atlapp.h to be included first #error atlddx.h requires atlapp.h to be included first
#endif #endif
@ -142,6 +138,23 @@ namespace WTL
return TRUE; \ return TRUE; \
} }
// DDX support for Tab, Combo, ListBox and ListView selection index
// Note: Specialized versions require atlctrls.h to be included first
#if (_MSC_VER >= 1300)
#define DDX_INDEX(CtrlClass, nID, var) \
if(nCtlID == (UINT)-1 || nCtlID == nID) \
DDX_Index<CtrlClass>(nID, var, bSaveAndValidate);
#ifdef __ATLCTRLS_H__
#define DDX_TAB_INDEX(nID, var) DDX_INDEX(WTL::CTabCtrl, nID, var)
#define DDX_COMBO_INDEX(nID, var) DDX_INDEX(WTL::CComboBox, nID, var)
#define DDX_LISTBOX_INDEX(nID, var) DDX_INDEX(WTL::CListBox, nID, var)
#define DDX_LISTVIEW_INDEX(nID, var) DDX_INDEX(WTL::CListViewCtrl, nID, var)
#endif // __ATLCTRLS_H__
#endif // (_MSC_VER >= 1300)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// CWinDataExchange - provides support for DDX // CWinDataExchange - provides support for DDX
@ -601,6 +614,54 @@ public:
while (hWndCtrl != NULL && !(GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP)); while (hWndCtrl != NULL && !(GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP));
} }
// DDX support for Tab, Combo, ListBox and ListView selection index
#if (_MSC_VER >= 1300)
template <class TCtrl>
INT _getSel(TCtrl& tCtrl)
{
return tCtrl.GetCurSel();
}
template <class TCtrl>
void _setSel(TCtrl& tCtrl, INT iSel)
{
if(iSel < 0)
tCtrl.SetCurSel(-1);
else
tCtrl.SetCurSel(iSel);
}
#ifdef __ATLCTRLS_H__
// ListViewCtrl specialization
template <>
INT _getSel(WTL::CListViewCtrl& tCtrl)
{
return tCtrl.GetSelectedIndex();
}
template <>
void _setSel(WTL::CListViewCtrl& tCtrl, INT iSel)
{
if(iSel < 0)
tCtrl.SelectItem(-1);
else
tCtrl.SelectItem(iSel);
}
#endif // __ATLCTRLS_H__
template <class TCtrl>
void DDX_Index(UINT nID, INT& nVal, BOOL bSave)
{
T* pT = static_cast<T*>(this);
TCtrl ctrl(pT->GetDlgItem(nID));
if(bSave)
nVal = _getSel(ctrl);
else
_setSel(ctrl, nVal);
}
#endif // (_MSC_VER >= 1300)
// Overrideables // Overrideables
void OnDataExchangeError(UINT nCtrlID, BOOL /*bSave*/) void OnDataExchangeError(UINT nCtrlID, BOOL /*bSave*/)
{ {

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifndef __ATLAPP_H__ #ifndef __ATLAPP_H__
#error atldlgs.h requires atlapp.h to be included first #error atldlgs.h requires atlapp.h to be included first
#endif #endif
@ -64,6 +60,7 @@
// CFindReplaceDialogImpl<T> // CFindReplaceDialogImpl<T>
// CFindReplaceDialog // CFindReplaceDialog
// //
// CDialogBaseUnits
// CMemDlgTemplate // CMemDlgTemplate
// CIndirectDialogImpl<T, TDlgTemplate, TBase> // CIndirectDialogImpl<T, TDlgTemplate, TBase>
// //
@ -151,7 +148,12 @@ public:
m_bOpenFileDialog = bOpenFileDialog; m_bOpenFileDialog = bOpenFileDialog;
#if defined(__AYGSHELL_H__) && (_WIN32_WCE >= 0x0501)
m_ofn.lStructSize = bOpenFileDialog ? sizeof(m_ofn) : sizeof(OPENFILENAME);
#else
m_ofn.lStructSize = sizeof(m_ofn); m_ofn.lStructSize = sizeof(m_ofn);
#endif
#if (_WIN32_WINNT >= 0x0500) #if (_WIN32_WINNT >= 0x0500)
// adjust struct size if running on older version of Windows // adjust struct size if running on older version of Windows
if(AtlIsOldWindows()) if(AtlIsOldWindows())
@ -512,7 +514,7 @@ public:
if (pStr[nLength + 1] == 0) if (pStr[nLength + 1] == 0)
{ {
// The OFN buffer contains a single item so extract its path. // The OFN buffer contains a single item so extract its path.
LPCTSTR pSep = _strrchr(pStr, _T('\\')); LPCTSTR pSep = MinCrtHelper::_strrchr(pStr, _T('\\'));
if (pSep != NULL) if (pSep != NULL)
nLength = (int)(DWORD_PTR)(pSep - pStr); nLength = (int)(DWORD_PTR)(pSep - pStr);
} }
@ -570,7 +572,7 @@ public:
else else
{ {
// A single item was selected. Skip forward past the path. // A single item was selected. Skip forward past the path.
LPCTSTR pSep = _strrchr(pStr, _T('\\')); LPCTSTR pSep = MinCrtHelper::_strrchr(pStr, _T('\\'));
if (pSep != NULL) if (pSep != NULL)
pStr = pSep + 1; pStr = pSep + 1;
} }
@ -652,7 +654,7 @@ public:
int nRet = 0; int nRet = 0;
LPCTSTR pStr = m_pNextFile; LPCTSTR pStr = m_pNextFile;
// Does the filename contain a backslash? // Does the filename contain a backslash?
if (_strrchr(pStr, _T('\\')) != NULL) if (MinCrtHelper::_strrchr(pStr, _T('\\')) != NULL)
{ {
// Yes, so we'll assume it's a full path. // Yes, so we'll assume it's a full path.
int nLength = lstrlen(pStr); int nLength = lstrlen(pStr);
@ -846,23 +848,6 @@ public:
if (nExtraChars > 0) if (nExtraChars > 0)
ATLVERIFY(ResizeFilenameBuffer(m_ofn.nMaxFile + nExtraChars)); ATLVERIFY(ResizeFilenameBuffer(m_ofn.nMaxFile + nExtraChars));
} }
// Helper for _ATM_MIN_CRT
static const TCHAR* _strrchr(const TCHAR* p, TCHAR ch)
{
#ifndef _ATL_MIN_CRT
return _tcsrchr(p, ch);
#else // _ATL_MIN_CRT
const TCHAR* lpsz = NULL;
while (*p != 0)
{
if (*p == ch)
lpsz = p;
p = ::CharNext(p);
}
return lpsz;
#endif // _ATL_MIN_CRT
}
}; };
class CMultiFileDialog : public CMultiFileDialogImpl<CMultiFileDialog> class CMultiFileDialog : public CMultiFileDialogImpl<CMultiFileDialog>
@ -1538,7 +1523,7 @@ public:
ATLASSERT(m_hWnd != NULL); ATLASSERT(m_hWnd != NULL);
USES_CONVERSION; USES_CONVERSION;
LPCWSTR lpstr = T2CW(lpstrOKText); LPCWSTR lpstr = T2CW(lpstrOKText);
::SendMessage(m_hWnd, BFFM_SETOKTEXT, (WPARAM)lpstr, 0L); ::SendMessage(m_hWnd, BFFM_SETOKTEXT, 0, (LPARAM)lpstr);
} }
void SetExpanded(LPCITEMIDLIST pItemIDList) void SetExpanded(LPCITEMIDLIST pItemIDList)
@ -2957,14 +2942,159 @@ public:
#endif // !_WIN32_WCE #endif // !_WIN32_WCE
#if (_ATL_VER >= 0x800) /////////////////////////////////////////////////////////////////////////
typedef ATL::_DialogSplitHelper::DLGTEMPLATEEX DLGTEMPLATEEX; // CDialogBaseUnits - Dialog Units helper
typedef ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX DLGITEMTEMPLATEEX; //
#else // (_ATL_VER >= 0x800)
typedef ATL::_DialogSizeHelper::_ATL_DLGTEMPLATEEX DLGTEMPLATEEX; class CDialogBaseUnits
#pragma pack(push, 4)
struct DLGITEMTEMPLATEEX
{ {
public:
SIZE m_sizeUnits;
// Constructors
CDialogBaseUnits()
{
// The base units of the out-dated System Font
LONG nDlgBaseUnits = ::GetDialogBaseUnits();
m_sizeUnits.cx = LOWORD(nDlgBaseUnits);
m_sizeUnits.cy = HIWORD(nDlgBaseUnits);
}
CDialogBaseUnits(HWND hWnd)
{
if(!InitDialogBaseUnits(hWnd)) {
LONG nDlgBaseUnits = ::GetDialogBaseUnits();
m_sizeUnits.cx = LOWORD(nDlgBaseUnits);
m_sizeUnits.cy = HIWORD(nDlgBaseUnits);
}
}
CDialogBaseUnits(HFONT hFont, HWND hWnd = NULL)
{
if(!InitDialogBaseUnits(hFont, hWnd)) {
LONG nDlgBaseUnits = ::GetDialogBaseUnits();
m_sizeUnits.cx = LOWORD(nDlgBaseUnits);
m_sizeUnits.cy = HIWORD(nDlgBaseUnits);
}
}
CDialogBaseUnits(LOGFONT lf, HWND hWnd = NULL)
{
if(!InitDialogBaseUnits(lf, hWnd)) {
LONG nDlgBaseUnits = ::GetDialogBaseUnits();
m_sizeUnits.cx = LOWORD(nDlgBaseUnits);
m_sizeUnits.cy = HIWORD(nDlgBaseUnits);
}
}
// Operations
BOOL InitDialogBaseUnits(HWND hWnd)
{
ATLASSERT(::IsWindow(hWnd));
RECT rc = { 0, 0, 4, 8 };
if(!::MapDialogRect(hWnd, &rc)) return FALSE;
m_sizeUnits.cx = rc.right;
m_sizeUnits.cy = rc.bottom;
return TRUE;
}
BOOL InitDialogBaseUnits(LOGFONT lf, HWND hWnd = NULL)
{
CFont font;
font.CreateFontIndirect(&lf);
if(font.IsNull()) return FALSE;
return InitDialogBaseUnits(font, hWnd);
}
BOOL InitDialogBaseUnits(HFONT hFont, HWND hWnd = NULL)
{
ATLASSERT(hFont != NULL);
CWindowDC dc = hWnd;
TEXTMETRIC tmText = { 0 };
SIZE sizeText = { 0 };
HFONT hFontOld = dc.SelectFont(hFont);
dc.GetTextMetrics(&tmText);
m_sizeUnits.cy = tmText.tmHeight + tmText.tmExternalLeading;
dc.GetTextExtent(_T("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"), 52, &sizeText);
m_sizeUnits.cx = (sizeText.cx + 26) / 52;
dc.SelectFont(hFontOld);
return TRUE;
}
SIZE GetDialogBaseUnits() const
{
return m_sizeUnits;
}
INT MapDialogPixelsX(INT x) const
{
return ::MulDiv(x, 4, m_sizeUnits.cx); // Pixels X to DLU
}
INT MapDialogPixelsY(INT y) const
{
return ::MulDiv(y, 8, m_sizeUnits.cy); // Pixels Y to DLU
}
POINT MapDialogPixels(POINT pt) const
{
POINT out = { MapDialogPixelsX(pt.x), MapDialogPixelsY(pt.y) };
return out;
}
SIZE MapDialogPixels(SIZE input) const
{
SIZE out = { MapDialogPixelsX(input.cx), MapDialogPixelsY(input.cy) };
return out;
}
RECT MapDialogPixels(RECT input) const
{
RECT out = { MapDialogPixelsX(input.left), MapDialogPixelsY(input.top), MapDialogPixelsX(input.right), MapDialogPixelsY(input.bottom) };
return out;
}
INT MapDialogUnitsX(INT x) const
{
return ::MulDiv(x, m_sizeUnits.cx, 4); // DLU to Pixels X
}
INT MapDialogUnitsY(INT y) const
{
return ::MulDiv(y, m_sizeUnits.cx, 8); // DLU to Pixels Y
}
POINT MapDialogUnits(POINT pt) const
{
POINT out = { MapDialogUnitsX(pt.x), MapDialogUnitsY(pt.y) };
return out;
}
SIZE MapDialogUnits(SIZE input) const
{
SIZE out = { MapDialogUnitsX(input.cx), MapDialogUnitsY(input.cy) };
return out;
}
RECT MapDialogUnits(RECT input) const
{
RECT out = { MapDialogUnitsX(input.left), MapDialogUnitsY(input.top), MapDialogUnitsX(input.right), MapDialogUnitsY(input.bottom) };
return out;
}
};
///////////////////////////////////////////////////////////////////////////////
// CMemDlgTemplate - in-memory dialog template - DLGTEMPLATE or DLGTEMPLATEEX
#if (_ATL_VER >= 0x800)
typedef ATL::_DialogSplitHelper::DLGTEMPLATEEX DLGTEMPLATEEX;
typedef ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX DLGITEMTEMPLATEEX;
#else // (_ATL_VER >= 0x800)
typedef ATL::_DialogSizeHelper::_ATL_DLGTEMPLATEEX DLGTEMPLATEEX;
#pragma pack(push, 4)
struct DLGITEMTEMPLATEEX
{
DWORD helpID; DWORD helpID;
DWORD exStyle; DWORD exStyle;
DWORD style; DWORD style;
@ -2972,15 +3102,12 @@ struct DLGITEMTEMPLATEEX
short y; short y;
short cx; short cx;
short cy; short cy;
WORD id; DWORD id;
}; };
#pragma pack(pop) #pragma pack(pop)
#endif // (_ATL_VER >= 0x800) #endif // (_ATL_VER >= 0x800)
///////////////////////////////////////////////////////////////////////////////
// CMemDlgTemplate - in-memory dialog template - DLGTEMPLATE or DLGTEMPLATEEX
class CMemDlgTemplate class CMemDlgTemplate
{ {
public: public:
@ -2994,7 +3121,7 @@ public:
CTRL_COMBOBOX = 0x0085 CTRL_COMBOBOX = 0x0085
}; };
CMemDlgTemplate() : m_pData(NULL), m_pPtr(NULL), m_cAllocated(0) CMemDlgTemplate() : m_hData(NULL), m_pData(NULL), m_pPtr(NULL), m_cAllocated(0)
{ } { }
~CMemDlgTemplate() ~CMemDlgTemplate()
@ -3024,17 +3151,30 @@ public:
void Reset() void Reset()
{ {
if (IsValid()) if (IsValid()) {
ATLVERIFY(::GlobalFree(m_pData) == NULL); #ifndef UNDER_CE
::GlobalUnlock(m_pData);
#endif
ATLVERIFY(::GlobalFree(m_hData) == NULL);
}
m_hData = NULL;
m_pData = NULL; m_pData = NULL;
m_pPtr = NULL; m_pPtr = NULL;
m_cAllocated = 0; m_cAllocated = 0;
} }
void Create(bool bDlgEx, LPCTSTR lpszCaption, short nX, short nY, short nWidth, short nHeight, DWORD dwStyle = 0, DWORD dwExStyle = 0, void Create(bool bDlgEx, LPCTSTR lpszCaption, RECT rc, DWORD dwStyle = 0, DWORD dwExStyle = 0,
LPCTSTR lpstrFontName = NULL, WORD wFontSize = 0, WORD wWeight = 0, BYTE bItalic = 0, BYTE bCharset = 0, DWORD dwHelpID = 0, LPCTSTR lpstrFontName = NULL, WORD wFontSize = 0, WORD wWeight = 0, BYTE bItalic = 0, BYTE bCharset = 0, DWORD dwHelpID = 0,
ATL::_U_STRINGorID ClassName = 0U, ATL::_U_STRINGorID Menu = 0U) ATL::_U_STRINGorID ClassName = 0U, ATL::_U_STRINGorID Menu = 0U)
{
Create(bDlgEx, lpszCaption, (short) rc.left, (short) rc.top, (short) (rc.right - rc.left), (short) (rc.bottom - rc.top), dwStyle, dwExStyle,
lpstrFontName, wFontSize, wWeight, bItalic, bCharset, dwHelpID, ClassName.m_lpstr, Menu.m_lpstr);
}
void Create(bool bDlgEx, LPCTSTR lpszCaption, short nX, short nY, short nWidth, short nHeight, DWORD dwStyle = 0, DWORD dwExStyle = 0,
LPCTSTR lpstrFontName = NULL, WORD wFontSize = 0, WORD wWeight = 0, BYTE bItalic = 0, BYTE bCharset = 0, DWORD dwHelpID = 0,
ATL::_U_STRINGorID ClassName = 0U, ATL::_U_STRINGorID Menu = 0U)
{ {
// Should have DS_SETFONT style to set the dialog font name and size // Should have DS_SETFONT style to set the dialog font name and size
if (lpstrFontName != NULL) if (lpstrFontName != NULL)
@ -3113,6 +3253,13 @@ public:
} }
} }
void AddControl(ATL::_U_STRINGorID ClassName, WORD wId, RECT rc, DWORD dwStyle, DWORD dwExStyle,
ATL::_U_STRINGorID Text, const WORD* pCreationData = NULL, WORD nCreationData = 0, DWORD dwHelpID = 0)
{
AddControl(ClassName.m_lpstr, wId, (short) rc.left, (short) rc.top, (short) (rc.right - rc.left), (short) (rc.bottom - rc.top), dwStyle, dwExStyle,
Text.m_lpstr, pCreationData, nCreationData, dwHelpID);
}
void AddControl(ATL::_U_STRINGorID ClassName, WORD wId, short nX, short nY, short nWidth, short nHeight, DWORD dwStyle, DWORD dwExStyle, void AddControl(ATL::_U_STRINGorID ClassName, WORD wId, short nX, short nY, short nWidth, short nHeight, DWORD dwStyle, DWORD dwExStyle,
ATL::_U_STRINGorID Text, const WORD* pCreationData = NULL, WORD nCreationData = 0, DWORD dwHelpID = 0) ATL::_U_STRINGorID Text, const WORD* pCreationData = NULL, WORD nCreationData = 0, DWORD dwHelpID = 0)
{ {
@ -3179,24 +3326,38 @@ public:
AddControl(CtrlType, wId, nX, nY, nWidth, nHeight, dwStyle, dwExStyle, Text, pCreationData, nCreationData, dwHelpID); AddControl(CtrlType, wId, nX, nY, nWidth, nHeight, dwStyle, dwExStyle, Text, pCreationData, nCreationData, dwHelpID);
} }
protected:
void AddData(LPCVOID pData, size_t nData) void AddData(LPCVOID pData, size_t nData)
{ {
ATLASSERT(pData != NULL); ATLASSERT(pData != NULL);
const size_t ALLOCATION_INCREMENT = 1024; const SIZE_T ALLOCATION_INCREMENT = 1024;
if (m_pData == NULL) if (m_pData == NULL)
{ {
m_cAllocated = ((nData / ALLOCATION_INCREMENT) + 1) * ALLOCATION_INCREMENT; m_cAllocated = ((nData / ALLOCATION_INCREMENT) + 1) * ALLOCATION_INCREMENT;
m_pPtr = m_pData = static_cast<LPBYTE>(::GlobalAlloc(GPTR, m_cAllocated)); m_hData = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, m_cAllocated);
ATLASSERT(m_hData != NULL);
#ifndef UNDER_CE
m_pPtr = m_pData = static_cast<LPBYTE>(::GlobalLock(m_hData));
#else
m_pPtr = m_pData = static_cast<LPBYTE>(m_hData);
#endif
ATLASSERT(m_pData != NULL); ATLASSERT(m_pData != NULL);
} }
else if (((m_pPtr - m_pData) + nData) > m_cAllocated) else if (((m_pPtr - m_pData) + nData) > m_cAllocated)
{ {
size_t ptrPos = (m_pPtr - m_pData); SIZE_T ptrPos = (m_pPtr - m_pData);
m_cAllocated += ((nData / ALLOCATION_INCREMENT) + 1) * ALLOCATION_INCREMENT; m_cAllocated += ((nData / ALLOCATION_INCREMENT) + 1) * ALLOCATION_INCREMENT;
m_pData = static_cast<LPBYTE>(::GlobalReAlloc(m_pData, m_cAllocated, 0)); #ifndef UNDER_CE
::GlobalUnlock(m_pData);
#endif
m_hData = ::GlobalReAlloc(m_hData, m_cAllocated, GMEM_MOVEABLE | GMEM_ZEROINIT);
ATLASSERT(m_hData != NULL);
#ifndef UNDER_CE
m_pData = static_cast<LPBYTE>(::GlobalLock(m_hData));
#else
m_pData = static_cast<LPBYTE>(m_hData);
#endif
ATLASSERT(m_pData != NULL); ATLASSERT(m_pData != NULL);
m_pPtr = m_pData + ptrPos; m_pPtr = m_pData + ptrPos;
} }
@ -3222,6 +3383,7 @@ protected:
} }
} }
HANDLE m_hData;
LPBYTE m_pData; LPBYTE m_pData;
LPBYTE m_pPtr; LPBYTE m_pPtr;
SIZE_T m_cAllocated; SIZE_T m_cAllocated;
@ -5628,7 +5790,13 @@ inline int AtlTaskDialog(HWND hWndParent,
#ifdef _WTL_TASKDIALOG_DIRECT #ifdef _WTL_TASKDIALOG_DIRECT
USES_CONVERSION; USES_CONVERSION;
HRESULT hRet = ::TaskDialog(hWndParent, ModuleHelper::GetResourceInstance(), T2CW(WindowTitle.m_lpstr), T2CW(MainInstructionText.m_lpstr), T2CW(ContentText.m_lpstr), dwCommonButtons, T2CW(Icon.m_lpstr), &nRet); HRESULT hRet = ::TaskDialog(hWndParent, ModuleHelper::GetResourceInstance(),
IS_INTRESOURCE(WindowTitle.m_lpstr) ? (LPCWSTR) WindowTitle.m_lpstr : T2CW(WindowTitle.m_lpstr),
IS_INTRESOURCE(MainInstructionText.m_lpstr) ? (LPCWSTR) MainInstructionText.m_lpstr : T2CW(MainInstructionText.m_lpstr),
IS_INTRESOURCE(ContentText.m_lpstr) ? (LPCWSTR) ContentText.m_lpstr : T2CW(ContentText.m_lpstr),
dwCommonButtons,
IS_INTRESOURCE(Icon.m_lpstr) ? (LPCWSTR) Icon.m_lpstr : T2CW(Icon.m_lpstr),
&nRet);
ATLVERIFY(SUCCEEDED(hRet)); ATLVERIFY(SUCCEEDED(hRet));
#else #else
// This allows apps to run on older versions of Windows // This allows apps to run on older versions of Windows
@ -5641,7 +5809,13 @@ inline int AtlTaskDialog(HWND hWndParent,
if(pfnTaskDialog != NULL) if(pfnTaskDialog != NULL)
{ {
USES_CONVERSION; USES_CONVERSION;
HRESULT hRet = pfnTaskDialog(hWndParent, ModuleHelper::GetResourceInstance(), T2CW(WindowTitle.m_lpstr), T2CW(MainInstructionText.m_lpstr), T2CW(ContentText.m_lpstr), dwCommonButtons, T2CW(Icon.m_lpstr), &nRet); HRESULT hRet = pfnTaskDialog(hWndParent, ModuleHelper::GetResourceInstance(),
IS_INTRESOURCE(WindowTitle.m_lpstr) ? (LPCWSTR) WindowTitle.m_lpstr : T2CW(WindowTitle.m_lpstr),
IS_INTRESOURCE(MainInstructionText.m_lpstr) ? (LPCWSTR) MainInstructionText.m_lpstr : T2CW(MainInstructionText.m_lpstr),
IS_INTRESOURCE(ContentText.m_lpstr) ? (LPCWSTR) ContentText.m_lpstr : T2CW(ContentText.m_lpstr),
dwCommonButtons,
IS_INTRESOURCE(Icon.m_lpstr) ? (LPCWSTR) Icon.m_lpstr : T2CW(Icon.m_lpstr),
&nRet);
ATLVERIFY(SUCCEEDED(hRet)); ATLVERIFY(SUCCEEDED(hRet));
} }

View File

@ -0,0 +1,461 @@
// Windows Template Library - WTL version 8.1
// 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
// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or
// any other, from this software.
#ifndef __ATLDWM_H__
#define __ATLDWM_H__
#pragma once
#ifdef _WIN32_WCE
#error atldwm.h is not supported on Windows CE
#endif
#ifndef __ATLAPP_H__
#error atldwm.h requires atlapp.h to be included first
#endif
#ifndef __ATLWIN_H__
#error atldwm.h requires atlwin.h to be included first
#endif
#if (_WIN32_WINNT < 0x0600)
#error atldwm.h requires _WIN32_WINNT >= 0x0600
#endif // (_WIN32_WINNT < 0x0600)
#ifndef _DWMAPI_H_
#include <dwmapi.h>
#endif // _DWMAPI_H_
#pragma comment(lib, "dwmapi.lib")
// Note: To create an application that also runs on older versions of Windows,
// use delay load of dwmapi.dll and ensure that no calls to the DWM API are
// Delay load is NOT AUTOMATIC for VC++ 7, you have to link to delayimp.lib,
// and add dwmapi.dll in the Linker.Input.Delay Loaded DLLs section of the
// project properties.
#if (_MSC_VER < 1300) && !defined(_WTL_NO_DWMAPI_DELAYLOAD)
#pragma comment(lib, "delayimp.lib")
#pragma comment(linker, "/delayload:dwmapi.dll")
#endif // (_MSC_VER < 1300) && !defined(_WTL_NO_DWMAPI_DELAYLOAD)
///////////////////////////////////////////////////////////////////////////////
// Classes in this file:
//
// CDwm
// CDwmImpl<T, TBase>
// CDwmWindowT<TBase> - CDwmWindow
// CDwmThumbnailT<t_bManaged, TBase>
// CDwmThumbnail
// CDwmThumbnailHandle
// CAeroControlImpl
namespace WTL
{
///////////////////////////////////////////////////////////////////////////////
// CDwm - wrapper for DWM handle
class CDwm
{
public:
// Data members
static int m_nIsDwmSupported;
// Constructor
CDwm()
{
IsDwmSupported();
}
// Dwm support helper
static bool IsDwmSupported()
{
if(m_nIsDwmSupported == -1)
{
CStaticDataInitCriticalSectionLock lock;
if(FAILED(lock.Lock()))
{
ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CDwm::IsDwmSupported.\n"));
ATLASSERT(FALSE);
return false;
}
if(m_nIsDwmSupported == -1)
{
HMODULE hDwmDLL = ::LoadLibrary(_T("dwmapi.dll"));
m_nIsDwmSupported = (hDwmDLL != NULL) ? 1 : 0;
if(hDwmDLL != NULL)
::FreeLibrary(hDwmDLL);
}
lock.Unlock();
}
ATLASSERT(m_nIsDwmSupported != -1);
return (m_nIsDwmSupported == 1);
}
// Operations
BOOL DwmIsCompositionEnabled() const
{
if(!IsDwmSupported()) return FALSE;
BOOL bRes = FALSE;
return SUCCEEDED(::DwmIsCompositionEnabled(&bRes)) && bRes;
}
BOOL DwmEnableComposition(UINT fEnable)
{
if(!IsDwmSupported()) return FALSE;
return SUCCEEDED(::DwmEnableComposition(fEnable));
}
BOOL DwmEnableMMCSS(BOOL fEnableMMCSS)
{
if(!IsDwmSupported()) return FALSE;
return SUCCEEDED(::DwmEnableMMCSS(fEnableMMCSS));
}
HRESULT DwmGetColorizationColor(DWORD* pcrColorization, BOOL* pfOpaqueBlend)
{
if(!IsDwmSupported()) return E_NOTIMPL;
return ::DwmGetColorizationColor(pcrColorization, pfOpaqueBlend);
}
HRESULT DwmFlush()
{
if(!IsDwmSupported()) return E_NOTIMPL;
return ::DwmFlush();
}
};
__declspec(selectany) int CDwm::m_nIsDwmSupported = -1;
///////////////////////////////////////////////////////////////////////////////
// CDwmImpl - DWM window support
template <class T, class TBase = CDwm>
class CDwmImpl : public TBase
{
public:
HRESULT DwmEnableBlurBehindWindow(const DWM_BLURBEHIND* pBB)
{
if(!IsDwmSupported()) return E_NOTIMPL;
T* pT = static_cast<T*>(this);
ATLASSERT(::IsWindow(pT->m_hWnd));
return ::DwmEnableBlurBehindWindow(pT->m_hWnd, pBB);
}
HRESULT DwmExtendFrameIntoClientArea(const MARGINS* pMargins)
{
if(!IsDwmSupported()) return E_NOTIMPL;
T* pT = static_cast<T*>(this);
ATLASSERT(::IsWindow(pT->m_hWnd));
return ::DwmExtendFrameIntoClientArea(pT->m_hWnd, pMargins);
}
HRESULT DwmExtendFrameIntoEntireClientArea()
{
MARGINS margins = { -1 };
return DwmExtendFrameIntoClientArea(&margins);
}
HRESULT DwmGetCompositionTimingInfo(DWM_TIMING_INFO* pTimingInfo)
{
if(!IsDwmSupported()) return E_NOTIMPL;
T* pT = static_cast<T*>(this);
ATLASSERT(::IsWindow(pT->m_hWnd));
return ::DwmGetCompositionTimingInfo(pT->m_hWnd, pTimingInfo);
}
HRESULT DwmGetWindowAttribute(DWORD dwAttribute, PVOID pvAttribute, DWORD cbAttribute)
{
if(!IsDwmSupported()) return E_NOTIMPL;
T* pT = static_cast<T*>(this);
ATLASSERT(::IsWindow(pT->m_hWnd));
return ::DwmGetWindowAttribute(pT->m_hWnd, dwAttribute, pvAttribute, cbAttribute);
}
HRESULT DwmModifyPreviousDxFrameDuration(INT cRefreshes, BOOL fRelative)
{
if(!IsDwmSupported()) return E_NOTIMPL;
T* pT = static_cast<T*>(this);
ATLASSERT(::IsWindow(pT->m_hWnd));
return ::DwmModifyPreviousDxFrameDuration(pT->m_hWnd, cRefreshes, fRelative);
}
HRESULT DwmSetDxFrameDuration(INT cRefreshes)
{
if(!IsDwmSupported()) return E_NOTIMPL;
T* pT = static_cast<T*>(this);
ATLASSERT(::IsWindow(pT->m_hWnd));
return ::DwmSetDxFrameDuration(pT->m_hWnd, cRefreshes);
}
HRESULT DwmSetPresentParameters(DWM_PRESENT_PARAMETERS* pPresentParams)
{
if(!IsDwmSupported()) return E_NOTIMPL;
T* pT = static_cast<T*>(this);
ATLASSERT(::IsWindow(pT->m_hWnd));
return ::DwmSetPresentParameters(pT->m_hWnd, pPresentParams);
}
HRESULT DwmSetWindowAttribute(DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute)
{
if(!IsDwmSupported()) return E_NOTIMPL;
T* pT = static_cast<T*>(this);
ATLASSERT(::IsWindow(pT->m_hWnd));
return ::DwmSetWindowAttribute(pT->m_hWnd, dwAttribute, pvAttribute, cbAttribute);
}
HRESULT DwmAttachMilContent()
{
if(!IsDwmSupported()) return E_NOTIMPL;
T* pT = static_cast<T*>(this);
ATLASSERT(::IsWindow(pT->m_hWnd));
return ::DwmAttachMilContent(pT->m_hWnd);
}
HRESULT DwmDetachMilContent()
{
if(!IsDwmSupported()) return E_NOTIMPL;
T* pT = static_cast<T*>(this);
ATLASSERT(::IsWindow(pT->m_hWnd));
return ::DwmDetachMilContent(pT->m_hWnd);
}
};
template <class TBase>
class CDwmWindowT : public TBase, public CDwmImpl<CDwmWindowT< TBase > >
{
public:
CDwmWindowT(HWND hWnd = NULL) : TBase(hWnd)
{ }
CDwmWindowT< TBase >& operator =(HWND hWnd)
{
m_hWnd = hWnd;
return *this;
}
};
typedef CDwmWindowT<ATL::CWindow> CDwmWindow;
///////////////////////////////////////////////////////////////////////////////
// CDwmThumbnail - provides DWM thumbnail support
template <bool t_bManaged, class TBase = CDwm>
class CDwmThumbnailT : public TBase
{
public:
// Data members
HTHUMBNAIL m_hThumbnail;
// Constructor
CDwmThumbnailT(HTHUMBNAIL hThumbnail = NULL) : m_hThumbnail(hThumbnail)
{
}
~CDwmThumbnailT()
{
if(t_bManaged && m_hThumbnail != NULL)
Unregister();
}
// Operations
CDwmThumbnailT<t_bManaged, TBase>& operator =(HTHUMBNAIL hThumbnail)
{
Attach(hThumbnail);
return *this;
}
void Attach(HTHUMBNAIL hThumbnailNew)
{
if(t_bManaged && m_hThumbnail != NULL && m_hThumbnail != hThumbnailNew)
Unregister();
m_hThumbnail = hThumbnailNew;
}
HTHUMBNAIL Detach()
{
HTHUMBNAIL hThumbnail = m_hThumbnail;
m_hThumbnail = NULL;
return hThumbnail;
}
HRESULT Register(HWND hwndDestination, HWND hwndSource)
{
ATLASSERT(::IsWindow(hwndDestination));
ATLASSERT(::IsWindow(hwndSource));
ATLASSERT(m_hThumbnail==NULL);
if(!IsDwmSupported()) return E_NOTIMPL;
return ::DwmRegisterThumbnail(hwndDestination, hwndSource, &m_hThumbnail);
}
HRESULT Unregister()
{
if(!IsDwmSupported()) return E_NOTIMPL;
if(m_hThumbnail == NULL) return S_FALSE;
HRESULT Hr = ::DwmUnregisterThumbnail(m_hThumbnail);
if(SUCCEEDED(Hr)) m_hThumbnail = NULL;
return Hr;
}
operator HTHUMBNAIL() const { return m_hThumbnail; }
bool IsNull() const { return (m_hThumbnail == NULL); }
HRESULT UpdateProperties(const DWM_THUMBNAIL_PROPERTIES* ptnProperties)
{
if(!IsDwmSupported()) return E_NOTIMPL;
ATLASSERT(m_hThumbnail != NULL);
return ::DwmUpdateThumbnailProperties(m_hThumbnail, ptnProperties);
}
// Attributes
HRESULT QuerySourceSize(PSIZE pSize)
{
if(!IsDwmSupported()) return E_NOTIMPL;
ATLASSERT(m_hThumbnail != NULL);
return ::DwmQueryThumbnailSourceSize(m_hThumbnail, pSize);
}
};
typedef CDwmThumbnailT<true, CDwm> CDwmThumbnail;
typedef CDwmThumbnailT<false, CDwm> CDwmThumbnailHandle;
#ifdef __ATLTHEME_H__
///////////////////////////////////////////////////////////////////////////////
// CAeroControlImpl - Base class for controls on Glass
template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>
class CAeroControlImpl :
public CThemeImpl<T>,
public CBufferedPaintImpl<T>,
public ATL::CWindowImpl<T, TBase, TWinTraits>
{
public:
typedef CThemeImpl<T> _themeClass;
typedef CBufferedPaintImpl<T> _baseClass;
typedef ATL::CWindowImpl<T, TBase, TWinTraits> _windowClass;
CAeroControlImpl()
{
m_PaintParams.dwFlags = BPPF_ERASE;
}
static LPCWSTR GetThemeName()
{
#ifdef _UNICODE
return TBase::GetWndClassName();
#else
ATLASSERT(!_T("Return UNICODE string of window classname / theme class"));
return NULL;
#endif // _UNICODE
}
// Message map and handlers
BEGIN_MSG_MAP(CAeroControlImpl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_ACTIVATE, OnActivate)
CHAIN_MSG_MAP(_themeClass)
CHAIN_MSG_MAP(_baseClass)
END_MSG_MAP()
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
T* pT = static_cast<T*>(this);
pT->Init();
bHandled = FALSE;
return 0;
}
LRESULT OnActivate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
if(IsThemingSupported()) Invalidate(FALSE);
bHandled = FALSE;
return 0;
}
// Operations
BOOL SubclassWindow(HWND hWnd)
{
ATLASSERT(m_hWnd == NULL);
ATLASSERT(::IsWindow(hWnd));
BOOL bRet = _windowClass::SubclassWindow(hWnd);
if(bRet) {
T* pT = static_cast<T*>(this);
pT->Init();
}
return bRet;
}
// Implementation
LRESULT DefWindowProc()
{
const _ATL_MSG* pMsg = m_pCurrentMsg;
LRESULT lRes = 0;
if(pMsg != NULL)
lRes = DefWindowProc(pMsg->message, pMsg->wParam, pMsg->lParam);
return lRes;
}
LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
T* pT = static_cast<T*>(this);
LRESULT lRes = 0;
if( ::DwmDefWindowProc(pT->m_hWnd, uMsg, wParam, lParam, &lRes) ) return lRes;
return _windowClass::DefWindowProc(uMsg, wParam, lParam);
}
void DoBufferedPaint(HDC hDC, RECT& rcPaint)
{
T* pT = static_cast<T*>(this);
HDC hDCPaint = NULL;
RECT rcClient = { 0 };
GetClientRect(&rcClient);
m_BufferedPaint.Begin(hDC, &rcClient, m_dwFormat, &m_PaintParams, &hDCPaint);
ATLASSERT(hDCPaint != NULL);
pT->DoAeroPaint(hDCPaint, rcClient, rcPaint);
m_BufferedPaint.End();
}
void DoPaint(HDC /*hdc*/, RECT& /*rcClient*/)
{
DefWindowProc();
}
// Overridables
void Init()
{
T* pT = static_cast<T*>(this);
SetThemeClassList(pT->GetThemeName());
if(m_lpstrThemeClassList != NULL)
OpenThemeData();
}
void DoAeroPaint(HDC hDC, RECT& /*rcClient*/, RECT& rcPaint)
{
DefWindowProc(WM_PAINT, (WPARAM) hDC, 0L);
m_BufferedPaint.MakeOpaque(&rcPaint);
}
};
#endif // __ATLTHEME_H__
}; // namespace WTL
#endif // __ATLDWM_H__

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifdef _WIN32_WCE #ifdef _WIN32_WCE
#error atlfind.h is not supported on Windows CE #error atlfind.h is not supported on Windows CE
#endif #endif
@ -897,7 +893,7 @@ public:
} }
} }
return (pT->m_bShadowBufferNeeded == TRUE); return (pT->m_bShadowBufferNeeded != FALSE);
} }
}; };

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifndef __ATLAPP_H__ #ifndef __ATLAPP_H__
#error atlframe.h requires atlapp.h to be included first #error atlframe.h requires atlapp.h to be included first
#endif #endif
@ -38,6 +34,7 @@
// CUpdateUIBase // CUpdateUIBase
// CUpdateUI<T> // CUpdateUI<T>
// CDynamicUpdateUI<T> // CDynamicUpdateUI<T>
// CAutoUpdateUI<T>
// CDialogResize<T> // CDialogResize<T>
// CDoubleBufferImpl<T> // CDoubleBufferImpl<T>
// CDoubleBufferWindowImpl<T, TBase, TWinTraits> // CDoubleBufferWindowImpl<T, TBase, TWinTraits>
@ -375,29 +372,6 @@ class ATL_NO_VTABLE CFrameWindowImplBase : public ATL::CWindowImplBaseT< TBase,
public: public:
DECLARE_FRAME_WND_CLASS(NULL, 0) DECLARE_FRAME_WND_CLASS(NULL, 0)
// Data members
HWND m_hWndToolBar;
HWND m_hWndStatusBar;
HWND m_hWndClient;
HACCEL m_hAccel;
#ifdef _WIN32_WCE
HWND m_hWndCECommandBar;
#endif // _WIN32_WCE
struct _AtlToolBarData
{
WORD wVersion;
WORD wWidth;
WORD wHeight;
WORD wItemCount;
//WORD aItems[wItemCount]
WORD* items()
{ return (WORD*)(this+1); }
};
#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
struct _ChevronMenuInfo struct _ChevronMenuInfo
{ {
@ -407,14 +381,25 @@ public:
}; };
#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
// Data members
HWND m_hWndToolBar;
HWND m_hWndStatusBar;
HWND m_hWndClient;
#ifdef _WIN32_WCE
HWND m_hWndCECommandBar;
#endif // _WIN32_WCE
HACCEL m_hAccel;
// Constructor // Constructor
CFrameWindowImplBase() : CFrameWindowImplBase() :
#ifdef _WIN32_WCE
m_hWndCECommandBar(NULL),
#endif // _WIN32_WCE
m_hWndToolBar(NULL), m_hWndToolBar(NULL),
m_hWndStatusBar(NULL), m_hWndStatusBar(NULL),
m_hWndClient(NULL), m_hWndClient(NULL),
#ifdef _WIN32_WCE
m_hWndCECommandBar(NULL),
#endif // _WIN32_WCE
m_hAccel(NULL) m_hAccel(NULL)
{ } { }
@ -523,7 +508,7 @@ public:
// check if font is taller than our bitmaps // check if font is taller than our bitmaps
CFontHandle font = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0L); CFontHandle font = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0L);
if(font.IsNull()) if(font.IsNull())
font = AtlGetDefaultGuiFont(); font = (HFONT)::GetStockObject(SYSTEM_FONT);
LOGFONT lf = { 0 }; LOGFONT lf = { 0 };
font.GetLogFont(lf); font.GetLogFont(lf);
WORD cyFontHeight = (WORD)abs(lf.lfHeight); WORD cyFontHeight = (WORD)abs(lf.lfHeight);
@ -825,10 +810,10 @@ public:
// resize toolbar // resize toolbar
if(m_hWndToolBar != NULL && ((DWORD)::GetWindowLong(m_hWndToolBar, GWL_STYLE) & WS_VISIBLE)) if(m_hWndToolBar != NULL && ((DWORD)::GetWindowLong(m_hWndToolBar, GWL_STYLE) & WS_VISIBLE))
{ {
if(bResizeBars) if(bResizeBars != FALSE)
{ {
::SendMessage(m_hWndToolBar, WM_SIZE, 0, 0); ::SendMessage(m_hWndToolBar, WM_SIZE, 0, 0);
::InvalidateRect(m_hWndToolBar, NULL, FALSE); ::InvalidateRect(m_hWndToolBar, NULL, TRUE);
} }
RECT rectTB = { 0 }; RECT rectTB = { 0 };
::GetWindowRect(m_hWndToolBar, &rectTB); ::GetWindowRect(m_hWndToolBar, &rectTB);
@ -838,7 +823,7 @@ public:
// resize status bar // resize status bar
if(m_hWndStatusBar != NULL && ((DWORD)::GetWindowLong(m_hWndStatusBar, GWL_STYLE) & WS_VISIBLE)) if(m_hWndStatusBar != NULL && ((DWORD)::GetWindowLong(m_hWndStatusBar, GWL_STYLE) & WS_VISIBLE))
{ {
if(bResizeBars) if(bResizeBars != FALSE)
::SendMessage(m_hWndStatusBar, WM_SIZE, 0, 0); ::SendMessage(m_hWndStatusBar, WM_SIZE, 0, 0);
RECT rectSB = { 0 }; RECT rectSB = { 0 };
::GetWindowRect(m_hWndStatusBar, &rectSB); ::GetWindowRect(m_hWndStatusBar, &rectSB);
@ -2115,6 +2100,11 @@ public:
{ {
void* m_lpData; void* m_lpData;
LPTSTR m_lpstrText; LPTSTR m_lpstrText;
struct
{
WORD m_nIDFirst;
WORD m_nIDLast;
};
}; };
bool operator ==(const _AtlUpdateUIData& e) const bool operator ==(const _AtlUpdateUIData& e) const
@ -2223,7 +2213,12 @@ public:
while(pMap->m_nID != (WORD)-1) while(pMap->m_nID != (WORD)-1)
{ {
if(pMap->m_wType & UPDUI_MENUPOPUP) if(pMap->m_wType & UPDUI_MENUPOPUP)
{
UIUpdateMenuBarElement(pMap->m_nID, pUIData, hMenu); UIUpdateMenuBarElement(pMap->m_nID, pUIData, hMenu);
if((pUIData->m_wState & UPDUI_RADIO) != 0)
::CheckMenuRadioItem(hMenu, pUIData->m_nIDFirst, pUIData->m_nIDLast, pMap->m_nID, MF_BYCOMMAND);
}
pMap++; pMap++;
pUIData++; pUIData++;
} }
@ -2382,6 +2377,46 @@ public:
return TRUE; return TRUE;
} }
// for menu items
BOOL UISetRadioMenuItem(int nID, int nIDFirst, int nIDLast, BOOL bForceUpdate = FALSE)
{
const _AtlUpdateUIMap* pMap = m_pUIMap;
_AtlUpdateUIData* pUIData = m_pUIData;
if(pUIData == NULL)
return FALSE;
for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
{
if(nID == (int)pMap->m_nID)
{
pUIData->m_wState |= pMap->m_wType;
pUIData->m_wState |= UPDUI_RADIO;
pUIData->m_nIDFirst = (WORD)nIDFirst;
pUIData->m_nIDLast = (WORD)nIDLast;
if(bForceUpdate)
pUIData->m_wState |= pMap->m_wType;
if(pUIData->m_wState & pMap->m_wType)
m_wDirtyType |= pMap->m_wType;
}
else if(pMap->m_nID >= nIDFirst && pMap->m_nID <= nIDLast)
{
if(pUIData->m_wState & UPDUI_RADIO)
{
pUIData->m_wState &= ~pMap->m_wType;
pUIData->m_wState &= ~UPDUI_RADIO;
pUIData->m_nIDFirst = 0;
pUIData->m_nIDLast = 0;
}
}
if(pMap->m_nID == nIDLast)
break;
}
return TRUE;
}
BOOL UISetText(int nID, LPCTSTR lpstrText, BOOL bForceUpdate = FALSE) BOOL UISetText(int nID, LPCTSTR lpstrText, BOOL bForceUpdate = FALSE)
{ {
const _AtlUpdateUIMap* pMap = m_pUIMap; const _AtlUpdateUIMap* pMap = m_pUIMap;
@ -2922,6 +2957,194 @@ public:
}; };
///////////////////////////////////////////////////////////////////////////////
// CAutoUpdateUI : Automatic mapping of UI elements
template <class T>
class CAutoUpdateUI : public CDynamicUpdateUI<T>
{
public:
LPCTSTR UIGetText(int nID)
{
for(int i = 0; i < m_arrUIMap.GetSize(); i++)
{
if(m_arrUIMap[i].m_nID == nID)
return m_arrUIData[i].m_lpstrText;
}
return NULL;
}
// Element
template <WORD t_wType>
bool UIAddElement(UINT nID)
{
// check for existing UI map element
for(int i = 0; i < m_arrUIMap.GetSize(); i++)
{
if(m_arrUIMap[i].m_nID == nID)
{
// set requested type
m_arrUIMap[i].m_wType |= t_wType;
return true;
}
}
// Add element to UI map with requested type
return UIAddUpdateElement((WORD)nID, t_wType);
}
template <WORD t_wType>
bool UIRemoveElement(UINT nID)
{
for(int i = 0; i < m_arrUIMap.GetSize(); i++)
{
if(m_arrUIMap[i].m_nID == nID) // matching UI map element
{
WORD wType = m_arrUIMap[i].m_wType & ~t_wType;
if (wType) // has other types
{
m_arrUIMap[i].m_wType = wType; // keep other types
return true;
}
else
{
return UIRemoveUpdateElement((WORD)nID);
}
}
}
return false;
}
// Menu
bool UIAddMenu(HMENU hMenu, bool bSetText = false)
{
#if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800)
using ATL::GetMenuString;
#endif
ATLASSERT(::IsMenu(hMenu));
MENUITEMINFO mii = {sizeof(MENUITEMINFO), MIIM_TYPE | MIIM_ID | MIIM_SUBMENU};
// Complete the UI map
for (INT uItem = 0; CMenuHandle(hMenu).GetMenuItemInfo(uItem, TRUE, &mii); uItem++)
{
if(mii.hSubMenu)
{
// Add submenu to UI map
UIAddMenu(mii.hSubMenu, bSetText);
}
else if (mii.wID)
{
// Add element to UI map
UIAddElement<UPDUI_MENUPOPUP>(mii.wID);
#if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)
if (bSetText)
{
TCHAR sText[64] = { 0 };
if (GetMenuString(hMenu, uItem, sText, 64, MF_BYPOSITION))
UISetText(mii.wID, sText);
}
#else
bSetText;
#endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)
}
}
return true;
}
bool UIAddMenu(UINT uID, bool bSetText = false)
{
CMenu menu;
ATLVERIFY(menu.LoadMenu(uID));
return UIAddMenu(menu, bSetText);
}
// ToolBar
#ifndef BTNS_SEP
#define BTNS_SEP TBSTYLE_SEP
#endif // BTNS_SEP compatibility
#if !defined(_WIN32_WCE) || (defined(_AUTOUI_CE_TOOLBAR) && defined(TBIF_BYINDEX))
bool UIAddToolBar(HWND hWndToolBar)
{
ATLASSERT(::IsWindow(hWndToolBar));
TBBUTTONINFO tbbi = {sizeof TBBUTTONINFO, TBIF_COMMAND | TBIF_STYLE | TBIF_BYINDEX};
// Add toolbar buttons
for (int uItem = 0; ::SendMessage(hWndToolBar, TB_GETBUTTONINFO, uItem, (LPARAM)&tbbi) != -1; uItem++)
{
if (tbbi.fsStyle ^ BTNS_SEP)
UIAddElement<UPDUI_TOOLBAR>(tbbi.idCommand);
}
// Add embedded controls if any
if (::GetWindow(hWndToolBar, GW_CHILD))
UIAddChildWindowContainer(hWndToolBar);
return (CUpdateUIBase::UIAddToolBar(hWndToolBar) != FALSE);
}
#endif // !defined(_WIN32_WCE) || (defined(_AUTOUI_CE_TOOLBAR) && defined(TBIF_BYINDEX))
// Container
bool UIAddChildWindowContainer(HWND hWnd)
{
ATLASSERT(::IsWindow(hWnd));
// Add children controls if any
for (ATL::CWindow wCtl = ::GetWindow(hWnd, GW_CHILD); wCtl.IsWindow(); wCtl = wCtl.GetWindow(GW_HWNDNEXT))
{
if (int id = wCtl.GetDlgCtrlID())
UIAddElement<UPDUI_CHILDWINDOW>(id);
}
return (CUpdateUIBase::UIAddChildWindowContainer(hWnd) != FALSE);
}
// StatusBar
BOOL UIUpdateStatusBar(BOOL bForceUpdate = FALSE)
{
if(!(m_wDirtyType & UPDUI_STATUSBAR) && !bForceUpdate)
return TRUE;
for(int i = 0; i < m_arrUIMap.GetSize(); i++)
{
for(int e = 0; e < m_UIElements.GetSize(); e++)
{
if((m_UIElements[e].m_wType == UPDUI_STATUSBAR) &&
(m_arrUIMap[i].m_wType & UPDUI_STATUSBAR) &&
(m_arrUIData[i].m_wState & UPDUI_STATUSBAR))
{
UIUpdateStatusBarElement(m_arrUIMap[i].m_nID, &m_arrUIData[i], m_UIElements[e].m_hWnd);
m_arrUIData[i].m_wState &= ~UPDUI_STATUSBAR;
if(m_arrUIData[i].m_wState & UPDUI_TEXT)
m_arrUIData[i].m_wState &= ~UPDUI_TEXT;
}
}
}
m_wDirtyType &= ~UPDUI_STATUSBAR;
return TRUE;
}
bool UIAddStatusBar(HWND hWndStatusBar, INT nPanes = 1)
{
ATLASSERT(::IsWindow(hWndStatusBar));
// Add StatusBar panes
for (int iPane = 0; iPane < nPanes; iPane++)
UIAddElement<UPDUI_STATUSBAR>(ID_DEFAULT_PANE + iPane);
return (CUpdateUIBase::UIAddStatusBar(hWndStatusBar) != FALSE);
}
// UI Map used if derived class has none
BEGIN_UPDATE_UI_MAP(CAutoUpdateUI)
END_UPDATE_UI_MAP()
};
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// CDialogResize - provides support for resizing dialog controls // CDialogResize - provides support for resizing dialog controls
// (works for any window that has child controls) // (works for any window that has child controls)

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifndef __ATLAPP_H__ #ifndef __ATLAPP_H__
#error atlgdi.h requires atlapp.h to be included first #error atlgdi.h requires atlapp.h to be included first
#endif #endif
@ -411,44 +407,60 @@ public:
void SetHeight(LONG nPointSize, HDC hDC = NULL) void SetHeight(LONG nPointSize, HDC hDC = NULL)
{ {
HDC hDC1 = (hDC != NULL) ? hDC : ::GetDC(NULL);
// For MM_TEXT mapping mode // For MM_TEXT mapping mode
lfHeight = -::MulDiv(nPointSize, ::GetDeviceCaps(hDC, LOGPIXELSY), 72); lfHeight = -::MulDiv(nPointSize, ::GetDeviceCaps(hDC1, LOGPIXELSY), 72);
if(hDC == NULL)
::ReleaseDC(NULL, hDC1);
} }
LONG GetHeight(HDC hDC = NULL) const LONG GetHeight(HDC hDC = NULL) const
{ {
HDC hDC1 = (hDC != NULL) ? hDC : ::GetDC(NULL);
// For MM_TEXT mapping mode // For MM_TEXT mapping mode
return ::MulDiv(-lfHeight, 72, ::GetDeviceCaps(hDC, LOGPIXELSY)); LONG nPointSize = ::MulDiv(-lfHeight, 72, ::GetDeviceCaps(hDC1, LOGPIXELSY));
if(hDC == NULL)
::ReleaseDC(NULL, hDC1);
return nPointSize;
} }
LONG GetDeciPointHeight(HDC hDC = NULL) const LONG GetDeciPointHeight(HDC hDC = NULL) const
{ {
HDC hDC1 = (hDC != NULL) ? hDC : ::GetDC(NULL);
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
POINT ptOrg = { 0, 0 }; POINT ptOrg = { 0, 0 };
::DPtoLP(hDC, &ptOrg, 1); ::DPtoLP(hDC1, &ptOrg, 1);
POINT pt = { 0, 0 }; POINT pt = { 0, 0 };
pt.y = abs(lfHeight) + ptOrg.y; pt.y = abs(lfHeight) + ptOrg.y;
::LPtoDP(hDC,&pt,1); ::LPtoDP(hDC1, &pt,1);
return ::MulDiv(pt.y, 720, ::GetDeviceCaps(hDC, LOGPIXELSY)); // 72 points/inch, 10 decipoints/point LONG nDeciPoint = ::MulDiv(pt.y, 720, ::GetDeviceCaps(hDC1, LOGPIXELSY)); // 72 points/inch, 10 decipoints/point
#else // CE specific #else // CE specific
// DP and LP are always the same on CE // DP and LP are always the same on CE
return ::MulDiv(abs(lfHeight), 720, ::GetDeviceCaps(hDC, LOGPIXELSY)); // 72 points/inch, 10 decipoints/point LONG nDeciPoint = ::MulDiv(abs(lfHeight), 720, ::GetDeviceCaps(hDC1, LOGPIXELSY)); // 72 points/inch, 10 decipoints/point
#endif // _WIN32_WCE #endif // _WIN32_WCE
if(hDC == NULL)
::ReleaseDC(NULL, hDC1);
return nDeciPoint;
} }
void SetHeightFromDeciPoint(LONG nDeciPtHeight, HDC hDC = NULL) void SetHeightFromDeciPoint(LONG nDeciPtHeight, HDC hDC = NULL)
{ {
HDC hDC1 = (hDC != NULL) ? hDC : ::GetDC(NULL);
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
POINT pt = { 0, 0 }; POINT pt = { 0, 0 };
pt.y = ::MulDiv(::GetDeviceCaps(hDC, LOGPIXELSY), nDeciPtHeight, 720); // 72 points/inch, 10 decipoints/point pt.y = ::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), nDeciPtHeight, 720); // 72 points/inch, 10 decipoints/point
::DPtoLP(hDC, &pt, 1); ::DPtoLP(hDC1, &pt, 1);
POINT ptOrg = { 0, 0 }; POINT ptOrg = { 0, 0 };
::DPtoLP(hDC, &ptOrg, 1); ::DPtoLP(hDC1, &ptOrg, 1);
lfHeight = -abs(pt.y - ptOrg.y); lfHeight = -abs(pt.y - ptOrg.y);
#else // CE specific #else // CE specific
// DP and LP are always the same on CE // DP and LP are always the same on CE
lfHeight = -abs(::MulDiv(::GetDeviceCaps(hDC, LOGPIXELSY), nDeciPtHeight, 720)); // 72 points/inch, 10 decipoints/point lfHeight = -abs(::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), nDeciPtHeight, 720)); // 72 points/inch, 10 decipoints/point
#endif // _WIN32_WCE #endif // _WIN32_WCE
if(hDC == NULL)
::ReleaseDC(NULL, hDC1);
} }
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
@ -2321,6 +2333,31 @@ public:
ATLASSERT(m_hDC != NULL); ATLASSERT(m_hDC != NULL);
return ::GradientFill(m_hDC, pVertices, nVertices, pMeshElements, nMeshElements, dwMode); return ::GradientFill(m_hDC, pVertices, nVertices, pMeshElements, nMeshElements, dwMode);
} }
BOOL GradientFillRect(RECT& rect, COLORREF clr1, COLORREF clr2, bool bHorizontal)
{
ATLASSERT(m_hDC != NULL);
TRIVERTEX arrTvx[2] = { { 0 }, { 0 } };
arrTvx[0].x = rect.left;
arrTvx[0].y = rect.top;
arrTvx[0].Red = MAKEWORD(0, GetRValue(clr1));
arrTvx[0].Green = MAKEWORD(0, GetGValue(clr1));
arrTvx[0].Blue = MAKEWORD(0, GetBValue(clr1));
arrTvx[0].Alpha = 0;
arrTvx[1].x = rect.right;
arrTvx[1].y = rect.bottom;
arrTvx[1].Red = MAKEWORD(0, GetRValue(clr2));
arrTvx[1].Green = MAKEWORD(0, GetGValue(clr2));
arrTvx[1].Blue = MAKEWORD(0, GetBValue(clr2));
arrTvx[1].Alpha = 0;
GRADIENT_RECT gr = { 0, 1 };
return ::GradientFill(m_hDC, arrTvx, 2, &gr, 1, bHorizontal ? GRADIENT_FILL_RECT_H : GRADIENT_FILL_RECT_V);
}
#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420) #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420)
#if !defined(_WIN32_WCE) || (_WIN32_WCE > 0x500) #if !defined(_WIN32_WCE) || (_WIN32_WCE > 0x500)
@ -3646,7 +3683,7 @@ struct DIBINFO16 // a BITMAPINFO with 2 additional color bitfields
DWORD dw[3] = DIBINFO16_BITFIELDS ; DWORD dw[3] = DIBINFO16_BITFIELDS ;
bmiHeader = bmih; bmiHeader = bmih;
memcpy(bmiColors, dw, 3 * sizeof(DWORD)); SecureHelper::memcpy_x(bmiColors, sizeof(bmiColors), dw, 3 * sizeof(DWORD));
} }
}; };
@ -3710,18 +3747,21 @@ inline int AtlGetDibNumColors(LPBITMAPINFOHEADER pbmih)
inline HBITMAP AtlGetDibBitmap(LPBITMAPINFO pbmi) inline HBITMAP AtlGetDibBitmap(LPBITMAPINFO pbmi)
{ {
HBITMAP hbm = NULL;
CDC dc(NULL); CDC dc(NULL);
void * pBits = NULL; void* pBits = NULL;
LPBYTE pDibBits = (LPBYTE)pbmi + sizeof(BITMAPINFOHEADER) + AtlGetDibColorTableSize(&pbmi->bmiHeader) * sizeof(RGBQUAD); LPBYTE pDibBits = (LPBYTE)pbmi + sizeof(BITMAPINFOHEADER) + AtlGetDibColorTableSize(&pbmi->bmiHeader) * sizeof(RGBQUAD);
if (hbm = CreateDIBSection(dc, pbmi, DIB_RGB_COLORS, &pBits, NULL, NULL)) HBITMAP hbm = CreateDIBSection(dc, pbmi, DIB_RGB_COLORS, &pBits, NULL, NULL);
memcpy(pBits, pDibBits, pbmi->bmiHeader.biSizeImage); if (hbm != NULL)
{
int cbBits = pbmi->bmiHeader.biWidth * pbmi->bmiHeader.biHeight * pbmi->bmiHeader.biBitCount / 8;
SecureHelper::memcpy_x(pBits, cbBits, pDibBits, pbmi->bmiHeader.biSizeImage);
}
return hbm; return hbm;
} }
inline HBITMAP AtlCopyBitmap(HBITMAP hbm , SIZE sizeDst, bool bAsBitmap = false) inline HBITMAP AtlCopyBitmap(HBITMAP hbm, SIZE sizeDst, bool bAsBitmap = false)
{ {
CDC hdcSrc = CreateCompatibleDC(NULL); CDC hdcSrc = CreateCompatibleDC(NULL);
CDC hdcDst = CreateCompatibleDC(NULL); CDC hdcDst = CreateCompatibleDC(NULL);
@ -3786,13 +3826,13 @@ inline HLOCAL AtlCreatePackedDib16(HBITMAP hbm, SIZE size)
} }
} }
if((bOK == TRUE) && (AtlIsDib16(&ds.dsBmih) == TRUE) && (ds.dsBm.bmBits != NULL)) if((bOK != FALSE) && (AtlIsDib16(&ds.dsBmih) != FALSE) && (ds.dsBm.bmBits != NULL))
{ {
pDib = (LPBYTE)LocalAlloc(LMEM_ZEROINIT, sizeof(DIBINFO16) + ds.dsBmih.biSizeImage); pDib = (LPBYTE)LocalAlloc(LMEM_ZEROINIT, sizeof(DIBINFO16) + ds.dsBmih.biSizeImage);
if (pDib != NULL) if (pDib != NULL)
{ {
memcpy(pDib , &ds.dsBmih, sizeof(DIBINFO16)); SecureHelper::memcpy_x(pDib, sizeof(DIBINFO16) + ds.dsBmih.biSizeImage, &ds.dsBmih, sizeof(DIBINFO16));
memcpy(pDib + sizeof(DIBINFO16), ds.dsBm.bmBits, ds.dsBmih.biSizeImage); SecureHelper::memcpy_x(pDib + sizeof(DIBINFO16), ds.dsBmih.biSizeImage, ds.dsBm.bmBits, ds.dsBmih.biSizeImage);
} }
} }
@ -3806,9 +3846,10 @@ inline bool AtlSetClipboardDib16(HBITMAP hbm, SIZE size, HWND hWnd)
{ {
ATLASSERT(::IsWindow(hWnd)); ATLASSERT(::IsWindow(hWnd));
BOOL bOK = OpenClipboard(hWnd); BOOL bOK = OpenClipboard(hWnd);
if (bOK == TRUE) if (bOK != FALSE)
{ {
if ((bOK = EmptyClipboard()) == TRUE) bOK = EmptyClipboard();
if (bOK != FALSE)
{ {
HLOCAL hDib = AtlCreatePackedDib16(hbm, size); HLOCAL hDib = AtlCreatePackedDib16(hbm, size);
if (hDib != NULL) if (hDib != NULL)
@ -3825,14 +3866,14 @@ inline bool AtlSetClipboardDib16(HBITMAP hbm, SIZE size, HWND hWnd)
CloseClipboard(); CloseClipboard();
} }
return bOK == TRUE; return (bOK != FALSE);
} }
inline HBITMAP AtlGetClipboardDib(HWND hWnd) inline HBITMAP AtlGetClipboardDib(HWND hWnd)
{ {
ATLASSERT(::IsWindow(hWnd) == TRUE); ATLASSERT(::IsWindow(hWnd) != FALSE);
HBITMAP hbm = NULL; HBITMAP hbm = NULL;
if (OpenClipboard(hWnd) == TRUE) if (OpenClipboard(hWnd) != FALSE)
{ {
LPBITMAPINFO pbmi = (LPBITMAPINFO)GetClipboardData(CF_DIB); LPBITMAPINFO pbmi = (LPBITMAPINFO)GetClipboardData(CF_DIB);
if (pbmi != NULL) if (pbmi != NULL)

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifndef __ATLAPP_H__ #ifndef __ATLAPP_H__
#error atlmisc.h requires atlapp.h to be included first #error atlmisc.h requires atlapp.h to be included first
#endif #endif
@ -55,22 +51,6 @@
// CFindFile // CFindFile
// //
// Global functions: // Global functions:
// AtlLoadAccelerators()
// AtlLoadMenu()
// AtlLoadBitmap()
// AtlLoadSysBitmap()
// AtlLoadCursor()
// AtlLoadSysCursor()
// AtlLoadIcon()
// AtlLoadSysIcon()
// AtlLoadBitmapImage()
// AtlLoadCursorImage()
// AtlLoadIconImage()
// AtlLoadSysBitmapImage()
// AtlLoadSysCursorImage()
// AtlLoadSysIconImage()
// AtlLoadString()
//
// AtlGetStockPen() // AtlGetStockPen()
// AtlGetStockBrush() // AtlGetStockBrush()
// AtlGetStockFont() // AtlGetStockFont()
@ -2481,18 +2461,6 @@ protected:
return (*p == ch) ? p : NULL; return (*p == ch) ? p : NULL;
} }
static const TCHAR* _cstrrchr(const TCHAR* p, TCHAR ch)
{
const TCHAR* lpsz = NULL;
while (*p != 0)
{
if (*p == ch)
lpsz = p;
p = ::CharNext(p);
}
return lpsz;
}
static TCHAR* _cstrrev(TCHAR* pStr) static TCHAR* _cstrrev(TCHAR* pStr)
{ {
// optimize NULL, zero-length, and single-char case // optimize NULL, zero-length, and single-char case
@ -2601,20 +2569,6 @@ protected:
return (p[n] != 0) ? &p[n] : NULL; return (p[n] != 0) ? &p[n] : NULL;
} }
static int _cstrisdigit(TCHAR ch)
{
WORD type;
GetStringTypeEx(GetThreadLocale(), CT_CTYPE1, &ch, 1, &type);
return (type & C1_DIGIT) == C1_DIGIT;
}
static int _cstrisspace(TCHAR ch)
{
WORD type;
GetStringTypeEx(GetThreadLocale(), CT_CTYPE1, &ch, 1, &type);
return (type & C1_SPACE) == C1_SPACE;
}
static int _cstrcmp(const TCHAR* pstrOne, const TCHAR* pstrOther) static int _cstrcmp(const TCHAR* pstrOne, const TCHAR* pstrOther)
{ {
return lstrcmp(pstrOne, pstrOther); return lstrcmp(pstrOne, pstrOther);
@ -2638,45 +2592,12 @@ protected:
ATLASSERT(nRet != 0); ATLASSERT(nRet != 0);
return nRet - 2; // convert to strcmp convention return nRet - 2; // convert to strcmp convention
} }
static int _cstrtoi(const TCHAR* nptr)
{
int c; // current char
int total; // current total
int sign; // if '-', then negative, otherwise positive
while (_cstrisspace(*nptr))
++nptr;
c = (int)(_TUCHAR)*nptr++;
sign = c; // save sign indication
if (c == _T('-') || c == _T('+'))
c = (int)(_TUCHAR)*nptr++; // skip sign
total = 0;
while (_cstrisdigit((TCHAR)c))
{
total = 10 * total + (c - '0'); // accumulate digit
c = (int)(_TUCHAR)*nptr++; // get next char
}
if (sign == '-')
return -total;
else
return total; // return result, negated if necessary
}
#else // !_ATL_MIN_CRT #else // !_ATL_MIN_CRT
static const TCHAR* _cstrchr(const TCHAR* p, TCHAR ch) static const TCHAR* _cstrchr(const TCHAR* p, TCHAR ch)
{ {
return _tcschr(p, ch); return _tcschr(p, ch);
} }
static const TCHAR* _cstrrchr(const TCHAR* p, TCHAR ch)
{
return _tcsrchr(p, ch);
}
static TCHAR* _cstrrev(TCHAR* pStr) static TCHAR* _cstrrev(TCHAR* pStr)
{ {
return _tcsrev(pStr); return _tcsrev(pStr);
@ -2702,16 +2623,6 @@ protected:
return _tcspbrk(p, lpszCharSet); return _tcspbrk(p, lpszCharSet);
} }
static int _cstrisdigit(TCHAR ch)
{
return _istdigit(ch);
}
static int _cstrisspace(TCHAR ch)
{
return _istspace((_TUCHAR)ch);
}
static int _cstrcmp(const TCHAR* pstrOne, const TCHAR* pstrOther) static int _cstrcmp(const TCHAR* pstrOne, const TCHAR* pstrOther)
{ {
return _tcscmp(pstrOne, pstrOther); return _tcscmp(pstrOne, pstrOther);
@ -2733,12 +2644,27 @@ protected:
return _tcsicoll(pstrOne, pstrOther); return _tcsicoll(pstrOne, pstrOther);
} }
#endif // !_WIN32_WCE #endif // !_WIN32_WCE
#endif // !_ATL_MIN_CRT
static const TCHAR* _cstrrchr(const TCHAR* p, TCHAR ch)
{
return MinCrtHelper::_strrchr(p, ch);
}
static int _cstrisdigit(TCHAR ch)
{
return MinCrtHelper::_isdigit(ch);
}
static int _cstrisspace(TCHAR ch)
{
return MinCrtHelper::_isspace(ch);
}
static int _cstrtoi(const TCHAR* nptr) static int _cstrtoi(const TCHAR* nptr)
{ {
return _ttoi(nptr); return MinCrtHelper::_atoi(nptr);
} }
#endif // !_ATL_MIN_CRT
static const TCHAR* _cstrchr_db(const TCHAR* p, TCHAR ch1, TCHAR ch2) static const TCHAR* _cstrchr_db(const TCHAR* p, TCHAR ch1, TCHAR ch2)
{ {
@ -3066,8 +2992,8 @@ public:
BOOL ReadFromRegistry(LPCTSTR lpstrRegKey) BOOL ReadFromRegistry(LPCTSTR lpstrRegKey)
{ {
T* pT = static_cast<T*>(this); T* pT = static_cast<T*>(this);
ATL::CRegKey rkParent; CRegKeyEx rkParent;
ATL::CRegKey rk; CRegKeyEx rk;
LONG lRet = rkParent.Open(HKEY_CURRENT_USER, lpstrRegKey); LONG lRet = rkParent.Open(HKEY_CURRENT_USER, lpstrRegKey);
if(lRet != ERROR_SUCCESS) if(lRet != ERROR_SUCCESS)
@ -3077,11 +3003,7 @@ public:
return FALSE; return FALSE;
DWORD dwRet = 0; DWORD dwRet = 0;
#if (_ATL_VER >= 0x0700)
lRet = rk.QueryDWORDValue(pT->GetRegCountName(), dwRet); lRet = rk.QueryDWORDValue(pT->GetRegCountName(), dwRet);
#else
lRet = rk.QueryValue(dwRet, pT->GetRegCountName());
#endif
if(lRet != ERROR_SUCCESS) if(lRet != ERROR_SUCCESS)
return FALSE; return FALSE;
SetMaxEntries(dwRet); SetMaxEntries(dwRet);
@ -3095,13 +3017,8 @@ public:
{ {
TCHAR szBuff[m_cchItemNameLen] = { 0 }; TCHAR szBuff[m_cchItemNameLen] = { 0 };
SecureHelper::wsprintf_x(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem); SecureHelper::wsprintf_x(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem);
#if (_ATL_VER >= 0x0700)
ULONG ulCount = t_cchItemLen; ULONG ulCount = t_cchItemLen;
lRet = rk.QueryStringValue(szBuff, szRetString, &ulCount); lRet = rk.QueryStringValue(szBuff, szRetString, &ulCount);
#else
DWORD dwCount = t_cchItemLen * sizeof(TCHAR);
lRet = rk.QueryValue(szRetString, szBuff, &dwCount);
#endif
if(lRet == ERROR_SUCCESS) if(lRet == ERROR_SUCCESS)
{ {
SecureHelper::strcpy_x(de.szDocName, _countof(de.szDocName), szRetString); SecureHelper::strcpy_x(de.szDocName, _countof(de.szDocName), szRetString);
@ -3119,8 +3036,8 @@ public:
{ {
T* pT = static_cast<T*>(this); T* pT = static_cast<T*>(this);
pT; // avoid level 4 warning pT; // avoid level 4 warning
ATL::CRegKey rkParent; CRegKeyEx rkParent;
ATL::CRegKey rk; CRegKeyEx rk;
LONG lRet = rkParent.Create(HKEY_CURRENT_USER, lpstrRegKey); LONG lRet = rkParent.Create(HKEY_CURRENT_USER, lpstrRegKey);
if(lRet != ERROR_SUCCESS) if(lRet != ERROR_SUCCESS)
@ -3129,11 +3046,7 @@ public:
if(lRet != ERROR_SUCCESS) if(lRet != ERROR_SUCCESS)
return FALSE; return FALSE;
#if (_ATL_VER >= 0x0700)
lRet = rk.SetDWORDValue(pT->GetRegCountName(), m_nMaxEntries); lRet = rk.SetDWORDValue(pT->GetRegCountName(), m_nMaxEntries);
#else
lRet = rk.SetValue(m_nMaxEntries, pT->GetRegCountName());
#endif
ATLASSERT(lRet == ERROR_SUCCESS); ATLASSERT(lRet == ERROR_SUCCESS);
// set new values // set new values
@ -3144,11 +3057,7 @@ public:
SecureHelper::wsprintf_x(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem); SecureHelper::wsprintf_x(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem);
TCHAR szDocName[t_cchItemLen] = { 0 }; TCHAR szDocName[t_cchItemLen] = { 0 };
GetFromList(t_nFirstID + nItem - 1, szDocName, t_cchItemLen); GetFromList(t_nFirstID + nItem - 1, szDocName, t_cchItemLen);
#if (_ATL_VER >= 0x0700)
lRet = rk.SetStringValue(szBuff, szDocName); lRet = rk.SetStringValue(szBuff, szDocName);
#else
lRet = rk.SetValue(szDocName, szBuff);
#endif
ATLASSERT(lRet == ERROR_SUCCESS); ATLASSERT(lRet == ERROR_SUCCESS);
} }
@ -3367,7 +3276,7 @@ public:
return FALSE; return FALSE;
// find the last dot // find the last dot
LPTSTR pstrDot = (LPTSTR)_cstrrchr(szBuff, _T('.')); LPTSTR pstrDot = MinCrtHelper::_strrchr(szBuff, _T('.'));
if(pstrDot != NULL) if(pstrDot != NULL)
*pstrDot = 0; *pstrDot = 0;
@ -3616,8 +3525,8 @@ public:
else else
{ {
// find the last forward or backward whack // find the last forward or backward whack
LPTSTR pstrBack = (LPTSTR)_cstrrchr(m_lpszRoot, _T('\\')); LPTSTR pstrBack = MinCrtHelper::_strrchr(m_lpszRoot, _T('\\'));
LPTSTR pstrFront = (LPTSTR)_cstrrchr(m_lpszRoot, _T('/')); LPTSTR pstrFront = MinCrtHelper::_strrchr(m_lpszRoot, _T('/'));
if(pstrFront != NULL || pstrBack != NULL) if(pstrFront != NULL || pstrBack != NULL)
{ {
@ -3665,193 +3574,9 @@ public:
m_hFind = NULL; m_hFind = NULL;
} }
} }
// Helper
static const TCHAR* _cstrrchr(const TCHAR* p, TCHAR ch)
{
#ifdef _ATL_MIN_CRT
const TCHAR* lpsz = NULL;
while (*p != 0)
{
if (*p == ch)
lpsz = p;
p = ::CharNext(p);
}
return lpsz;
#else // !_ATL_MIN_CRT
return _tcsrchr(p, ch);
#endif // !_ATL_MIN_CRT
}
}; };
///////////////////////////////////////////////////////////////////////////////
// Global functions for loading resources
inline HACCEL AtlLoadAccelerators(ATL::_U_STRINGorID table)
{
return ::LoadAccelerators(ModuleHelper::GetResourceInstance(), table.m_lpstr);
}
inline HMENU AtlLoadMenu(ATL::_U_STRINGorID menu)
{
return ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr);
}
inline HBITMAP AtlLoadBitmap(ATL::_U_STRINGorID bitmap)
{
return ::LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr);
}
#ifdef OEMRESOURCE
inline HBITMAP AtlLoadSysBitmap(ATL::_U_STRINGorID bitmap)
{
#ifdef _DEBUG
WORD wID = (WORD)bitmap.m_lpstr;
ATLASSERT(wID >= 32734 && wID <= 32767);
#endif // _DEBUG
return ::LoadBitmap(NULL, bitmap.m_lpstr);
}
#endif // OEMRESOURCE
inline HCURSOR AtlLoadCursor(ATL::_U_STRINGorID cursor)
{
return ::LoadCursor(ModuleHelper::GetResourceInstance(), cursor.m_lpstr);
}
inline HCURSOR AtlLoadSysCursor(LPCTSTR lpCursorName)
{
#if (WINVER >= 0x0500)
ATLASSERT(lpCursorName == IDC_ARROW || lpCursorName == IDC_IBEAM || lpCursorName == IDC_WAIT ||
lpCursorName == IDC_CROSS || lpCursorName == IDC_UPARROW || lpCursorName == IDC_SIZE ||
lpCursorName == IDC_ICON || lpCursorName == IDC_SIZENWSE || lpCursorName == IDC_SIZENESW ||
lpCursorName == IDC_SIZEWE || lpCursorName == IDC_SIZENS || lpCursorName == IDC_SIZEALL ||
lpCursorName == IDC_NO || lpCursorName == IDC_APPSTARTING || lpCursorName == IDC_HELP ||
lpCursorName == IDC_HAND);
#else // !(WINVER >= 0x0500)
ATLASSERT(lpCursorName == IDC_ARROW || lpCursorName == IDC_IBEAM || lpCursorName == IDC_WAIT ||
lpCursorName == IDC_CROSS || lpCursorName == IDC_UPARROW || lpCursorName == IDC_SIZE ||
lpCursorName == IDC_ICON || lpCursorName == IDC_SIZENWSE || lpCursorName == IDC_SIZENESW ||
lpCursorName == IDC_SIZEWE || lpCursorName == IDC_SIZENS || lpCursorName == IDC_SIZEALL ||
lpCursorName == IDC_NO || lpCursorName == IDC_APPSTARTING || lpCursorName == IDC_HELP);
#endif // !(WINVER >= 0x0500)
return ::LoadCursor(NULL, lpCursorName);
}
inline HICON AtlLoadIcon(ATL::_U_STRINGorID icon)
{
return ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr);
}
#ifndef _WIN32_WCE
inline HICON AtlLoadSysIcon(LPCTSTR lpIconName)
{
#if (WINVER >= 0x0600)
ATLASSERT(lpIconName == IDI_APPLICATION || lpIconName == IDI_ASTERISK || lpIconName == IDI_EXCLAMATION ||
lpIconName == IDI_HAND || lpIconName == IDI_QUESTION || lpIconName == IDI_WINLOGO ||
lpIconName == IDI_SHIELD);
#else // !(WINVER >= 0x0600)
ATLASSERT(lpIconName == IDI_APPLICATION || lpIconName == IDI_ASTERISK || lpIconName == IDI_EXCLAMATION ||
lpIconName == IDI_HAND || lpIconName == IDI_QUESTION || lpIconName == IDI_WINLOGO);
#endif // !(WINVER >= 0x0600)
return ::LoadIcon(NULL, lpIconName);
}
#endif // !_WIN32_WCE
inline HBITMAP AtlLoadBitmapImage(ATL::_U_STRINGorID bitmap, UINT fuLoad = LR_DEFAULTCOLOR)
{
return (HBITMAP)::LoadImage(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr, IMAGE_BITMAP, 0, 0, fuLoad);
}
inline HCURSOR AtlLoadCursorImage(ATL::_U_STRINGorID cursor, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)
{
return (HCURSOR)::LoadImage(ModuleHelper::GetResourceInstance(), cursor.m_lpstr, IMAGE_CURSOR, cxDesired, cyDesired, fuLoad);
}
inline HICON AtlLoadIconImage(ATL::_U_STRINGorID icon, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)
{
return (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), icon.m_lpstr, IMAGE_ICON, cxDesired, cyDesired, fuLoad);
}
#ifdef OEMRESOURCE
inline HBITMAP AtlLoadSysBitmapImage(WORD wBitmapID, UINT fuLoad = LR_DEFAULTCOLOR)
{
ATLASSERT(wBitmapID >= 32734 && wBitmapID <= 32767);
ATLASSERT((fuLoad & LR_LOADFROMFILE) == 0); // this one doesn't load from a file
return (HBITMAP)::LoadImage(NULL, MAKEINTRESOURCE(wBitmapID), IMAGE_BITMAP, 0, 0, fuLoad);
}
#endif // OEMRESOURCE
inline HCURSOR AtlLoadSysCursorImage(ATL::_U_STRINGorID cursor, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)
{
#ifdef _DEBUG
WORD wID = (WORD)cursor.m_lpstr;
ATLASSERT((wID >= 32512 && wID <= 32516) || (wID >= 32640 && wID <= 32648) || (wID == 32650) || (wID == 32651));
ATLASSERT((fuLoad & LR_LOADFROMFILE) == 0); // this one doesn't load from a file
#endif // _DEBUG
return (HCURSOR)::LoadImage(NULL, cursor.m_lpstr, IMAGE_CURSOR, cxDesired, cyDesired, fuLoad);
}
inline HICON AtlLoadSysIconImage(ATL::_U_STRINGorID icon, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)
{
#ifdef _DEBUG
WORD wID = (WORD)icon.m_lpstr;
ATLASSERT(wID >= 32512 && wID <= 32517);
ATLASSERT((fuLoad & LR_LOADFROMFILE) == 0); // this one doesn't load from a file
#endif // _DEBUG
return (HICON)::LoadImage(NULL, icon.m_lpstr, IMAGE_ICON, cxDesired, cyDesired, fuLoad);
}
#if (_ATL_VER < 0x0700)
inline int AtlLoadString(UINT uID, LPTSTR lpBuffer, int nBufferMax)
{
return ::LoadString(_Module.GetResourceInstance(), uID, lpBuffer, nBufferMax);
}
#endif // (_ATL_VER < 0x0700)
#ifdef _WIN32_WCE // CE only direct access to the resource
inline LPCTSTR AtlLoadString(UINT uID)
{
LPCTSTR s = (LPCTSTR)::LoadString(ModuleHelper::GetResourceInstance(), uID, NULL, 0);
#ifdef DEBUG // Check for null-termination
if(s != NULL)
// Note: RC -n <file.rc> compiles null-terminated resource strings
ATLASSERT(s[*((WORD*)s -1) - 1] == L'\0');
#endif
return s;
}
#endif // _WIN32_WCE
inline bool AtlLoadString(UINT uID, BSTR& bstrText)
{
USES_CONVERSION;
ATLASSERT(bstrText == NULL);
LPTSTR lpstrText = NULL;
int nRes = 0;
for(int nLen = 256; ; nLen *= 2)
{
ATLTRY(lpstrText = new TCHAR[nLen]);
if(lpstrText == NULL)
break;
nRes = ::LoadString(ModuleHelper::GetResourceInstance(), uID, lpstrText, nLen);
if(nRes < nLen - 1)
break;
delete [] lpstrText;
lpstrText = NULL;
}
if(lpstrText != NULL)
{
if(nRes != 0)
bstrText = ::SysAllocString(T2OLE(lpstrText));
delete [] lpstrText;
}
return (bstrText != NULL) ? true : false;
}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Global functions for stock GDI objects // Global functions for stock GDI objects

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifdef _WIN32_WCE #ifdef _WIN32_WCE
#error atlprint.h is not supported on Windows CE #error atlprint.h is not supported on Windows CE
#endif #endif

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -217,6 +217,7 @@
#define ID_VIEW_TOOLBAR 0xE800 #define ID_VIEW_TOOLBAR 0xE800
#define ID_VIEW_STATUS_BAR 0xE801 #define ID_VIEW_STATUS_BAR 0xE801
#define ID_VIEW_REFRESH 0xE803 #define ID_VIEW_REFRESH 0xE803
#define ID_VIEW_RIBBON 0xE804 // Ribbon
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Standard control IDs // Standard control IDs

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifndef __ATLAPP_H__ #ifndef __ATLAPP_H__
#error atlscrl.h requires atlapp.h to be included first #error atlscrl.h requires atlapp.h to be included first
#endif #endif
@ -34,10 +30,6 @@
#define GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam)) #define GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam))
#endif #endif
#ifndef WM_MOUSEHWHEEL
#define WM_MOUSEHWHEEL 0x020E
#endif
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Classes in this file: // Classes in this file:

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifndef __ATLAPP_H__ #ifndef __ATLAPP_H__
#error atlsplit.h requires atlapp.h to be included first #error atlsplit.h requires atlapp.h to be included first
#endif #endif
@ -53,6 +49,8 @@ namespace WTL
#define SPLIT_NONINTERACTIVE 0x00000002 #define SPLIT_NONINTERACTIVE 0x00000002
#define SPLIT_RIGHTALIGNED 0x00000004 #define SPLIT_RIGHTALIGNED 0x00000004
#define SPLIT_BOTTOMALIGNED SPLIT_RIGHTALIGNED #define SPLIT_BOTTOMALIGNED SPLIT_RIGHTALIGNED
#define SPLIT_GRADIENTBAR 0x00000008
#define SPLIT_FIXEDBARSIZE 0x00000010
// Note: SPLIT_PROPORTIONAL and SPLIT_RIGHTALIGNED/SPLIT_BOTTOMALIGNED are // Note: SPLIT_PROPORTIONAL and SPLIT_RIGHTALIGNED/SPLIT_BOTTOMALIGNED are
// mutually exclusive. If both are set, splitter defaults to SPLIT_PROPORTIONAL // mutually exclusive. If both are set, splitter defaults to SPLIT_PROPORTIONAL
@ -82,7 +80,7 @@ public:
// Constructor // Constructor
CSplitterImpl() : CSplitterImpl() :
m_xySplitterPos(-1), m_nDefActivePane(SPLIT_PANE_NONE), m_xySplitterPos(-1), m_nDefActivePane(SPLIT_PANE_NONE),
m_cxySplitBar(0), m_cxyMin(0), m_cxyBarEdge(0), m_bFullDrag(true), m_cxySplitBar(4), m_cxyMin(0), m_cxyBarEdge(0), m_bFullDrag(true),
m_cxyDragOffset(0), m_nProportionalPos(0), m_bUpdateProportionalPos(true), m_cxyDragOffset(0), m_nProportionalPos(0), m_bUpdateProportionalPos(true),
m_dwExtendedStyle(SPLIT_PROPORTIONAL), m_dwExtendedStyle(SPLIT_PROPORTIONAL),
m_nSinglePane(SPLIT_PANE_NONE) m_nSinglePane(SPLIT_PANE_NONE)
@ -386,10 +384,24 @@ public:
// Overrideables // Overrideables
void DrawSplitterBar(CDCHandle dc) void DrawSplitterBar(CDCHandle dc)
{ {
RECT rect; RECT rect = { 0 };
if(GetSplitterBarRect(&rect)) if(GetSplitterBarRect(&rect))
{ {
dc.FillRect(&rect, COLOR_3DFACE); dc.FillRect(&rect, COLOR_3DFACE);
#if (!defined(_WIN32_WCE) || (_WIN32_WCE >= 420))
if((m_dwExtendedStyle & SPLIT_GRADIENTBAR) != 0)
{
RECT rect2 = rect;
if(t_bVertical)
rect2.left = (rect.left + rect.right) / 2 - 1;
else
rect2.top = (rect.top + rect.bottom) / 2 - 1;
dc.GradientFillRect(rect2, ::GetSysColor(COLOR_3DFACE), ::GetSysColor(COLOR_3DSHADOW), t_bVertical);
}
#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420)
// draw 3D edge if needed // draw 3D edge if needed
T* pT = static_cast<T*>(this); T* pT = static_cast<T*>(this);
if((pT->GetExStyle() & WS_EX_CLIENTEDGE) != 0) if((pT->GetExStyle() & WS_EX_CLIENTEDGE) != 0)
@ -400,7 +412,7 @@ public:
// called only if pane is empty // called only if pane is empty
void DrawSplitterPane(CDCHandle dc, int nPane) void DrawSplitterPane(CDCHandle dc, int nPane)
{ {
RECT rect; RECT rect = { 0 };
if(GetSplitterPaneRect(nPane, &rect)) if(GetSplitterPaneRect(nPane, &rect))
{ {
T* pT = static_cast<T*>(this); T* pT = static_cast<T*>(this);
@ -435,7 +447,9 @@ public:
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{ {
GetSystemSettings(false); T* pT = static_cast<T*>(this);
pT->GetSystemSettings(false);
bHandled = FALSE; bHandled = FALSE;
return 1; return 1;
} }
@ -580,7 +594,7 @@ public:
DWORD dwPos = ::GetMessagePos(); DWORD dwPos = ::GetMessagePos();
POINT pt = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) }; POINT pt = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) };
pT->ScreenToClient(&pt); pT->ScreenToClient(&pt);
RECT rcPane; RECT rcPane = { 0 };
for(int nPane = 0; nPane < m_nPanesCount; nPane++) for(int nPane = 0; nPane < m_nPanesCount; nPane++)
{ {
if(GetSplitterPaneRect(nPane, &rcPane) && ::PtInRect(&rcPane, pt)) if(GetSplitterPaneRect(nPane, &rcPane) && ::PtInRect(&rcPane, pt))
@ -596,7 +610,9 @@ public:
LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{ {
GetSystemSettings(true); T* pT = static_cast<T*>(this);
pT->GetSystemSettings(true);
return 0; return 0;
} }
@ -607,7 +623,7 @@ public:
return; return;
T* pT = static_cast<T*>(this); T* pT = static_cast<T*>(this);
RECT rect = { 0, 0, 0, 0 }; RECT rect = { 0 };
if(m_nSinglePane == SPLIT_PANE_NONE) if(m_nSinglePane == SPLIT_PANE_NONE)
{ {
if(GetSplitterBarRect(&rect)) if(GetSplitterBarRect(&rect))
@ -733,11 +749,17 @@ public:
void DrawGhostBar() void DrawGhostBar()
{ {
RECT rect = { 0, 0, 0, 0 }; RECT rect = { 0 };
if(GetSplitterBarRect(&rect)) if(GetSplitterBarRect(&rect))
{ {
// invert the brush pattern (looks just like frame window sizing) // convert client to window coordinates
T* pT = static_cast<T*>(this); T* pT = static_cast<T*>(this);
RECT rcWnd = { 0 };
pT->GetWindowRect(&rcWnd);
::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rcWnd, 2);
::OffsetRect(&rect, -rcWnd.left, -rcWnd.top);
// invert the brush pattern (looks just like frame window sizing)
CWindowDC dc(pT->m_hWnd); CWindowDC dc(pT->m_hWnd);
CBrush brush = CDCHandle::GetHalftoneBrush(); CBrush brush = CDCHandle::GetHalftoneBrush();
if(brush.m_hBrush != NULL) if(brush.m_hBrush != NULL)
@ -751,11 +773,14 @@ public:
void GetSystemSettings(bool bUpdate) void GetSystemSettings(bool bUpdate)
{ {
if((m_dwExtendedStyle & SPLIT_FIXEDBARSIZE) == 0)
{
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
m_cxySplitBar = ::GetSystemMetrics(t_bVertical ? SM_CXSIZEFRAME : SM_CYSIZEFRAME); m_cxySplitBar = ::GetSystemMetrics(t_bVertical ? SM_CXSIZEFRAME : SM_CYSIZEFRAME);
#else // CE specific #else // CE specific
m_cxySplitBar = 2 * ::GetSystemMetrics(t_bVertical ? SM_CXEDGE : SM_CYEDGE); m_cxySplitBar = 2 * ::GetSystemMetrics(t_bVertical ? SM_CXEDGE : SM_CYEDGE);
#endif // _WIN32_WCE #endif // _WIN32_WCE
}
T* pT = static_cast<T*>(this); T* pT = static_cast<T*>(this);
if((pT->GetExStyle() & WS_EX_CLIENTEDGE)) if((pT->GetExStyle() & WS_EX_CLIENTEDGE))

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifdef _WIN32_WCE #ifdef _WIN32_WCE
#error atltheme.h is not supported on Windows CE #error atltheme.h is not supported on Windows CE
#endif #endif
@ -37,10 +33,14 @@
#if defined(_WTL_USE_VSSYM32) || (defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)) #if defined(_WTL_USE_VSSYM32) || (defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN))
#include <vssym32.h> #include <vssym32.h>
#else #else
#ifndef TMSCHEMA_H
#include <tmschema.h> #include <tmschema.h>
#endif
#endif #endif
#ifndef _UXTHEME_H_
#include <uxtheme.h> #include <uxtheme.h>
#endif
#pragma comment(lib, "uxtheme.lib") #pragma comment(lib, "uxtheme.lib")
// Note: To create an application that also runs on older versions of Windows, // Note: To create an application that also runs on older versions of Windows,

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifndef __ATLAPP_H__ #ifndef __ATLAPP_H__
#error atluser.h requires atlapp.h to be included first #error atluser.h requires atlapp.h to be included first
#endif #endif
@ -35,6 +31,22 @@
// //
// Global functions: // Global functions:
// AtlMessageBox() // AtlMessageBox()
//
// AtlLoadAccelerators()
// AtlLoadMenu()
// AtlLoadBitmap()
// AtlLoadSysBitmap()
// AtlLoadCursor()
// AtlLoadSysCursor()
// AtlLoadIcon()
// AtlLoadSysIcon()
// AtlLoadBitmapImage()
// AtlLoadCursorImage()
// AtlLoadIconImage()
// AtlLoadSysBitmapImage()
// AtlLoadSysCursorImage()
// AtlLoadSysIconImage()
// AtlLoadString()
namespace WTL namespace WTL
@ -401,7 +413,38 @@ public:
return (bstrText != NULL) ? TRUE : FALSE; return (bstrText != NULL) ? TRUE : FALSE;
} }
#endif // !_ATL_NO_COM #endif // !_ATL_NO_COM
#endif // !_WIN32_WCE
#elif (_ATL_VER >= 0x0800)
int GetMenuItemCount() const
{
ATLASSERT(::IsMenu(m_hMenu));
return ATL::GetMenuItemCount(m_hMenu);
}
UINT GetMenuItemID(int nPos) const
{
ATLASSERT(::IsMenu(m_hMenu));
return ATL::GetMenuItemID(m_hMenu, nPos);
}
UINT GetMenuState(UINT nID, UINT nFlags) const
{
ATLASSERT(::IsMenu(m_hMenu));
return ATL::GetMenuState(m_hMenu, nID, nFlags);
}
int GetMenuString(UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags) const
{
ATLASSERT(::IsMenu(m_hMenu));
return ATL::GetMenuString(m_hMenu, nIDItem, lpString, nMaxCount, nFlags);
}
int GetMenuStringLen(UINT nIDItem, UINT nFlags) const
{
ATLASSERT(::IsMenu(m_hMenu));
return ATL::GetMenuString(m_hMenu, nIDItem, NULL, 0, nFlags);
}
#endif // (_ATL_VER >= 0x0800)
#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
int GetMenuString(UINT nIDItem, _CSTRING_NS::CString& strText, UINT nFlags) const int GetMenuString(UINT nIDItem, _CSTRING_NS::CString& strText, UINT nFlags) const
@ -1157,6 +1200,192 @@ public:
} }
}; };
///////////////////////////////////////////////////////////////////////////////
// Toolbar resource descriptor
struct _AtlToolBarData
{
WORD wVersion;
WORD wWidth;
WORD wHeight;
WORD wItemCount;
WORD* items()
{ return (WORD*)(this+1); }
};
///////////////////////////////////////////////////////////////////////////////
// Global functions for loading resources
inline HACCEL AtlLoadAccelerators(ATL::_U_STRINGorID table)
{
return ::LoadAccelerators(ModuleHelper::GetResourceInstance(), table.m_lpstr);
}
inline HMENU AtlLoadMenu(ATL::_U_STRINGorID menu)
{
return ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr);
}
inline HBITMAP AtlLoadBitmap(ATL::_U_STRINGorID bitmap)
{
return ::LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr);
}
#ifdef OEMRESOURCE
inline HBITMAP AtlLoadSysBitmap(ATL::_U_STRINGorID bitmap)
{
#ifdef _DEBUG
WORD wID = (WORD)bitmap.m_lpstr;
ATLASSERT(wID >= 32734 && wID <= 32767);
#endif // _DEBUG
return ::LoadBitmap(NULL, bitmap.m_lpstr);
}
#endif // OEMRESOURCE
inline HCURSOR AtlLoadCursor(ATL::_U_STRINGorID cursor)
{
return ::LoadCursor(ModuleHelper::GetResourceInstance(), cursor.m_lpstr);
}
inline HCURSOR AtlLoadSysCursor(LPCTSTR lpCursorName)
{
#if (WINVER >= 0x0500)
ATLASSERT(lpCursorName == IDC_ARROW || lpCursorName == IDC_IBEAM || lpCursorName == IDC_WAIT ||
lpCursorName == IDC_CROSS || lpCursorName == IDC_UPARROW || lpCursorName == IDC_SIZE ||
lpCursorName == IDC_ICON || lpCursorName == IDC_SIZENWSE || lpCursorName == IDC_SIZENESW ||
lpCursorName == IDC_SIZEWE || lpCursorName == IDC_SIZENS || lpCursorName == IDC_SIZEALL ||
lpCursorName == IDC_NO || lpCursorName == IDC_APPSTARTING || lpCursorName == IDC_HELP ||
lpCursorName == IDC_HAND);
#else // !(WINVER >= 0x0500)
ATLASSERT(lpCursorName == IDC_ARROW || lpCursorName == IDC_IBEAM || lpCursorName == IDC_WAIT ||
lpCursorName == IDC_CROSS || lpCursorName == IDC_UPARROW || lpCursorName == IDC_SIZE ||
lpCursorName == IDC_ICON || lpCursorName == IDC_SIZENWSE || lpCursorName == IDC_SIZENESW ||
lpCursorName == IDC_SIZEWE || lpCursorName == IDC_SIZENS || lpCursorName == IDC_SIZEALL ||
lpCursorName == IDC_NO || lpCursorName == IDC_APPSTARTING || lpCursorName == IDC_HELP);
#endif // !(WINVER >= 0x0500)
return ::LoadCursor(NULL, lpCursorName);
}
inline HICON AtlLoadIcon(ATL::_U_STRINGorID icon)
{
return ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr);
}
#ifndef _WIN32_WCE
inline HICON AtlLoadSysIcon(LPCTSTR lpIconName)
{
#if (WINVER >= 0x0600)
ATLASSERT(lpIconName == IDI_APPLICATION || lpIconName == IDI_ASTERISK || lpIconName == IDI_EXCLAMATION ||
lpIconName == IDI_HAND || lpIconName == IDI_QUESTION || lpIconName == IDI_WINLOGO ||
lpIconName == IDI_SHIELD);
#else // !(WINVER >= 0x0600)
ATLASSERT(lpIconName == IDI_APPLICATION || lpIconName == IDI_ASTERISK || lpIconName == IDI_EXCLAMATION ||
lpIconName == IDI_HAND || lpIconName == IDI_QUESTION || lpIconName == IDI_WINLOGO);
#endif // !(WINVER >= 0x0600)
return ::LoadIcon(NULL, lpIconName);
}
#endif // !_WIN32_WCE
inline HBITMAP AtlLoadBitmapImage(ATL::_U_STRINGorID bitmap, UINT fuLoad = LR_DEFAULTCOLOR)
{
return (HBITMAP)::LoadImage(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr, IMAGE_BITMAP, 0, 0, fuLoad);
}
inline HCURSOR AtlLoadCursorImage(ATL::_U_STRINGorID cursor, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)
{
return (HCURSOR)::LoadImage(ModuleHelper::GetResourceInstance(), cursor.m_lpstr, IMAGE_CURSOR, cxDesired, cyDesired, fuLoad);
}
inline HICON AtlLoadIconImage(ATL::_U_STRINGorID icon, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)
{
return (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), icon.m_lpstr, IMAGE_ICON, cxDesired, cyDesired, fuLoad);
}
#ifdef OEMRESOURCE
inline HBITMAP AtlLoadSysBitmapImage(WORD wBitmapID, UINT fuLoad = LR_DEFAULTCOLOR)
{
ATLASSERT(wBitmapID >= 32734 && wBitmapID <= 32767);
ATLASSERT((fuLoad & LR_LOADFROMFILE) == 0); // this one doesn't load from a file
return (HBITMAP)::LoadImage(NULL, MAKEINTRESOURCE(wBitmapID), IMAGE_BITMAP, 0, 0, fuLoad);
}
#endif // OEMRESOURCE
inline HCURSOR AtlLoadSysCursorImage(ATL::_U_STRINGorID cursor, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)
{
#ifdef _DEBUG
WORD wID = (WORD)cursor.m_lpstr;
ATLASSERT((wID >= 32512 && wID <= 32516) || (wID >= 32640 && wID <= 32648) || (wID == 32650) || (wID == 32651));
ATLASSERT((fuLoad & LR_LOADFROMFILE) == 0); // this one doesn't load from a file
#endif // _DEBUG
return (HCURSOR)::LoadImage(NULL, cursor.m_lpstr, IMAGE_CURSOR, cxDesired, cyDesired, fuLoad);
}
inline HICON AtlLoadSysIconImage(ATL::_U_STRINGorID icon, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)
{
#ifdef _DEBUG
WORD wID = (WORD)icon.m_lpstr;
ATLASSERT(wID >= 32512 && wID <= 32517);
ATLASSERT((fuLoad & LR_LOADFROMFILE) == 0); // this one doesn't load from a file
#endif // _DEBUG
return (HICON)::LoadImage(NULL, icon.m_lpstr, IMAGE_ICON, cxDesired, cyDesired, fuLoad);
}
#if (_ATL_VER < 0x0700)
inline int AtlLoadString(UINT uID, LPTSTR lpBuffer, int nBufferMax)
{
return ::LoadString(ModuleHelper::GetResourceInstance(), uID, lpBuffer, nBufferMax);
}
#else
using ATL::AtlLoadString;
#endif // (_ATL_VER < 0x0700)
#ifdef _WIN32_WCE // CE only direct access to the resource
inline LPCTSTR AtlLoadString(UINT uID)
{
LPCTSTR s = (LPCTSTR)::LoadString(ModuleHelper::GetResourceInstance(), uID, NULL, 0);
#ifdef DEBUG // Check for null-termination
if(s != NULL)
// Note: RC -n <file.rc> compiles null-terminated resource strings
ATLASSERT(s[*((WORD*)s -1) - 1] == L'\0');
#endif
return s;
}
#endif // _WIN32_WCE
inline bool AtlLoadString(UINT uID, BSTR& bstrText)
{
USES_CONVERSION;
ATLASSERT(bstrText == NULL);
LPTSTR lpstrText = NULL;
int nRes = 0;
for(int nLen = 256; ; nLen *= 2)
{
ATLTRY(lpstrText = new TCHAR[nLen]);
if(lpstrText == NULL)
break;
nRes = ::LoadString(ModuleHelper::GetResourceInstance(), uID, lpstrText, nLen);
if(nRes < nLen - 1)
break;
delete [] lpstrText;
lpstrText = NULL;
}
if(lpstrText != NULL)
{
if(nRes != 0)
bstrText = ::SysAllocString(T2OLE(lpstrText));
delete [] lpstrText;
}
return (bstrText != NULL) ? true : false;
}
}; // namespace WTL }; // namespace WTL
#endif // __ATLUSER_H__ #endif // __ATLUSER_H__

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifndef __ATLAPP_H__ #ifndef __ATLAPP_H__
#error atlwince.h requires atlapp.h to be included first #error atlwince.h requires atlapp.h to be included first
#endif #endif
@ -28,7 +24,9 @@
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
#error atlwince.h compiles under Windows CE only #error atlwince.h compiles under Windows CE only
#elif (_WIN32_WCE < 300) #endif
#if (_WIN32_WCE < 300)
#error atlwince.h requires Windows CE 3.0 or higher. #error atlwince.h requires Windows CE 3.0 or higher.
#endif #endif
@ -249,7 +247,8 @@ public:
T* pT = static_cast<T*>(this); T* pT = static_cast<T*>(this);
ATLASSERT(pT->IsWindow()); ATLASSERT(pT->IsWindow());
BOOL bRes = ::GetClientRect(pT->m_hWnd, lpRect); BOOL bRes = ::GetClientRect(pT->m_hWnd, lpRect);
lpRect->top += nTitleHeight; if (nTitleHeight)
lpRect->top += nTitleHeight + 1;
return bRes; return bRes;
} }
@ -546,6 +545,26 @@ public:
typedef CIndirectDialogImpl< T, CMemDlgTemplate, CStdDialogImpl<T, t_shidiFlags, t_bModal> > _baseClass; typedef CIndirectDialogImpl< T, CMemDlgTemplate, CStdDialogImpl<T, t_shidiFlags, t_bModal> > _baseClass;
typedef CStdDialogImpl<T, t_shidiFlags, t_bModal> _baseStd; typedef CStdDialogImpl<T, t_shidiFlags, t_bModal> _baseStd;
void CheckStyle()
{
// Mobile devices don't support DLGTEMPLATEEX
ATLASSERT(!m_Template.IsTemplateEx());
// Standard dialogs need only DS_CENTER
DWORD &dwStyle = m_Template.GetTemplatePtr()->style;
if (dwStyle & DS_CENTER)
if(t_bModal)
{
ATLASSERT((dwStyle & WS_CHILD) != WS_CHILD);
dwStyle |= WS_POPUP;
}
else
{
if((dwStyle & WS_CHILD) != WS_CHILD)
dwStyle |= WS_POPUP;
}
}
INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow(), LPARAM dwInitParam = NULL) INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow(), LPARAM dwInitParam = NULL)
{ {
ATLASSERT(t_bModal); ATLASSERT(t_bModal);
@ -553,22 +572,7 @@ public:
if (!m_Template.IsValid()) if (!m_Template.IsValid())
CreateTemplate(); CreateTemplate();
if (m_Template.IsTemplateEx()) CheckStyle();
{
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); return _baseClass::DoModal(hWndParent, dwInitParam);
} }
@ -580,22 +584,7 @@ public:
if (!m_Template.IsValid()) if (!m_Template.IsValid())
CreateTemplate(); CreateTemplate();
if (m_Template.IsTemplateEx()) CheckStyle();
{
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); return _baseClass::Create(hWndParent, dwInitParam);
} }
@ -905,7 +894,7 @@ public:
class CAppInfoBase class CAppInfoBase
{ {
public: public:
ATL::CRegKey m_Key; CRegKeyEx m_Key;
CAppInfoBase(ATL::_U_STRINGorID sAppKey) CAppInfoBase(ATL::_U_STRINGorID sAppKey)
{ {
@ -916,46 +905,30 @@ public:
template <class V> template <class V>
LONG Save(V& val, ATL::_U_STRINGorID sName) LONG Save(V& val, ATL::_U_STRINGorID sName)
{ {
return ::RegSetValueEx(m_Key, sName.m_lpstr, 0, REG_BINARY, (LPBYTE)&val, sizeof(V)); return m_Key.SetBinaryValue(sName.m_lpstr, &val, sizeof(V));
} }
template <class V> template <class V>
LONG Save(int nb, V& val0, ATL::_U_STRINGorID sName) 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)); return m_Key.SetBinaryValue(sName.m_lpstr, &val0, nb * sizeof(V));
} }
template <class V> template <class V>
LONG Restore(V& val, ATL::_U_STRINGorID sName) LONG Restore(V& val, ATL::_U_STRINGorID sName)
{ {
DWORD valtype; ULONG bufSize = sizeof(V);
DWORD bufSize = sizeof(V); return m_Key.QueryBinaryValue(sName.m_lpstr, &val, &bufSize);
return ::RegQueryValueEx(m_Key, sName.m_lpstr, 0, &valtype, (LPBYTE)&val, &bufSize);
} }
template <class V> template <class V>
LONG Restore(int nb, V& val0, ATL::_U_STRINGorID sName) LONG Restore(int nb, V& val0, ATL::_U_STRINGorID sName)
{ {
DWORD valtype; ULONG bufSize = nb * sizeof(V);
DWORD bufSize = nb * sizeof(V); return m_Key.QueryBinaryValue(sName.m_lpstr, &val0, &bufSize);
return ::RegQueryValueEx(m_Key, sName.m_lpstr, 0, &valtype, (LPBYTE)&val0, &bufSize);
} }
#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) #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) LONG Save(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName)
{ {
return m_Key.SetStringValue(sName.m_lpstr, sval); return m_Key.SetStringValue(sName.m_lpstr, sval);
@ -968,22 +941,10 @@ public:
sval.ReleaseBuffer(); sval.ReleaseBuffer();
return res; return res;
} }
#endif // !(_ATL_VER < 0x0800)
#else #else
#pragma message("Warning: CAppInfoBase compiles without CString support. Do not use CString in Save or Restore.") #pragma message("Warning: CAppInfoBase compiles without CString support. Do not use CString in Save or Restore.")
#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) #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) LONG Save(LPCTSTR sval, ATL::_U_STRINGorID sName)
{ {
return m_Key.SetStringValue(sName.m_lpstr, sval); return m_Key.SetStringValue(sName.m_lpstr, sval);
@ -993,7 +954,6 @@ public:
{ {
return m_Key.QueryStringValue(sName.m_lpstr, sval, plength); return m_Key.QueryStringValue(sName.m_lpstr, sval, plength);
} }
#endif // !(_ATL_VER < 0x0800)
LONG Delete(ATL::_U_STRINGorID sName) LONG Delete(ATL::_U_STRINGorID sName)
{ {
@ -1508,7 +1468,7 @@ public:
#ifndef SETTINGCHANGE_RESET // not defined for PPC 2002 #ifndef SETTINGCHANGE_RESET // not defined for PPC 2002
#define SETTINGCHANGE_RESET SPI_SETWORKAREA #define SETTINGCHANGE_RESET SPI_SETWORKAREA
#endif #endif
if (m_bFullScreen && (wParam & SETTINGCHANGE_RESET)) if (m_bFullScreen && (wParam == SETTINGCHANGE_RESET))
SetFullScreen(m_bFullScreen); SetFullScreen(m_bFullScreen);
return bHandled = FALSE; return bHandled = FALSE;
} }
@ -2223,22 +2183,37 @@ public:
::SendMessage(m_hWnd, EM_UNDOEVENT, 0, 0L); ::SendMessage(m_hWnd, EM_UNDOEVENT, 0, 0L);
} }
void Undo()
{
UndoEvent();
}
// Standard EM_xxx messages // Standard EM_xxx messages
DWORD GetSel() const DWORD GetSel() const
{ {
ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(GetViewStyle() != VT_DRAWINGVIEW);
return (DWORD)::SendMessage(m_hWnd, EM_GETSEL, 0, 0L); return (DWORD)::SendMessage(m_hWnd, EM_GETSEL, 0, 0L);
} }
void GetSel(int& nStartChar, int& nEndChar) const void GetSel(int& nStartChar, int& nEndChar) const
{ {
ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(GetViewStyle() != VT_DRAWINGVIEW);
::SendMessage(m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar); ::SendMessage(m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar);
} }
void SetSel(int nStartChar, int nEndChar)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(GetViewStyle() != VT_DRAWINGVIEW);
::SendMessage(m_hWnd, EM_SETSEL, nStartChar, nEndChar);
}
void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE) void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE)
{ {
ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(GetViewStyle() != VT_DRAWINGVIEW);
::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM)bCanUndo, (LPARAM)lpszNewText); ::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM)bCanUndo, (LPARAM)lpszNewText);
} }
@ -2504,7 +2479,7 @@ public:
::ZeroMemory(&m_dlc, sizeof(DOCLISTCREATE)); ::ZeroMemory(&m_dlc, sizeof(DOCLISTCREATE));
::ZeroMemory(m_szPath, sizeof(m_szPath)); ::ZeroMemory(m_szPath, sizeof(m_szPath));
if(pszFolder != NULL) if(pszFolder != NULL)
::lstrcpyn(m_szPath, pszFolder, MAX_PATH - 1); SecureHelper::strncpy_x(m_szPath, MAX_PATH, pszFolder, MAX_PATH - 1);
m_dlc.dwStructSize = sizeof(DOCLISTCREATE); m_dlc.dwStructSize = sizeof(DOCLISTCREATE);
m_dlc.hwndParent = hWndParent; m_dlc.hwndParent = hWndParent;
m_dlc.pszFolder = m_szPath; m_dlc.pszFolder = m_szPath;
@ -2796,13 +2771,14 @@ public:
{ {
ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(pstrTipText); ATLASSERT(pstrTipText);
ATLASSERT(lstrlen(pstrTipText)<= 253); ATLASSERT(lstrlen(pstrTipText) <= 253);
CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff; CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
LPTSTR pstr = buff.Allocate(lstrlen(pstrTipText) + 3); int cchLen = lstrlen(pstrTipText) + 3;
LPTSTR pstr = buff.Allocate(cchLen);
if(pstr == NULL) if(pstr == NULL)
return FALSE; return FALSE;
::lstrcpy(pstr, _T("~~")); SecureHelper::strcpy_x(pstr, cchLen, _T("~~"));
::lstrcat(pstr, pstrTipText); SecureHelper::strcat_x(pstr, cchLen, pstrTipText);
return SetWindowText(pstr); return SetWindowText(pstr);
} }
}; };
@ -2847,13 +2823,14 @@ public:
{ {
ATLASSERT(::IsWindow(m_hWnd)); ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(pstrTipText); ATLASSERT(pstrTipText);
ATLASSERT(lstrlen(pstrTipText)<= 253); ATLASSERT(lstrlen(pstrTipText) <= 253);
CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff; CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
LPTSTR pstr = buff.Allocate(lstrlen(pstrTipText) + 3); int cchLen = lstrlen(pstrTipText) + 3;
LPTSTR pstr = buff.Allocate(cchLen);
if(pstr == NULL) if(pstr == NULL)
return FALSE; return FALSE;
::lstrcpy(pstr, _T("~~")); SecureHelper::strcpy_x(pstr, cchLen, _T("~~"));
::lstrcat(pstr, pstrTipText); SecureHelper::strcat_x(pstr, cchLen, pstrTipText);
return SetWindowText(pstr); return SetWindowText(pstr);
} }
}; };

View File

@ -1,9 +1,9 @@
// Windows Template Library - WTL version 8.0 // Windows Template Library - WTL version 8.1
// Copyright (C) Microsoft Corporation. All rights reserved. // Copyright (C) Microsoft Corporation. All rights reserved.
// //
// This file is a part of the Windows Template Library. // This file is a part of the Windows Template Library.
// The use and distribution terms for this software are covered by the // The use and distribution terms for this software are covered by the
// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) // Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
// which can be found in the file CPL.TXT at the root of this distribution. // which can be found in the file CPL.TXT at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by // By using this software in any fashion, you are agreeing to be bound by
// the terms of this license. You must not remove this notice, or // the terms of this license. You must not remove this notice, or
@ -14,10 +14,6 @@
#pragma once #pragma once
#ifndef __cplusplus
#error ATL requires C++ compilation (use a .cpp suffix)
#endif
#ifndef __ATLAPP_H__ #ifndef __ATLAPP_H__
#error atlwinx.h requires atlapp.h to be included first #error atlwinx.h requires atlapp.h to be included first
#endif #endif

View File

@ -1,44 +0,0 @@
#ifndef _WX_RCDEFS_H
#define _WX_RCDEFS_H
#define WX_MSC_FULL_VER 160040219
#define WX_CPU_X86
#endif

View File

@ -15,6 +15,7 @@
#include <common/MemTest.h> #include <common/MemTest.h>
#include <common/CriticalSection.h> #include <common/CriticalSection.h>
#include <shellapi.h>
#include "Multilanguage.h" #include "Multilanguage.h"
#include "User Interface.h" #include "User Interface.h"
#include "N64 System.h" #include "N64 System.h"