- Main Page
- Namespaces
- Classes
- Files
- Directories

- File List
- File Members

# PropPageFrameDefault.cpp

    00001 /********************************************************************
    00002 *
    00003 * Copyright (c) 2002 Sven Wiegand <mail@sven-wiegand.de>
    00004 *
    00005 * You can use this and modify this in any way you want,
    00006 * BUT LEAVE THIS HEADER INTACT.
    00007 *
    00008 * Redistribution is appreciated.
    00009 *
    00010 * $Workfile:$
    00011 * $Revision: 1.1 $
    00012 * $Modtime:$
    00013 * $Author: gabest $
    00014 *
    00015 * Revision History:
    00016 *       $History:$
    00017 *
    00018 *********************************************************************/
    00019
    00020 #include "stdafx.h"
    00021 #include "PropPageFrameDefault.h"
    00022
    00023
    00024 namespace TreePropSheet
    00025 {
    00026
    00027
    00028 //uncomment the following line, if you don't have installed the
    00029 //new platform SDK
    00030 #define XPSUPPORT
    00031
    00032 #ifdef XPSUPPORT
    00033 #include <uxtheme.h>
    00034 #include <tmschema.h>
    00035 #endif
    00036
    00037 #ifdef _DEBUG
    00038 #define new DEBUG_NEW
    00039 #undef THIS_FILE
    00040 static char THIS_FILE[] = __FILE__;
    00041 #endif
    00042
    00043 //-------------------------------------------------------------------
    00044 // class CThemeLib
    00045 //-------------------------------------------------------------------
    00046
    00047 #define THEMEAPITYPE(f)                                 typedef HRESULT (__stdcall *_##f)
    00048 #define THEMEAPITYPE_(t, f)                     typedef t (__stdcall *_##f)
    00049 #define THEMEAPIPTR(f)                                  _##f m_p##f
    00050
    00051 #ifdef XPSUPPORT
    00052         #define THEMECALL(f)                                            return (*m_p##f)
    00053         #define GETTHEMECALL(f)                                 m_p##f = (_##f)GetProcAddress(m_hThemeLib, #f)
    00054 #else
    00055         void ThemeDummy(...) {ASSERT(FALSE);}
    00056         #define HTHEME                                                                  void*
    00057         #define TABP_PANE                                                               0
    00058         #define THEMECALL(f)                                            return 0; ThemeDummy
    00059         #define GETTHEMECALL(f)                                 m_p##f = NULL
    00060 #endif
    00061
    00062
    00071 class CThemeLib
    00072 {
    00073 // construction/destruction
    00074 public:
    00075         CThemeLib();
    00076         ~CThemeLib();
    00077
    00078 // operations
    00079 public:
    00083         BOOL IsAvailable() const;
    00084
    00085 // call wrappers
    00086 public:
    00087         BOOL IsThemeActive()
    00088         {THEMECALL(IsThemeActive)();}
    00089
    00090         HTHEME OpenThemeData(HWND hwnd, LPCWSTR pszClassList)
    00091         {THEMECALL(OpenThemeData)(hwnd, pszClassList);}
    00092
    00093         HRESULT CloseThemeData(HTHEME hTheme)
    00094         {THEMECALL(CloseThemeData)(hTheme);}
    00095
    00096         HRESULT GetThemeBackgroundContentRect(HTHEME hTheme, OPTIONAL HDC hdc, int iPartId, int iStateId,  const RECT *pBoundingRect, OUT RECT *pContentRect)
    00097         {THEMECALL(GetThemeBackgroundContentRect)(hTheme, hdc, iPartId, iStateId, pBoundingRect, pContentRect);}
    00098
    00099         HRESULT DrawThemeBackground(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, OPTIONAL const RECT *pClipRect)
    00100         {THEMECALL(DrawThemeBackground)(hTheme, hdc, iPartId, iStateId, pRect, pClipRect);}
    00101
    00102 // function pointers
    00103 private:
    00104 #ifdef XPSUPPORT
    00105         THEMEAPITYPE_(BOOL, IsThemeActive)();
    00106         THEMEAPIPTR(IsThemeActive);
    00107
    00108         THEMEAPITYPE_(HTHEME, OpenThemeData)(HWND hwnd, LPCWSTR pszClassList);
    00109         THEMEAPIPTR(OpenThemeData);
    00110
    00111         THEMEAPITYPE(CloseThemeData)(HTHEME hTheme);
    00112         THEMEAPIPTR(CloseThemeData);
    00113
    00114         THEMEAPITYPE(GetThemeBackgroundContentRect)(HTHEME hTheme, OPTIONAL HDC hdc, int iPartId, int iStateId,  const RECT *pBoundingRect, OUT RECT *pContentRect);
    00115         THEMEAPIPTR(GetThemeBackgroundContentRect);
    00116
    00117         THEMEAPITYPE(DrawThemeBackground)(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, OPTIONAL const RECT *pClipRect);
    00118         THEMEAPIPTR(DrawThemeBackground);
    00119 #endif
    00120
    00121 // properties
    00122 private:
    00124         HINSTANCE m_hThemeLib;
    00125 };
    00126
    00130 static CThemeLib g_ThemeLib;
    00131
    00132
    00133 CThemeLib::CThemeLib()
    00134 :       m_hThemeLib(NULL)
    00135 {
    00136 #ifdef XPSUPPORT
    00137         m_hThemeLib = LoadLibrary(_T("uxtheme.dll"));
    00138         if (!m_hThemeLib)
    00139                 return;
    00140
    00141         GETTHEMECALL(IsThemeActive);
    00142         GETTHEMECALL(OpenThemeData);
    00143         GETTHEMECALL(CloseThemeData);
    00144         GETTHEMECALL(GetThemeBackgroundContentRect);
    00145         GETTHEMECALL(DrawThemeBackground);
    00146 #endif
    00147 }
    00148
    00149
    00150 CThemeLib::~CThemeLib()
    00151 {
    00152         if (m_hThemeLib)
    00153                 FreeLibrary(m_hThemeLib);
    00154 }
    00155
    00156
    00157 BOOL CThemeLib::IsAvailable() const
    00158 {
    00159         return m_hThemeLib!=NULL;
    00160 }
    00161
    00162
    00163 //-------------------------------------------------------------------
    00164 // class CPropPageFrameDefault
    00165 //-------------------------------------------------------------------
    00166
    00167 BEGIN_MESSAGE_MAP(CPropPageFrameDefault, CWnd)
    00168         //{{AFX_MSG_MAP(CPropPageFrameDefault)
    00169         ON_WM_PAINT()
    00170         ON_WM_ERASEBKGND()
    00171         //}}AFX_MSG_MAP
    00172 END_MESSAGE_MAP()
    00173
    00174
    00175 CPropPageFrameDefault::CPropPageFrameDefault()
    00176 {
    00177 }
    00178
    00179
    00180 CPropPageFrameDefault::~CPropPageFrameDefault()
    00181 {
    00182         if (m_Images.GetSafeHandle())
    00183                 m_Images.DeleteImageList();
    00184 }
    00185
    00186
    00188 // Overridings
    00189
    00190 BOOL CPropPageFrameDefault::Create(DWORD dwWindowStyle, const RECT &rect, CWnd *pwndParent, UINT nID)
    00191 {
    00192         return CWnd::Create(
    00193                 AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW, AfxGetApp()->LoadStandardCursor(IDC_ARROW), GetSysColorBrush(COLOR_3DFACE)),
    00194                 _T("Page Frame"),
    00195                 dwWindowStyle, rect, pwndParent, nID);
    00196 }
    00197
    00198 CWnd* CPropPageFrameDefault::GetWnd()
    00199 {
    00200         return static_cast<CWnd*>(this);
    00201 }
    00202
    00203 void CPropPageFrameDefault::SetCaption(LPCTSTR lpszCaption, HICON hIcon /*= NULL*/)
    00204 {
    00205         CPropPageFrame::SetCaption(lpszCaption, hIcon);
    00206
    00207         // build image list
    00208         if (m_Images.GetSafeHandle())
    00209                 m_Images.DeleteImageList();
    00210         if (hIcon)
    00211         {
    00212                 ICONINFO        ii;
    00213                 if (!GetIconInfo(hIcon, &ii))
    00214                         return;
    00215
    00216                 CBitmap bmMask;
    00217                 bmMask.Attach(ii.hbmMask);
    00218                 if (ii.hbmColor) DeleteObject(ii.hbmColor);
    00219
    00220                 BITMAP  bm;
    00221                 bmMask.GetBitmap(&bm);
    00222
    00223                 if (!m_Images.Create(bm.bmWidth, bm.bmHeight, ILC_COLOR32|ILC_MASK, 0, 1))
    00224                         return;
    00225
    00226                 if (m_Images.Add(hIcon) == -1)
    00227                         m_Images.DeleteImageList();
    00228         }
    00229 }
    00230
    00231 CRect CPropPageFrameDefault::CalcMsgArea()
    00232 {
    00233         CRect   rect;
    00234         GetClientRect(rect);
    00235         if (g_ThemeLib.IsAvailable() && g_ThemeLib.IsThemeActive())
    00236         {
    00237                 HTHEME  hTheme = g_ThemeLib.OpenThemeData(m_hWnd, L"Tab");
    00238                 if (hTheme)
    00239                 {
    00240                         CRect   rectContent;
    00241                         CDC             *pDc = GetDC();
    00242                         g_ThemeLib.GetThemeBackgroundContentRect(hTheme, pDc->m_hDC, TABP_PANE, 0, rect, rectContent);
    00243                         ReleaseDC(pDc);
    00244                         g_ThemeLib.CloseThemeData(hTheme);
    00245
    00246                         if (GetShowCaption())
    00247                                 rectContent.top = rect.top+GetCaptionHeight()+1;
    00248                         rect = rectContent;
    00249                 }
    00250         }
    00251         else if (GetShowCaption())
    00252                 rect.top+= GetCaptionHeight()+1;
    00253
    00254         return rect;
    00255 }
    00256
    00257
    00258 CRect CPropPageFrameDefault::CalcCaptionArea()
    00259 {
    00260         CRect   rect;
    00261         GetClientRect(rect);
    00262         if (g_ThemeLib.IsAvailable() && g_ThemeLib.IsThemeActive())
    00263         {
    00264                 HTHEME  hTheme = g_ThemeLib.OpenThemeData(m_hWnd, L"Tab");
    00265                 if (hTheme)
    00266                 {
    00267                         CRect   rectContent;
    00268                         CDC             *pDc = GetDC();
    00269                         g_ThemeLib.GetThemeBackgroundContentRect(hTheme, pDc->m_hDC, TABP_PANE, 0, rect, rectContent);
    00270                         ReleaseDC(pDc);
    00271                         g_ThemeLib.CloseThemeData(hTheme);
    00272
    00273                         if (GetShowCaption())
    00274                                 rectContent.bottom = rect.top+GetCaptionHeight();
    00275                         else
    00276                                 rectContent.bottom = rectContent.top;
    00277
    00278                         rect = rectContent;
    00279                 }
    00280         }
    00281         else
    00282         {
    00283                 if (GetShowCaption())
    00284                         rect.bottom = rect.top+GetCaptionHeight();
    00285                 else
    00286                         rect.bottom = rect.top;
    00287         }
    00288
    00289         return rect;
    00290 }
    00291
    00292 void CPropPageFrameDefault::DrawCaption(CDC *pDc, CRect rect, LPCTSTR lpszCaption, HICON hIcon)
    00293 {
    00294         COLORREF        clrLeft = GetSysColor(COLOR_INACTIVECAPTION);
    00295         COLORREF        clrRight = pDc->GetPixel(rect.right-1, rect.top);
    00296         FillGradientRectH(pDc, rect, clrLeft, clrRight);
    00297
    00298         // draw icon
    00299         if (hIcon && m_Images.GetSafeHandle() && m_Images.GetImageCount() == 1)
    00300         {
    00301                 IMAGEINFO       ii;
    00302                 m_Images.GetImageInfo(0, &ii);
    00303                 CPoint          pt(3, rect.CenterPoint().y - (ii.rcImage.bottom-ii.rcImage.top)/2);
    00304                 m_Images.Draw(pDc, 0, pt, ILD_TRANSPARENT);
    00305                 rect.left+= (ii.rcImage.right-ii.rcImage.left) + 3;
    00306         }
    00307
    00308         // draw text
    00309         rect.left+= 2;
    00310
    00311         COLORREF        clrPrev = pDc->SetTextColor(GetSysColor(COLOR_CAPTIONTEXT));
    00312         int                             nBkStyle = pDc->SetBkMode(TRANSPARENT);
    00313         CFont                   *pFont = (CFont*)pDc->SelectStockObject(SYSTEM_FONT);
    00314
    00315         CFont* pSysFont = pDc->GetCurrentFont();
    00316         LOGFONT lf;
    00317         pSysFont->GetLogFont(&lf);
    00318         lf.lfHeight = rect.Height();
    00319         lf.lfWidth = 0;
    00320         _tcscpy(lf.lfFaceName, _T("Arial"));
    00321         CFont f;
    00322         f.CreateFontIndirect(&lf);
    00323         pDc->SelectObject(&f);
    00324
    00325         pDc->DrawText(lpszCaption, rect, DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
    00326
    00327         pDc->SetTextColor(clrPrev);
    00328         pDc->SetBkMode(nBkStyle);
    00329         pDc->SelectObject(pFont);
    00330 }
    00331
    00332
    00334 // Implementation helpers
    00335
    00336 void CPropPageFrameDefault::FillGradientRectH(CDC *pDc, const RECT &rect, COLORREF clrLeft, COLORREF clrRight)
    00337 {
    00338         // pre calculation
    00339         int     nSteps = rect.right-rect.left;
    00340         int     nRRange = GetRValue(clrRight)-GetRValue(clrLeft);
    00341         int     nGRange = GetGValue(clrRight)-GetGValue(clrLeft);
    00342         int     nBRange = GetBValue(clrRight)-GetBValue(clrLeft);
    00343
    00344         double  dRStep = (double)nRRange/(double)nSteps;
    00345         double  dGStep = (double)nGRange/(double)nSteps;
    00346         double  dBStep = (double)nBRange/(double)nSteps;
    00347
    00348         double  dR = (double)GetRValue(clrLeft);
    00349         double  dG = (double)GetGValue(clrLeft);
    00350         double  dB = (double)GetBValue(clrLeft);
    00351
    00352         CPen    *pPrevPen = NULL;
    00353         for (int x = rect.left; x <= rect.right; ++x)
    00354         {
    00355                 CPen    Pen(PS_SOLID, 1, RGB((BYTE)dR, (BYTE)dG, (BYTE)dB));
    00356                 pPrevPen = pDc->SelectObject(&Pen);
    00357                 pDc->MoveTo(x, rect.top);
    00358                 pDc->LineTo(x, rect.bottom);
    00359                 pDc->SelectObject(pPrevPen);
    00360
    00361                 dR+= dRStep;
    00362                 dG+= dGStep;
    00363                 dB+= dBStep;
    00364         }
    00365 }
    00366
    00367
    00369 // message handlers
    00370
    00371 void CPropPageFrameDefault::OnPaint()
    00372 {
    00373         CPaintDC dc(this);
    00374         Draw(&dc);
    00375 }
    00376
    00377
    00378 BOOL CPropPageFrameDefault::OnEraseBkgnd(CDC* pDC)
    00379 {
    00380         if (g_ThemeLib.IsAvailable() && g_ThemeLib.IsThemeActive())
    00381         {
    00382                 HTHEME  hTheme = g_ThemeLib.OpenThemeData(m_hWnd, L"Tab");
    00383                 if (hTheme)
    00384                 {
    00385                         CRect   rect;
    00386                         GetClientRect(rect);
    00387                         g_ThemeLib.DrawThemeBackground(hTheme, pDC->m_hDC, TABP_PANE, 0, rect, NULL);
    00388
    00389                         g_ThemeLib.CloseThemeData(hTheme);
    00390                 }
    00391                 return TRUE;
    00392         }
    00393         else
    00394         {
    00395                 return CWnd::OnEraseBkgnd(pDC);
    00396         }
    00397 }
    00398
    00399 } //namespace TreePropSheet