activegs-ios/Common.win32/vs10fix/afxglobals.cpp

1409 lines
34 KiB
C++

// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "..\stdafx.h"
#include "afxpriv.h"
#include "afxole.h"
#include "..\src\mfc\oleimpl2.h"
#include "..\src\mfc\afximpl.h"
#include "comdef.h"
//#include "afxcontrolbarutil.h"
#include "afxglobals.h"
/*
#include "afxvisualmanager.h"
#include "afxkeyboardmanager.h"
#include "afxmenuhash.h"
#include "afxtoolbar.h"
#include "afxmenuimages.h"
#include "afxpaneframewnd.h"
#include "afxdockingmanager.h"
#include "afxvisualmanageroffice2007.h"
#include "afxribbonres.h"
#include "afxframewndex.h"
#include "afxmdiframewndex.h"
#include "afxoleipframewndex.h"
#include "afxoledocipframewndex.h"
#include "afxmdichildwndex.h"
*/
extern CObList afxAllToolBars;
BOOL CMemDC::m_bUseMemoryDC = TRUE;
static const CString strOfficeFontName = _T("Tahoma");
static const CString strOffice2007FontName = _T("Segoe UI");
static const CString strDefaultFontName = _T("MS Sans Serif");
static const CString strVertFontName = _T("Arial");
static const CString strMarlettFontName = _T("Marlett");
CMemDC::CMemDC(CDC& dc, CWnd* pWnd) :
m_dc(dc), m_bMemDC(FALSE), m_hBufferedPaint(NULL), m_pOldBmp(NULL)
{
ASSERT_VALID(pWnd);
pWnd->GetClientRect(m_rect);
m_rect.right += pWnd->GetScrollPos(SB_HORZ);
m_rect.bottom += pWnd->GetScrollPos(SB_VERT);
if (afxGlobalData.m_pfBeginBufferedPaint != NULL && afxGlobalData.m_pfEndBufferedPaint != NULL)
{
HDC hdcPaint = NULL;
if (!afxGlobalData.m_bBufferedPaintInited && afxGlobalData.m_pfBufferedPaintInit != NULL && afxGlobalData.m_pfBufferedPaintUnInit != NULL)
{
afxGlobalData.m_pfBufferedPaintInit();
afxGlobalData.m_bBufferedPaintInited = TRUE;
}
m_hBufferedPaint = (*afxGlobalData.m_pfBeginBufferedPaint)(dc.GetSafeHdc(), m_rect, AFX_BPBF_TOPDOWNDIB, NULL, &hdcPaint);
if (m_hBufferedPaint != NULL && hdcPaint != NULL)
{
m_bMemDC = TRUE;
m_dcMem.Attach(hdcPaint);
}
}
else
{
if (m_bUseMemoryDC && m_dcMem.CreateCompatibleDC(&m_dc) && m_bmp.CreateCompatibleBitmap(&m_dc, m_rect.Width(), m_rect.Height()))
{
//-------------------------------------------------------------
// Off-screen DC successfully created. Better paint to it then!
//-------------------------------------------------------------
m_bMemDC = TRUE;
m_pOldBmp = m_dcMem.SelectObject(&m_bmp);
}
}
}
CMemDC::CMemDC(CDC& dc, const CRect& rect) :
m_dc(dc), m_bMemDC(FALSE), m_hBufferedPaint(NULL), m_pOldBmp(NULL), m_rect(rect)
{
ASSERT(!m_rect.IsRectEmpty());
if (afxGlobalData.m_pfBeginBufferedPaint != NULL && afxGlobalData.m_pfEndBufferedPaint != NULL)
{
HDC hdcPaint = NULL;
if (!afxGlobalData.m_bBufferedPaintInited && afxGlobalData.m_pfBufferedPaintInit != NULL && afxGlobalData.m_pfBufferedPaintUnInit != NULL)
{
afxGlobalData.m_pfBufferedPaintInit();
afxGlobalData.m_bBufferedPaintInited = TRUE;
}
m_hBufferedPaint = (*afxGlobalData.m_pfBeginBufferedPaint)(dc.GetSafeHdc(), m_rect, AFX_BPBF_TOPDOWNDIB, NULL, &hdcPaint);
if (m_hBufferedPaint != NULL && hdcPaint != NULL)
{
m_bMemDC = TRUE;
m_dcMem.Attach(hdcPaint);
}
}
else
{
if (m_bUseMemoryDC && m_dcMem.CreateCompatibleDC(&m_dc) && m_bmp.CreateCompatibleBitmap(&m_dc, m_rect.Width(), m_rect.Height()))
{
//-------------------------------------------------------------
// Off-screen DC successfully created. Better paint to it then!
//-------------------------------------------------------------
m_bMemDC = TRUE;
m_pOldBmp = m_dcMem.SelectObject(&m_bmp);
}
}
}
CMemDC::~CMemDC()
{
if (m_hBufferedPaint != NULL)
{
m_dcMem.Detach();
(*afxGlobalData.m_pfEndBufferedPaint)(m_hBufferedPaint, TRUE);
}
else if (m_bMemDC)
{
//--------------------------------------
// Copy the results to the on-screen DC:
//--------------------------------------
CRect rectClip;
int nClipType = m_dc.GetClipBox(rectClip);
if (nClipType != NULLREGION)
{
if (nClipType != SIMPLEREGION)
{
rectClip = m_rect;
}
m_dc.BitBlt(rectClip.left, rectClip.top, rectClip.Width(), rectClip.Height(), &m_dcMem, rectClip.left, rectClip.top, SRCCOPY);
}
m_dcMem.SelectObject(m_pOldBmp);
}
}
static int CALLBACK FontFamalyProcFonts(const LOGFONT FAR* lplf, const TEXTMETRIC FAR* /*lptm*/, ULONG /*ulFontType*/, LPARAM lParam)
{
ENSURE(lplf != NULL);
ENSURE(lParam != NULL);
CString strFont = lplf->lfFaceName;
return strFont.CollateNoCase((LPCTSTR) lParam) == 0 ? 0 : 1;
}
/////////////////////////////////////////////////////////////////////////////
// Cached system metrics, etc
AFX_GLOBAL_DATA afxGlobalData;
// Initialization code
AFX_GLOBAL_DATA::AFX_GLOBAL_DATA()
{
// Detect the kind of OS:
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
::GetVersionEx(&osvi);
bIsRemoteSession = GetSystemMetrics(SM_REMOTESESSION);
bIsWindowsVista = (osvi.dwMajorVersion >= 6);
bIsWindows7 = (osvi.dwMajorVersion == 6) && (osvi.dwMinorVersion >= 1) || (osvi.dwMajorVersion > 6) ;
bDisableAero = FALSE;
m_bIsRibbonImageScale = TRUE;
// Cached system values(updated in CWnd::OnSysColorChange)
hbrBtnShadow = NULL;
hbrBtnHilite = NULL;
hbrWindow = NULL;
UpdateSysColors();
m_hinstUXThemeDLL = ::AfxCtxLoadLibraryW(L"UxTheme.dll");
if (m_hinstUXThemeDLL != NULL)
{
m_pfDrawThemeBackground = (DRAWTHEMEPARENTBACKGROUND)::GetProcAddress(m_hinstUXThemeDLL, "DrawThemeParentBackground");
m_pfDrawThemeTextEx = (DRAWTHEMETEXTEX)::GetProcAddress(m_hinstUXThemeDLL, "DrawThemeTextEx");
m_pfBufferedPaintInit = (BUFFEREDPAINTINIT)::GetProcAddress(m_hinstUXThemeDLL, "BufferedPaintInit");
m_pfBufferedPaintUnInit = (BUFFEREDPAINTUNINIT)::GetProcAddress(m_hinstUXThemeDLL, "BufferedPaintUnInit");
m_pfBeginBufferedPaint = (BEGINBUFFEREDPAINT)::GetProcAddress(m_hinstUXThemeDLL, "BeginBufferedPaint");
m_pfEndBufferedPaint = (ENDBUFFEREDPAINT)::GetProcAddress(m_hinstUXThemeDLL, "EndBufferedPaint");
}
else
{
m_pfDrawThemeBackground = NULL;
m_pfDrawThemeTextEx = NULL;
m_pfBufferedPaintInit = NULL;
m_pfBufferedPaintUnInit = NULL;
m_pfBeginBufferedPaint = NULL;
m_pfEndBufferedPaint = NULL;
}
m_hinstDwmapiDLL = ::AfxCtxLoadLibraryW(L"dwmapi.dll");
if (m_hinstDwmapiDLL != NULL)
{
m_pfDwmExtendFrameIntoClientArea = (DWMEXTENDFRAMEINTOCLIENTAREA)::GetProcAddress(m_hinstDwmapiDLL, "DwmExtendFrameIntoClientArea");
m_pfDwmDefWindowProc = (DWMDEFWINDOWPROC) ::GetProcAddress(m_hinstDwmapiDLL, "DwmDefWindowProc");
m_pfDwmIsCompositionEnabled = (DWMISCOMPOSITIONENABLED)::GetProcAddress(m_hinstDwmapiDLL, "DwmIsCompositionEnabled");
}
else
{
m_pfDwmExtendFrameIntoClientArea = NULL;
m_pfDwmDefWindowProc = NULL;
m_pfDwmIsCompositionEnabled = NULL;
}
m_hcurStretch = NULL;
m_hcurStretchVert = NULL;
m_hcurHand = NULL;
m_hcurSizeAll = NULL;
m_hiconTool = NULL;
m_hiconLink = NULL;
m_hiconColors = NULL;
m_hcurMoveTab = NULL;
m_hcurNoMoveTab = NULL;
m_bUseSystemFont = FALSE;
m_bInSettingChange = FALSE;
UpdateFonts();
OnSettingChange();
m_bIsRTL = FALSE;
m_bBufferedPaintInited = FALSE;
m_nDragFrameThicknessFloat = 4; // pixels
m_nDragFrameThicknessDock = 3; // pixels
m_nAutoHideToolBarSpacing = 14; // pixels
m_nAutoHideToolBarMargin = 4; // pixels
m_nCoveredMainWndClientAreaPercent = 50; // percents
m_nMaxToolTipWidth = -1;
m_bIsBlackHighContrast = FALSE;
m_bIsWhiteHighContrast = FALSE;
m_bUseBuiltIn32BitIcons = TRUE;
/*
m_bComInitialized = FALSE;
m_pTaskbarList = NULL;
m_pTaskbarList3 = NULL;
m_bTaskBarInterfacesAvailable = TRUE;
*/
EnableAccessibilitySupport();
}
AFX_GLOBAL_DATA::~AFX_GLOBAL_DATA()
{
CleanUp();
}
void AFX_GLOBAL_DATA::UpdateFonts()
{
CWindowDC dc(NULL);
m_dblRibbonImageScale = dc.GetDeviceCaps(LOGPIXELSX) / 96.0f;
if (m_dblRibbonImageScale > 1. && m_dblRibbonImageScale < 1.1)
{
m_dblRibbonImageScale = 1.;
}
if (fontRegular.GetSafeHandle() != NULL)
{
::DeleteObject(fontRegular.Detach());
}
if (fontTooltip.GetSafeHandle() != NULL)
{
::DeleteObject(fontTooltip.Detach());
}
if (fontBold.GetSafeHandle() != NULL)
{
::DeleteObject(fontBold.Detach());
}
if (fontDefaultGUIBold.GetSafeHandle() != NULL)
{
::DeleteObject(fontDefaultGUIBold.Detach());
}
if (fontUnderline.GetSafeHandle() != NULL)
{
::DeleteObject(fontUnderline.Detach());
}
if (fontDefaultGUIUnderline.GetSafeHandle() != NULL)
{
::DeleteObject(fontDefaultGUIUnderline.Detach());
}
if (fontVert.GetSafeHandle() != NULL)
{
::DeleteObject(fontVert.Detach());
}
if (fontVertCaption.GetSafeHandle() != NULL)
{
::DeleteObject(fontVertCaption.Detach());
}
if (fontMarlett.GetSafeHandle() != NULL)
{
::DeleteObject(fontMarlett.Detach());
}
if (fontSmall.GetSafeHandle() != NULL)
{
::DeleteObject(fontSmall.Detach());
}
// Initialize fonts:
NONCLIENTMETRICS info;
GetNonClientMetrics (info);
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
lf.lfCharSet = (BYTE) GetTextCharsetInfo(dc.GetSafeHdc(), NULL, 0);
lf.lfHeight = info.lfMenuFont.lfHeight;
lf.lfWeight = info.lfMenuFont.lfWeight;
lf.lfItalic = info.lfMenuFont.lfItalic;
//------------------
// Adjust font size:
//------------------
int nFontHeight = lf.lfHeight < 0 ? -lf.lfHeight : lf.lfHeight;
if (nFontHeight <= 12)
{
nFontHeight = 11;
}
else
{
nFontHeight--;
}
lf.lfHeight = (lf.lfHeight < 0) ? -nFontHeight : nFontHeight;
// Check if we should use system font
lstrcpy(lf.lfFaceName, info.lfMenuFont.lfFaceName);
BOOL fUseSystemFont = m_bUseSystemFont || (info.lfMenuFont.lfCharSet > SYMBOL_CHARSET);
if (!fUseSystemFont)
{
// Check for "Segoe UI" or "Tahoma" font existance:
if (::EnumFontFamilies(dc.GetSafeHdc(), NULL, FontFamalyProcFonts, (LPARAM)(LPCTSTR) strOffice2007FontName) == 0)
{
// Found! Use MS Office 2007 font!
lstrcpy(lf.lfFaceName, strOffice2007FontName);
lf.lfQuality = 5 /*CLEARTYPE_QUALITY*/;
}
else if (::EnumFontFamilies(dc.GetSafeHdc(), NULL, FontFamalyProcFonts, (LPARAM)(LPCTSTR) strOfficeFontName) == 0)
{
// Found! Use MS Office font!
lstrcpy(lf.lfFaceName, strOfficeFontName);
}
else
{
// Not found. Use default font:
lstrcpy(lf.lfFaceName, strDefaultFontName);
}
}
fontRegular.CreateFontIndirect(&lf);
// Create small font:
LONG lfHeightSaved = lf.lfHeight;
lf.lfHeight = (long)((1. + abs(lf.lfHeight)) * 2 / 3);
if (lfHeightSaved < 0)
{
lf.lfHeight = -lf.lfHeight;
}
fontSmall.CreateFontIndirect(&lf);
lf.lfHeight = lfHeightSaved;
// Create tooltip font:
NONCLIENTMETRICS ncm;
GetNonClientMetrics (ncm);
lf.lfItalic = ncm.lfStatusFont.lfItalic;
lf.lfWeight = ncm.lfStatusFont.lfWeight;
fontTooltip.CreateFontIndirect(&lf);
lf.lfItalic = info.lfMenuFont.lfItalic;
lf.lfWeight = info.lfMenuFont.lfWeight;
// Create "underline" font:
lf.lfUnderline = TRUE;
fontUnderline.CreateFontIndirect(&lf);
lf.lfUnderline = FALSE;
// Create bold font:
lf.lfWeight = FW_BOLD;
fontBold.CreateFontIndirect(&lf);
// Create Marlett font:
BYTE bCharSet = lf.lfCharSet;
lf.lfWeight = info.lfMenuFont.lfWeight;
lf.lfCharSet = SYMBOL_CHARSET;
lf.lfWeight = 0;
lf.lfHeight = ::GetSystemMetrics(SM_CYMENUCHECK) - 1;
lstrcpy(lf.lfFaceName, strMarlettFontName);
fontMarlett.CreateFontIndirect(&lf);
lf.lfCharSet = bCharSet; // Restore charset
// Create vertical font:
CFont font;
if (font.CreateStockObject(DEFAULT_GUI_FONT))
{
if (font.GetLogFont(&lf) != 0)
{
lf.lfOrientation = 900;
lf.lfEscapement = 2700;
lf.lfHeight = info.lfMenuFont.lfHeight;
lf.lfWeight = info.lfMenuFont.lfWeight;
lf.lfItalic = info.lfMenuFont.lfItalic;
{
lstrcpy(lf.lfFaceName, strVertFontName);
}
fontVert.CreateFontIndirect(&lf);
lf.lfEscapement = 900;
fontVertCaption.CreateFontIndirect(&lf);
}
}
// Create dialog underline and bold fonts:
CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));
ASSERT_VALID(pDefaultGUIFont);
pDefaultGUIFont->GetLogFont(&lf);
lf.lfUnderline = TRUE;
fontDefaultGUIUnderline.CreateFontIndirect(&lf);
lf.lfUnderline = FALSE;
lf.lfWeight = FW_BOLD;
fontDefaultGUIBold.CreateFontIndirect(&lf);
UpdateTextMetrics();
/*
// Notify toolbars about font changing:
for (POSITION posTlb = afxAllToolBars.GetHeadPosition(); posTlb != NULL;)
{
CMFCToolBar* pToolBar = (CMFCToolBar*) afxAllToolBars.GetNext(posTlb);
ENSURE(pToolBar != NULL);
if (CWnd::FromHandlePermanent(pToolBar->m_hWnd) != NULL)
{
ASSERT_VALID(pToolBar);
pToolBar->OnGlobalFontsChanged();
}
}
*/
}
static BOOL CALLBACK InfoEnumProc( HMONITOR hMonitor, HDC /*hdcMonitor*/, LPRECT /*lprcMonitor*/, LPARAM dwData)
{
CRect* pRect = (CRect*) dwData;
MONITORINFO mi;
mi.cbSize = sizeof(MONITORINFO);
if (GetMonitorInfo(hMonitor, &mi))
{
CRect rectMon = mi.rcWork;
pRect->left = min(pRect->left, rectMon.left);
pRect->right = max(pRect->right, rectMon.right);
pRect->top = min(pRect->top, rectMon.top);
pRect->bottom = max(pRect->bottom, rectMon.bottom);
}
return TRUE;
}
void AFX_GLOBAL_DATA::OnSettingChange()
{
m_bInSettingChange = TRUE;
m_sizeSmallIcon.cx = ::GetSystemMetrics(SM_CXSMICON);
m_sizeSmallIcon.cy = ::GetSystemMetrics(SM_CYSMICON);
m_rectVirtual.SetRectEmpty();
if (!EnumDisplayMonitors(NULL, NULL, InfoEnumProc, (LPARAM) &m_rectVirtual))
{
::SystemParametersInfo(SPI_GETWORKAREA, 0, &m_rectVirtual, 0);
}
// Get system menu animation type:
m_bMenuAnimation = FALSE;
m_bMenuFadeEffect = FALSE;
if (!bIsRemoteSession)
{
::SystemParametersInfo(SPI_GETMENUANIMATION, 0, &m_bMenuAnimation, 0);
if (m_bMenuAnimation)
{
::SystemParametersInfo(SPI_GETMENUFADE, 0, &m_bMenuFadeEffect, 0);
}
}
m_nShellAutohideBars = 0;
m_bRefreshAutohideBars = TRUE;
::SystemParametersInfo(SPI_GETMENUUNDERLINES, 0, &m_bSysUnderlineKeyboardShortcuts, 0);
m_bUnderlineKeyboardShortcuts = m_bSysUnderlineKeyboardShortcuts;
m_bInSettingChange = FALSE;
}
void AFX_GLOBAL_DATA::UpdateSysColors()
{
m_bIsBlackHighContrast = ::GetSysColor(COLOR_3DLIGHT) == RGB(255, 255, 255) && ::GetSysColor(COLOR_3DFACE) == RGB(0, 0, 0);
m_bIsWhiteHighContrast = ::GetSysColor(COLOR_3DDKSHADOW) == RGB(0, 0, 0) && ::GetSysColor(COLOR_3DFACE) == RGB(255, 255, 255);
CWindowDC dc(NULL);
m_nBitsPerPixel = dc.GetDeviceCaps(BITSPIXEL);
clrBarFace = clrBtnFace = ::GetSysColor(COLOR_BTNFACE);
clrBarShadow = clrBtnShadow = ::GetSysColor(COLOR_BTNSHADOW);
clrBarDkShadow = clrBtnDkShadow = ::GetSysColor(COLOR_3DDKSHADOW);
clrBarLight = clrBtnLight = ::GetSysColor(COLOR_3DLIGHT);
clrBarHilite = clrBtnHilite = ::GetSysColor(COLOR_BTNHIGHLIGHT);
clrBarText = clrBtnText = ::GetSysColor(COLOR_BTNTEXT);
clrGrayedText = ::GetSysColor(COLOR_GRAYTEXT);
clrWindowFrame = ::GetSysColor(COLOR_WINDOWFRAME);
clrHilite = ::GetSysColor(COLOR_HIGHLIGHT);
clrTextHilite = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
clrBarWindow = clrWindow = ::GetSysColor(COLOR_WINDOW);
clrWindowText = ::GetSysColor(COLOR_WINDOWTEXT);
clrCaptionText = ::GetSysColor(COLOR_CAPTIONTEXT);
clrMenuText = ::GetSysColor(COLOR_MENUTEXT);
clrActiveCaption = ::GetSysColor(COLOR_ACTIVECAPTION);
clrInactiveCaption = ::GetSysColor(COLOR_INACTIVECAPTION);
clrActiveCaptionGradient = ::GetSysColor(COLOR_GRADIENTACTIVECAPTION);
clrInactiveCaptionGradient = ::GetSysColor(COLOR_GRADIENTINACTIVECAPTION);
clrActiveBorder = ::GetSysColor(COLOR_ACTIVEBORDER);
clrInactiveBorder = ::GetSysColor(COLOR_INACTIVEBORDER);
clrInactiveCaptionText = ::GetSysColor(COLOR_INACTIVECAPTIONTEXT);
if (m_bIsBlackHighContrast)
{
clrHotLinkNormalText = clrWindowText;
clrHotLinkHoveredText = clrWindowText;
clrHotLinkVisitedText = clrWindowText;
}
else
{
clrHotLinkNormalText = ::GetSysColor(COLOR_HOTLIGHT);
clrHotLinkHoveredText = RGB(0, 0, 255); // Bright blue
clrHotLinkVisitedText = RGB(128, 0, 128); // Violet
}
hbrBtnShadow = ::GetSysColorBrush(COLOR_BTNSHADOW);
ENSURE(hbrBtnShadow != NULL);
hbrBtnHilite = ::GetSysColorBrush(COLOR_BTNHIGHLIGHT);
ENSURE(hbrBtnHilite != NULL);
hbrWindow = ::GetSysColorBrush(COLOR_WINDOW);
ENSURE(hbrWindow != NULL);
brBtnFace.DeleteObject();
brBtnFace.CreateSolidBrush(clrBtnFace);
brBarFace.DeleteObject();
brBarFace.CreateSolidBrush(clrBarFace);
brActiveCaption.DeleteObject();
brActiveCaption.CreateSolidBrush(clrActiveCaption);
brInactiveCaption.DeleteObject();
brInactiveCaption.CreateSolidBrush(clrInactiveCaption);
brHilite.DeleteObject();
brHilite.CreateSolidBrush(clrHilite);
brBlack.DeleteObject();
brBlack.CreateSolidBrush(clrBtnDkShadow);
brWindow.DeleteObject();
brWindow.CreateSolidBrush(clrWindow);
penHilite.DeleteObject();
penHilite.CreatePen(PS_SOLID, 1, afxGlobalData.clrHilite);
penBarFace.DeleteObject();
penBarFace.CreatePen(PS_SOLID, 1, afxGlobalData.clrBarFace);
penBarShadow.DeleteObject();
penBarShadow.CreatePen(PS_SOLID, 1, afxGlobalData.clrBarShadow);
if (brLight.GetSafeHandle())
{
brLight.DeleteObject();
}
if (m_nBitsPerPixel > 8)
{
COLORREF clrLight = RGB(GetRValue(clrBtnFace) +((GetRValue(clrBtnHilite) - GetRValue(clrBtnFace)) / 2 ),
GetGValue(clrBtnFace) +((GetGValue(clrBtnHilite) - GetGValue(clrBtnFace)) / 2),
GetBValue(clrBtnFace) +((GetBValue(clrBtnHilite) - GetBValue(clrBtnFace)) / 2));
brLight.CreateSolidBrush(clrLight);
}
else
{
HBITMAP hbmGray = CreateDitherBitmap(dc.GetSafeHdc());
ENSURE(hbmGray != NULL);
CBitmap bmp;
bmp.Attach(hbmGray);
brLight.CreatePatternBrush(&bmp);
}
// CMenuImages::CleanUp();
// CDockingManager::m_bSDParamsModified = TRUE;
}
BOOL AFX_GLOBAL_DATA::SetMenuFont(LPLOGFONT lpLogFont, BOOL bHorz)
{
ENSURE(lpLogFont != NULL);
if (bHorz)
{
// Create regular font:
fontRegular.DeleteObject();
if (!fontRegular.CreateFontIndirect(lpLogFont))
{
ASSERT(FALSE);
return FALSE;
}
// Create underline font:
lpLogFont->lfUnderline = TRUE;
fontUnderline.DeleteObject();
fontUnderline.CreateFontIndirect(lpLogFont);
lpLogFont->lfUnderline = FALSE;
// Create bold font(used in the default menu items):
long lSavedWeight = lpLogFont->lfWeight;
lpLogFont->lfWeight = 700;
fontBold.DeleteObject();
BOOL bResult = fontBold.CreateFontIndirect(lpLogFont);
lpLogFont->lfWeight = lSavedWeight; // Restore weight
if (!bResult)
{
ASSERT(FALSE);
return FALSE;
}
}
else // Vertical font
{
fontVert.DeleteObject();
if (!fontVert.CreateFontIndirect(lpLogFont))
{
ASSERT(FALSE);
return FALSE;
}
}
UpdateTextMetrics();
return TRUE;
}
void AFX_GLOBAL_DATA::UpdateTextMetrics()
{
CWindowDC dc(NULL);
CFont* pOldFont = dc.SelectObject(&fontRegular);
ENSURE(pOldFont != NULL);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
int nExtra = tm.tmHeight < 15 ? 2 : 5;
m_nTextHeightHorz = tm.tmHeight + nExtra;
m_nTextWidthHorz = tm.tmMaxCharWidth + nExtra;
dc.SelectObject(&fontVert);
dc.GetTextMetrics(&tm);
nExtra = tm.tmHeight < 15 ? 2 : 5;
m_nTextHeightVert = tm.tmHeight + nExtra;
m_nTextWidthVert = tm.tmMaxCharWidth + nExtra;
dc.SelectObject(pOldFont);
}
HBITMAP AFX_GLOBAL_DATA::CreateDitherBitmap(HDC hDC)
{
struct // BITMAPINFO with 16 colors
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[16];
}
bmi;
memset(&bmi, 0, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = 8;
bmi.bmiHeader.biHeight = 8;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 1;
bmi.bmiHeader.biCompression = BI_RGB;
COLORREF clr = afxGlobalData.clrBtnFace;
bmi.bmiColors[0].rgbBlue = GetBValue(clr);
bmi.bmiColors[0].rgbGreen = GetGValue(clr);
bmi.bmiColors[0].rgbRed = GetRValue(clr);
clr = ::GetSysColor(COLOR_BTNHIGHLIGHT);
bmi.bmiColors[1].rgbBlue = GetBValue(clr);
bmi.bmiColors[1].rgbGreen = GetGValue(clr);
bmi.bmiColors[1].rgbRed = GetRValue(clr);
// initialize the brushes
long patGray[8];
for (int i = 0; i < 8; i++)
patGray[i] = (i & 1) ? 0xAAAA5555L : 0x5555AAAAL;
HBITMAP hbm = CreateDIBitmap(hDC, &bmi.bmiHeader, CBM_INIT, (LPBYTE)patGray, (LPBITMAPINFO)&bmi, DIB_RGB_COLORS);
return hbm;
}
#if (WINVER >= 0x0601)
ITaskbarList* AFX_GLOBAL_DATA::GetITaskbarList()
{
HRESULT hr = S_OK;
if (!bIsWindows7 || !m_bTaskBarInterfacesAvailable)
{
return NULL;
}
if (m_pTaskbarList != NULL)
{
return m_pTaskbarList;
}
if (!m_bComInitialized)
{
hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
m_bComInitialized = TRUE;
}
}
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_pTaskbarList));
}
ASSERT(SUCCEEDED(hr));
return m_pTaskbarList;
}
ITaskbarList3* AFX_GLOBAL_DATA::GetITaskbarList3()
{
HRESULT hr = S_OK;
if (!bIsWindows7 || !m_bTaskBarInterfacesAvailable)
{
return NULL;
}
if (m_pTaskbarList3 != NULL)
{
return m_pTaskbarList3;
}
if (!m_bComInitialized)
{
hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
m_bComInitialized = TRUE;
}
}
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_pTaskbarList3));
}
ASSERT(SUCCEEDED(hr));
return m_pTaskbarList3;
}
void AFX_GLOBAL_DATA::ReleaseTaskBarRefs()
{
m_bTaskBarInterfacesAvailable = FALSE;
if (m_pTaskbarList != NULL)
{
RELEASE(m_pTaskbarList);
m_pTaskbarList = NULL;
}
if (m_pTaskbarList3 != NULL)
{
RELEASE(m_pTaskbarList3);
m_pTaskbarList3 = NULL;
}
if (m_bComInitialized)
{
CoUninitialize();
m_bComInitialized = FALSE;
}
}
#endif
void AFX_GLOBAL_DATA::CleanUp()
{
if (brLight.GetSafeHandle())
{
brLight.DeleteObject();
}
// cleanup fonts:
fontRegular.DeleteObject();
fontBold.DeleteObject();
fontUnderline.DeleteObject();
fontVert.DeleteObject();
fontVertCaption.DeleteObject();
fontTooltip.DeleteObject();
// ReleaseTaskBarRefs();
if (m_bBufferedPaintInited && m_pfBufferedPaintUnInit != NULL)
{
m_pfBufferedPaintUnInit();
m_bBufferedPaintInited = FALSE;
}
if (m_hinstUXThemeDLL != NULL)
{
::FreeLibrary(m_hinstUXThemeDLL);
m_hinstUXThemeDLL = NULL;
}
if (m_hinstDwmapiDLL != NULL)
{
::FreeLibrary(m_hinstDwmapiDLL);
m_hinstDwmapiDLL = NULL;
}
m_bEnableAccessibility = FALSE;
}
void ControlBarCleanUp()
{
afxGlobalData.CleanUp();
/*
afxMenuHash.CleanUp();
CMFCToolBar::CleanUpImages();
CMenuImages::CleanUp();
if (GetCmdMgr() != NULL)
{
GetCmdMgr()->CleanUp();
}
CKeyboardManager::CleanUp();
// Destroy visualization manager:
CMFCVisualManager::DestroyInstance(TRUE ); // bAutoDestroyOnly
CMFCVisualManagerOffice2007::CleanStyle();
*/
}
BOOL AFX_GLOBAL_DATA::DrawParentBackground(CWnd* pWnd, CDC* pDC, LPRECT rectClip)
{
ASSERT_VALID(pDC);
ASSERT_VALID(pWnd);
BOOL bRes = FALSE;
CRgn rgn;
if (rectClip != NULL)
{
rgn.CreateRectRgnIndirect(rectClip);
pDC->SelectClipRgn(&rgn);
}
CWnd* pParent = pWnd->GetParent();
ASSERT_VALID(pParent);
// In Windows XP, we need to call DrawThemeParentBackground function to implement
// transparent controls
if (m_pfDrawThemeBackground != NULL)
{
bRes = (*m_pfDrawThemeBackground)(pWnd->GetSafeHwnd(), pDC->GetSafeHdc(), rectClip) == S_OK;
}
if (!bRes)
{
CPoint pt(0, 0);
pWnd->MapWindowPoints(pParent, &pt, 1);
pt = pDC->OffsetWindowOrg(pt.x, pt.y);
bRes = (BOOL) pParent->SendMessage(WM_ERASEBKGND, (WPARAM)pDC->m_hDC);
pDC->SetWindowOrg(pt.x, pt.y);
}
pDC->SelectClipRgn(NULL);
return bRes;
}
CFrameWnd* AFXGetParentFrame(const CWnd* pWnd)
{
if (pWnd->GetSafeHwnd() == NULL)
{
return NULL;
}
ASSERT_VALID(pWnd);
const CWnd* pParentWnd = pWnd;
while (pParentWnd != NULL)
{
/*
if (pParentWnd->IsKindOf(RUNTIME_CLASS(CPaneFrameWnd)))
{
CPaneFrameWnd* pMiniFrame = DYNAMIC_DOWNCAST(CPaneFrameWnd, pParentWnd);
pParentWnd = pMiniFrame->GetParent();
}
else
*/
{
pParentWnd = pParentWnd->GetParent();
}
if (pParentWnd == NULL)
{
return NULL;
}
if (pParentWnd->IsFrameWnd())
{
return(CFrameWnd*)pParentWnd;
}
}
return NULL;
}
COLORREF AFX_GLOBAL_DATA::GetColor(int nColor)
{
switch(nColor)
{
case COLOR_BTNFACE: return clrBtnFace;
case COLOR_BTNSHADOW: return clrBtnShadow;
case COLOR_3DDKSHADOW: return clrBtnDkShadow;
case COLOR_3DLIGHT: return clrBtnLight;
case COLOR_BTNHIGHLIGHT: return clrBtnHilite;
case COLOR_BTNTEXT: return clrBtnText;
case COLOR_GRAYTEXT: return clrGrayedText;
case COLOR_WINDOWFRAME: return clrWindowFrame;
case COLOR_HIGHLIGHT: return clrHilite;
case COLOR_HIGHLIGHTTEXT: return clrTextHilite;
case COLOR_WINDOW: return clrWindow;
case COLOR_WINDOWTEXT: return clrWindowText;
case COLOR_CAPTIONTEXT: return clrCaptionText;
case COLOR_MENUTEXT: return clrMenuText;
case COLOR_ACTIVECAPTION: return clrActiveCaption;
case COLOR_INACTIVECAPTION: return clrInactiveCaption;
case COLOR_ACTIVEBORDER: return clrActiveBorder;
case COLOR_INACTIVEBORDER: return clrInactiveBorder;
case COLOR_INACTIVECAPTIONTEXT: return clrInactiveCaptionText;
}
return ::GetSysColor(nColor);
}
BOOL AFX_GLOBAL_DATA::SetLayeredAttrib(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags)
{
return(::SetLayeredWindowAttributes(hwnd, crKey, bAlpha, dwFlags));
}
void AFX_GLOBAL_DATA::EnableAccessibilitySupport(BOOL bEnable/* = TRUE*/)
{
m_bEnableAccessibility = bEnable;
}
CString AFX_GLOBAL_DATA::RegisterWindowClass(LPCTSTR lpszClassNamePrefix)
{
ENSURE(lpszClassNamePrefix != NULL);
// Register a new window class:
HINSTANCE hInst = AfxGetInstanceHandle();
UINT uiClassStyle = CS_DBLCLKS;
HCURSOR hCursor = ::LoadCursor(NULL, IDC_ARROW);
HBRUSH hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
CString strClassName;
strClassName.Format(_T("%s:%x:%x:%x:%x"), lpszClassNamePrefix, (UINT_PTR)hInst, uiClassStyle, (UINT_PTR)hCursor, (UINT_PTR)hbrBackground);
// See if the class already exists:
WNDCLASS wndcls;
if (::GetClassInfo(hInst, strClassName, &wndcls))
{
// Already registered, assert everything is good:
ASSERT(wndcls.style == uiClassStyle);
}
else
{
// Otherwise we need to register a new class:
wndcls.style = uiClassStyle;
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
wndcls.hInstance = hInst;
wndcls.hIcon = NULL;
wndcls.hCursor = hCursor;
wndcls.hbrBackground = hbrBackground;
wndcls.lpszMenuName = NULL;
wndcls.lpszClassName = strClassName;
if (!AfxRegisterClass(&wndcls))
{
AfxThrowResourceException();
}
}
return strClassName;
}
BOOL AFX_GLOBAL_DATA::ExcludeTag(CString& strBuffer, LPCTSTR lpszTag, CString& strTag, BOOL bIsCharsList /* = FALSE*/)
{
const int iBufLen = strBuffer.GetLength();
CString strTagStart = _T("<");
strTagStart += lpszTag;
strTagStart += _T(">");
const int iTagStartLen = strTagStart.GetLength();
int iStart = -1;
int iIndexStart = strBuffer.Find(strTagStart);
if (iIndexStart < 0)
{
return FALSE;
}
iStart = iIndexStart + iTagStartLen;
CString strTagEnd = _T("</");
strTagEnd += lpszTag;
strTagEnd += _T('>');
const int iTagEndLen = strTagEnd.GetLength();
int iIndexEnd = -1;
int nBalanse = 1;
for (int i = iStart; i < iBufLen - iTagEndLen + 1; i ++)
{
if (strBuffer [i] != '<')
{
continue;
}
if (i < iBufLen - iTagStartLen && _tcsncmp(strBuffer.Mid(i), strTagStart, iTagStartLen) == 0)
{
i += iTagStartLen - 1;
nBalanse ++;
continue;
}
if (_tcsncmp(strBuffer.Mid(i), strTagEnd, iTagEndLen) == 0)
{
nBalanse --;
if (nBalanse == 0)
{
iIndexEnd = i;
break;
}
i += iTagEndLen - 1;
}
}
if (iIndexEnd == -1 || iStart > iIndexEnd)
{
return FALSE;
}
strTag = strBuffer.Mid(iStart, iIndexEnd - iStart);
strTag.TrimLeft();
strTag.TrimRight();
strBuffer.Delete(iIndexStart, iIndexEnd + iTagEndLen - iIndexStart);
if (bIsCharsList)
{
if (strTag.GetLength() > 1 && strTag [0] == _T('\"'))
{
strTag = strTag.Mid(1, strTag.GetLength() - 2);
}
strTag.Replace(_T("\\t"), _T("\t"));
strTag.Replace(_T("\\n"), _T("\n"));
strTag.Replace(_T("\\r"), _T("\r"));
strTag.Replace(_T("\\b"), _T("\b"));
strTag.Replace(_T("LT"), _T("<"));
strTag.Replace(_T("GT"), _T(">"));
strTag.Replace(_T("AMP"), _T("&"));
}
return TRUE;
}
BOOL AFX_GLOBAL_DATA::DwmExtendFrameIntoClientArea(HWND hWnd, AFX_MARGINS* pMargins)
{
if (m_pfDwmExtendFrameIntoClientArea == NULL)
{
return FALSE;
}
HRESULT hres = (*m_pfDwmExtendFrameIntoClientArea)(hWnd, pMargins);
return hres == S_OK;
}
LRESULT AFX_GLOBAL_DATA::DwmDefWindowProc(HWND hWnd, UINT message, WPARAM wp, LPARAM lp)
{
if (m_pfDwmDefWindowProc == NULL)
{
return(LRESULT)-1;
}
LRESULT lres = 0;
(*m_pfDwmDefWindowProc)(hWnd, message, wp, lp, &lres);
return lres;
}
BOOL AFX_GLOBAL_DATA::DwmIsCompositionEnabled()
{
if (m_pfDwmIsCompositionEnabled == NULL || bDisableAero)
{
return FALSE;
}
BOOL bEnabled = FALSE;
(*m_pfDwmIsCompositionEnabled)(&bEnabled);
return bEnabled;
}
BOOL AFX_GLOBAL_DATA::DrawTextOnGlass(HTHEME hTheme, CDC* pDC, int iPartId, int iStateId, CString strText, CRect rect, DWORD dwFlags, int nGlowSize, COLORREF clrText)
{
//---- bits used in dwFlags of DTTOPTS ----
#define AFX_DTT_TEXTCOLOR (1UL << 0) // crText has been specified
#define AFX_DTT_BORDERCOLOR (1UL << 1) // crBorder has been specified
#define AFX_DTT_SHADOWCOLOR (1UL << 2) // crShadow has been specified
#define AFX_DTT_SHADOWTYPE (1UL << 3) // iTextShadowType has been specified
#define AFX_DTT_SHADOWOFFSET (1UL << 4) // ptShadowOffset has been specified
#define AFX_DTT_BORDERSIZE (1UL << 5) // nBorderSize has been specified
#define AFX_DTT_FONTPROP (1UL << 6) // iFontPropId has been specified
#define AFX_DTT_COLORPROP (1UL << 7) // iColorPropId has been specified
#define AFX_DTT_STATEID (1UL << 8) // IStateId has been specified
#define AFX_DTT_CALCRECT (1UL << 9) // Use pRect as and in/out parameter
#define AFX_DTT_APPLYOVERLAY (1UL << 10) // fApplyOverlay has been specified
#define AFX_DTT_GLOWSIZE (1UL << 11) // iGlowSize has been specified
#define AFX_DTT_CALLBACK (1UL << 12) // pfnDrawTextCallback has been specified
#define AFX_DTT_COMPOSITED (1UL << 13) // Draws text with antialiased alpha(needs a DIB section)
if (hTheme == NULL || m_pfDrawThemeTextEx == NULL || !DwmIsCompositionEnabled())
{
pDC->DrawText(strText, rect, dwFlags);
return FALSE;
}
CComBSTR bstmp = (LPCTSTR)strText;
wchar_t* wbuf = new wchar_t[bstmp.Length() + 1];
wcscpy_s(wbuf, bstmp.Length() + 1, bstmp);
AFX_DTTOPTS dto;
memset(&dto, 0, sizeof(AFX_DTTOPTS));
dto.dwSize = sizeof(AFX_DTTOPTS);
dto.dwFlags = AFX_DTT_COMPOSITED;
if (nGlowSize > 0)
{
dto.dwFlags |= AFX_DTT_GLOWSIZE;
dto.iGlowSize = nGlowSize;
}
if (clrText != (COLORREF)-1)
{
dto.dwFlags |= AFX_DTT_TEXTCOLOR;
dto.crText = clrText;
}
(*m_pfDrawThemeTextEx)(hTheme, pDC->GetSafeHdc(), iPartId, iStateId, wbuf, -1, dwFlags, rect, &dto);
delete [] wbuf;
return TRUE;
}
HCURSOR AFX_GLOBAL_DATA::GetHandCursor()
{
if (m_hcurHand == NULL)
{
m_hcurHand = ::LoadCursorW(NULL, MAKEINTRESOURCEW(IDC_HAND));
}
return m_hcurHand;
}
BOOL AFX_GLOBAL_DATA::Resume()
{
m_hinstUXThemeDLL = ::AfxCtxLoadLibraryW(L"UxTheme.dll");
if (m_hinstUXThemeDLL != NULL)
{
m_pfDrawThemeBackground = (DRAWTHEMEPARENTBACKGROUND)::GetProcAddress (m_hinstUXThemeDLL, "DrawThemeParentBackground");
m_pfDrawThemeTextEx = (DRAWTHEMETEXTEX)::GetProcAddress (m_hinstUXThemeDLL, "DrawThemeTextEx");
m_pfBeginBufferedPaint = (BEGINBUFFEREDPAINT)::GetProcAddress (m_hinstUXThemeDLL, "BeginBufferedPaint");
m_pfEndBufferedPaint = (ENDBUFFEREDPAINT)::GetProcAddress (m_hinstUXThemeDLL, "EndBufferedPaint");
}
else
{
m_pfDrawThemeBackground = NULL;
m_pfDrawThemeTextEx = NULL;
m_pfBeginBufferedPaint = NULL;
m_pfEndBufferedPaint = NULL;
}
if (m_hinstDwmapiDLL != NULL)
{
m_hinstDwmapiDLL = ::AfxCtxLoadLibraryW(L"dwmapi.dll");
ENSURE(m_hinstDwmapiDLL != NULL);
m_pfDwmExtendFrameIntoClientArea = (DWMEXTENDFRAMEINTOCLIENTAREA)::GetProcAddress (m_hinstDwmapiDLL, "DwmExtendFrameIntoClientArea");
m_pfDwmDefWindowProc = (DWMDEFWINDOWPROC) ::GetProcAddress (m_hinstDwmapiDLL, "DwmDefWindowProc");
m_pfDwmIsCompositionEnabled = (DWMISCOMPOSITIONENABLED)::GetProcAddress (m_hinstDwmapiDLL, "DwmIsCompositionEnabled");
}
if (m_bEnableAccessibility)
{
EnableAccessibilitySupport();
}
/*
CMFCVisualManagerOffice2007::CleanStyle ();
if (CMFCVisualManager::m_pRTIDefault != NULL)
{
CMFCVisualManager::SetDefaultManager (CMFCVisualManager::m_pRTIDefault);
}
*/
return TRUE;
}
BOOL AFX_GLOBAL_DATA::GetNonClientMetrics (NONCLIENTMETRICS& info)
{
struct AFX_OLDNONCLIENTMETRICS
{
UINT cbSize;
int iBorderWidth;
int iScrollWidth;
int iScrollHeight;
int iCaptionWidth;
int iCaptionHeight;
LOGFONT lfCaptionFont;
int iSmCaptionWidth;
int iSmCaptionHeight;
LOGFONT lfSmCaptionFont;
int iMenuWidth;
int iMenuHeight;
LOGFONT lfMenuFont;
LOGFONT lfStatusFont;
LOGFONT lfMessageFont;
};
const UINT cbProperSize = (_AfxGetComCtlVersion() < MAKELONG(1, 6))
? sizeof(AFX_OLDNONCLIENTMETRICS) : sizeof(NONCLIENTMETRICS);
info.cbSize = cbProperSize;
return ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, cbProperSize, &info, 0);
}
BOOL AFXAPI AfxIsExtendedFrameClass(CWnd* pWnd)
{
/*
ENSURE( pWnd );
if (pWnd->IsKindOf(RUNTIME_CLASS(CFrameWndEx)))
{
return TRUE;
}
if (pWnd->IsKindOf(RUNTIME_CLASS(CMDIFrameWndEx)))
{
return TRUE;
}
if (pWnd->IsKindOf(RUNTIME_CLASS(COleIPFrameWndEx)))
{
return TRUE;
}
if (pWnd->IsKindOf(RUNTIME_CLASS(COleDocIPFrameWndEx)))
{
return TRUE;
}
if (pWnd->IsKindOf(RUNTIME_CLASS(CMDIChildWndEx)))
{
return TRUE;
}
*/
return FALSE;
}
BOOL AFXAPI AfxIsMFCToolBar(CWnd* pWnd)
{
ENSURE( pWnd );
/*
if (pWnd->IsKindOf(RUNTIME_CLASS(CMFCToolBar)))
{
return TRUE;
}
*/
return FALSE;
}
/*
HRESULT AFX_GLOBAL_DATA::ShellCreateItemFromParsingName(PCWSTR pszPath, IBindCtx *pbc, REFIID riid, void **ppv)
{
static HMODULE hShellDll = AfxCtxLoadLibrary(_T("Shell32.dll"));
ENSURE(hShellDll != NULL);
typedef HRESULT (__stdcall *PFNSHCREATEITEMFROMPARSINGNAME)(
PCWSTR,
IBindCtx*,
REFIID,
void**
);
PFNSHCREATEITEMFROMPARSINGNAME pSHCreateItemFromParsingName =
(PFNSHCREATEITEMFROMPARSINGNAME)GetProcAddress(hShellDll, "SHCreateItemFromParsingName");
if (pSHCreateItemFromParsingName == NULL)
{
return E_FAIL;
}
return (*pSHCreateItemFromParsingName)(pszPath, pbc, riid, ppv);
}
*/