/************************************************************************
*
* Resource ID Organiser Core Library
*
* (c) Copyright 2000-2004 by Riverblade Limited (UK). All rights reserved.
*
************************************************************************
*
* Description : CResOrgAboutBox - "About Box" dialog class
*
* Compiler : Microsoft Visual C++ 6.0, Service Pack 3 or later
* Microsoft Visual C++ .NET 2003
*
* Target
* Environment : Windows 98/NT/2000/XP
*
* NOTE:
*
* This software is provided "as is". All title and copyrights in and
* to the software, including but not limited to any images, text etc.
* etc. incorporated into it, are the property of Anna-Jayne Metcalfe
* and Riverblade Limited, except where acknowledged otherwise.
*
* Your may freely use this code in your own products, PROVIDED
* this notice is not removed or modified.
*
* Please visit http://www.riverblade.co.uk/products/resorg for
* support and updates
*
************************************************************************
*
* MODIFICATION HISTORY:
*
* This is a controlled document. See project configuration
* control tool for latest version and full version history.
*
* $Archive: /Projects/AddIns/ResOrg/ResOrgCore/ResOrgAboutBox.cpp $
* $Revision: 24 $
* $Date: 13/12/04 3:50 $
* $Author: Anna $
*
* $History: ResOrgAboutBox.cpp $
*
* ***************** Version 24 *****************
* User: Anna Date: 13/12/04 Time: 3:50
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* 1. Added company logo and legal warning
* 2. Updated file banners
*
* ***************** Version 23 *****************
* User: Anna Date: 10/05/04 Time: 20:21
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Clicking on the piccy now opens the "About Me" page on my site...
*
* ***************** Version 22 *****************
* User: Anna Date: 15/04/03 Time: 20:38
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* 1. Removed unnecessary file guards (#pragma once works well enough)
* 2. Updated file banners
*
* ***************** Version 21 *****************
* User: Anna Date: 19/03/03 Time: 18:41
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Banner corrections only
*
* ***************** Version 20 *****************
* User: Anna Date: 7/03/03 Time: 11:58
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Minor corrections
*
* ***************** Version 19 *****************
* User: Anna Date: 2/01/03 Time: 0:16
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* 1. Improvements to disclaimer and expiry tex using CNGHtmlStaticCtrl
* 2. Added a mugshot (just call me a vain cow, OK?)
*
* ***************** Version 18 *****************
* User: Anna Date: 3/12/02 Time: 20:30
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Made buttons XP style if a theme is active
*
* ***************** Version 17 *****************
* User: Anna Date: 25/11/02 Time: 20:27
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* 1. Updated website address on file banner
* 2. Website/email addresses are now obtained from the Options object
* rather than being hard-coded
*
* ***************** Version 16 *****************
* User: Anna Date: 22/10/02 Time: 14:17
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Corrected email address on hyperlink
*
* ***************** Version 15 *****************
* User: Anna Date: 22/10/02 Time: 13:24
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Changed name/mail address (at last!)
*
* ***************** Version 14 *****************
* User: Andy Date: 14/06/02 Time: 16:42
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Made the About Box slightly more colourful...
*
* ***************** Version 13 *****************
* User: Andy Date: 12/06/02 Time: 22:50
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Replaced CNGModulesListCtrl with CResOrgModulesListCtrl
*
* ***************** Version 12 *****************
* User: Andy Date: 12/06/02 Time: 15:44
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Added CResOrgAboutBox::m_pModuleState in order to configure the "Loaded
* Modules" control in the add-in
*
* ***************** Version 11 *****************
* User: Andy Date: 11/06/02 Time: 23:04
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* The AboutBox is now expandable - it now includes a list of the loaded
* modules
*
* ***************** Version 10 *****************
* User: Andy Date: 11/06/02 Time: 11:12
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* CResOrgAboutBox now picks up the application name dynamically
*
* ***************** Version 9 *****************
* User: Andy Date: 7/06/02 Time: 17:04
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Renamed the ResOrgUtils module to ResOrgCore. Updated file banners
* accordingly
*
* ***************** Version 8 *****************
* User: Andy Date: 7/06/02 Time: 9:36
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* 1. The Splash Screen and About Box now display the target environment
* (Visual C++ 5.0/6.0 or Visual C++.NET)
* 2. Updated file banners
*
* ***************** Version 7 *****************
* User: Andy Date: 11/10/01 Time: 12:13p
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Improved the splash screen and about box
*
* ***************** Version 6 *****************
* User: Andy Date: 8/06/01 Time: 20:24
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Corrected the email URL (it was adding an extra "mailto" to the URL)
*
* ***************** Version 5 *****************
* User: Andy Date: 5/04/01 Time: 6:11
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Added check for version expiry (conditional compilation)
*
* ***************** Version 4 *****************
* User: Andy Date: 29/11/00 Time: 19:00
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Legal copyright string is now assumed to be complete, rather than
* adding company name on automatically
*
* ***************** Version 3 *****************
* User: Andy Date: 29/11/00 Time: 18:38
* Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
* Added file banners
*
* $Nokeywords: $
*
************************************************************************/
#include "StdAfx.h"
#include "ResOrgCore_Priv.h"
#include "ResOrgAboutBox.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CResOrgAboutBox dialog
#define COLOUR_ABOUTBOX_BACKGROUND RGB(255, 255, 204)
#define COLOUR_ABOUTBOX_TITLE RGB(0, 0, 200)
#define COLOUR_ABOUTBOX_EXPIRY RGB(200, 0, 0)
#define COLOUR_ABOUTBOX_OK_BTN_BKND RGB(0, 128, 255)
#define COLOUR_ABOUTBOX_EXPAND_BTN_BKND RGB(0, 160, 0)
#define COLOUR_ABOUTBOX_OK_BTN_FGND RGB(255, 255, 255)
#define COLOUR_ABOUTBOX_EXPAND_BTN_FGND COLOUR_ABOUTBOX_OK_BTN_FGND
CResOrgAboutBox::CResOrgAboutBox(CWnd* pParent /*=NULL*/)
: CResOrgAboutBox_BASE(CResOrgAboutBox::IDD, pParent)
{
m_sTitle = _T("");
m_sPlatform.LoadString(IDS_RESORG_PLATFORM);
m_sFileVersion = _T("");
m_sCopyright = _T("");
m_sWebsite = Options.GetWebURL();
m_sMailTo = Options.GetEmailURL();
m_sLegalWarning.LoadString(IDS_PRODUCT_LEGAL_WARNING);
m_rectAuthorImage.SetRectEmpty();
m_rectCompanyLogo.SetRectEmpty();
m_hLinkCursor = NULL;
#if _MSC_VER >= 1300
m_sPlatform += _T(" .NET");
#else
m_sPlatform += _T(" 5.0/6.0");
#endif
m_pModuleState = NULL;
}
CResOrgAboutBox::~CResOrgAboutBox(void)
{
if (m_hLinkCursor)
{
DestroyCursor(m_hLinkCursor);
}
}
void CResOrgAboutBox::DoDataExchange(CDataExchange* pDX)
{
CResOrgAboutBox_BASE::DoDataExchange(pDX);
DDX_Text(pDX, IDC_RESORG_TITLE, m_sTitle);
DDX_Text(pDX, IDC_RESORG_PLATFORM, m_sPlatform);
DDX_Text(pDX, IDC_RESORG_VERSION, m_sFileVersion);
DDX_Text(pDX, IDC_RESORG_COPYRIGHT, m_sCopyright);
DDX_Text(pDX, IDC_PRODUCT_LEGAL_WARNING, m_sLegalWarning);
DDX_Control(pDX, IDC_RESORG_DISCLAIMER, m_ctrlDisclaimer);
DDX_Text(pDX, IDC_RESORG_WEBSITE, m_sWebsite);
DDX_Control(pDX, IDC_RESORG_WEBSITE, m_ctrlWebsite);
DDX_Text(pDX, IDC_RESORG_MAILTO, m_sMailTo);
DDX_Control(pDX, IDC_RESORG_MAILTO, m_ctrlEmail);
DDX_Control(pDX, IDC_RESORG_EXPIRY, m_ctrlExpiry);
DDX_Control(pDX, IDOK, m_ctrlOkButton);
DDX_Control(pDX, IDC_RESORG_ABOUTBOX_EXPAND, m_ctrlExpandButton);
DDX_Control(pDX, IDC_RESORG_ABOUTBOX_MODULES, m_ctrlModules);
}
BEGIN_MESSAGE_MAP(CResOrgAboutBox, CResOrgAboutBox_BASE)
ON_WM_CTLCOLOR()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
//ON_WM_PAINT()
ON_BN_CLICKED( IDC_RESORG_ABOUTBOX_EXPAND, OnClickedExpand)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CResOrgAboutBox overrides
/******************************************************************************
* Called when the dialog is created
*
******************************************************************************/
BOOL CResOrgAboutBox::OnInitDialog(void)
{
CResOrgAboutBox_BASE::OnInitDialog(); // returns TRUE unless you set the focus to a control
// Do this now because it could cause a noticeable delay otherwise
m_ctrlModules.Initialise(m_pModuleState);
m_ctrlModules.SetBkColor(COLOUR_ABOUTBOX_BACKGROUND);
m_ctrlModules.SetTextBkColor(COLOUR_ABOUTBOX_BACKGROUND);
m_ctrlModules.Refresh();
CWnd* pPiccy = GetDlgItem(IDC_RESORG_ABOUTBOX_PIC);
ASSERT(NULL != pPiccy);
if (NULL != pPiccy)
{
pPiccy->GetClientRect(&m_rectAuthorImage);
pPiccy->ClientToScreen(&m_rectAuthorImage);
ScreenToClient(&m_rectAuthorImage);
}
CWnd* pLogo = GetDlgItem(IDC_COMPANY_LOGO);
ASSERT(NULL != pLogo);
if (NULL != pLogo)
{
pLogo->GetClientRect(&m_rectCompanyLogo);
pLogo->ClientToScreen(&m_rectCompanyLogo);
ScreenToClient(&m_rectCompanyLogo);
}
// Set the dialog caption (this is necessary because the
// VC.NET build has a different application name)
CString sCaption, sFmt;
GetWindowText(sFmt);
sCaption.Format(sFmt, ::AfxGetAppName() );
SetWindowText(sCaption);
// Create the background brush
m_Brush.CreateSolidBrush(COLOUR_ABOUTBOX_BACKGROUND);
m_ctrlDisclaimer.SetBkColor(COLOUR_ABOUTBOX_BACKGROUND);
m_ctrlExpiry.SetBkColor(COLOUR_ABOUTBOX_BACKGROUND);
// Set the font for the app title and version
// TO DO: get the font name and size from the string table
CWnd* pWnd = GetDlgItem(IDC_RESORG_TITLE);
if (NULL != pWnd)
{
HDC hDC = ::GetDC(NULL);
int nFontSize = 14;
LONG nHeight = 0 - ::GetDeviceCaps(hDC, LOGPIXELSY) * nFontSize / 72;
::ReleaseDC(NULL, hDC);
m_fontTitle.SetFaceName( _T("Verdana") );
m_fontTitle.SetBold(TRUE);
m_fontTitle.SetHeight(nHeight);
pWnd->SetFont(&m_fontTitle);
}
pWnd = GetDlgItem(IDC_RESORG_VERSION);
if (pWnd != NULL)
{
HDC hDC = ::GetDC(NULL);
int nFontSize = 10;
LONG nHeight = 0 - ::GetDeviceCaps(hDC, LOGPIXELSY) * nFontSize / 72;
::ReleaseDC(NULL, hDC);
m_fontVersion.SetFaceName( _T("Verdana") );
m_fontVersion.SetBold(TRUE);
m_fontVersion.SetItalic(TRUE);
m_fontVersion.SetHeight(nHeight);
pWnd->SetFont(&m_fontVersion);
}
// Read the fields we need from the version resource
// If any can't be found, they will be blank
CNGModuleVersion ver;
ver.GetFileVersionInfo();
m_sTitle = ver.GetValue( _T("FileDescription") );
m_sFileVersion = _T("Version ") + ver.GetValue( _T("FileVersion") );
m_sCopyright = ver.GetValue( _T("LegalCopyright") );
// Initialise the URL links
if (!m_sWebsite.IsEmpty())
{
m_ctrlWebsite.SetURL(m_sWebsite);
}
if (!m_sMailTo.IsEmpty())
{
// Makeup URL including subject as app name/version
CString sSubject = m_sTitle + _T(" ") + m_sFileVersion;
CString sEmailURL = _T("mailto:") +
m_sMailTo +
_T("?Subject=") +
sSubject;
m_ctrlEmail.SetURL(sEmailURL);
}
CString sDisclaimer;
sDisclaimer.LoadString(IDS_RESORG_DISCLAIMER);
m_ctrlDisclaimer.SetWindowText(sDisclaimer);
#ifdef _RESORG_EXPIRY_DATE
CString sExpiryMsg;
if (::IsVersionExpired() )
{
sExpiryMsg.LoadString(IDP_RESORG_EXPIRED);
}
else
{
CTime timeExpires = GetVersionExpiryDate();
CString sExpiryTime = timeExpires.Format( _T("%A, %d %B, %Y") );
sExpiryMsg.Format(IDP_RESORG_EXPIRY,
sExpiryTime);
}
m_ctrlExpiry.SetWindowText(sExpiryMsg);
m_ctrlExpiry.ShowWindow(SW_RESTORE);
#endif
UpdateData(FALSE);
// Initialise the dialog expander
m_DlgExpander.Initialize( this,
FALSE,
IDC_RESORG_ABOUTBOX_EXPAND,
IDC_RESORG_ABOUTBOX_SHRINKMARK,
_T("<<") ) ;
// Store the positions of the OK and More/Less buttons
m_ctrlOkButton.GetWindowRect(m_rectOkButton);
ScreenToClient(m_rectOkButton);
m_ctrlExpandButton.GetWindowRect(m_rectExpandButton);
ScreenToClient(m_rectExpandButton);
if (m_ThemeHelper.IsThemeActive() )
{
m_ctrlOkButton.SetThemeHelper(&m_ThemeHelper);
m_ctrlExpandButton.SetThemeHelper(&m_ThemeHelper);
}
else
{
// Set button colours
m_ctrlOkButton.SetColor( CNGButton::BTNST_COLOR_FG_IN,
COLOUR_ABOUTBOX_OK_BTN_FGND);
m_ctrlOkButton.SetColor( CNGButton::BTNST_COLOR_FG_OUT,
COLOUR_ABOUTBOX_OK_BTN_FGND);
m_ctrlOkButton.SetColor( CNGButton::BTNST_COLOR_FG_FOCUS,
COLOUR_ABOUTBOX_OK_BTN_FGND);
m_ctrlOkButton.SetColor( CNGButton::BTNST_COLOR_BK_IN,
COLOUR_ABOUTBOX_OK_BTN_BKND);
m_ctrlOkButton.SetColor( CNGButton::BTNST_COLOR_BK_OUT,
COLOUR_ABOUTBOX_OK_BTN_BKND);
m_ctrlOkButton.SetColor( CNGButton::BTNST_COLOR_BK_FOCUS,
COLOUR_ABOUTBOX_OK_BTN_BKND);
m_ctrlExpandButton.SetColor(CNGButton::BTNST_COLOR_FG_IN,
COLOUR_ABOUTBOX_EXPAND_BTN_FGND);
m_ctrlExpandButton.SetColor(CNGButton::BTNST_COLOR_FG_OUT,
COLOUR_ABOUTBOX_EXPAND_BTN_FGND);
m_ctrlExpandButton.SetColor(CNGButton::BTNST_COLOR_FG_FOCUS,
COLOUR_ABOUTBOX_EXPAND_BTN_FGND);
m_ctrlExpandButton.SetColor(CNGButton::BTNST_COLOR_BK_IN,
COLOUR_ABOUTBOX_EXPAND_BTN_BKND);
m_ctrlExpandButton.SetColor(CNGButton::BTNST_COLOR_BK_OUT,
COLOUR_ABOUTBOX_EXPAND_BTN_BKND);
m_ctrlExpandButton.SetColor(CNGButton::BTNST_COLOR_BK_FOCUS,
COLOUR_ABOUTBOX_EXPAND_BTN_BKND);
m_ctrlOkButton.SetFlat(FALSE);
m_ctrlExpandButton.SetFlat(FALSE);
}
return TRUE; // Return TRUE unless you set the focus to a control
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgAboutBox message handlers
HBRUSH CResOrgAboutBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
// Call the base class first so the hyperlink controls will
// be painted properly
CResOrgAboutBox_BASE::OnCtlColor(pDC, pWnd, nCtlColor);
HBRUSH hbr = m_Brush;
UINT uID = pWnd->GetDlgCtrlID();
if (uID > 0)
{
// Set the background mode for text to transparent
// so the background will show through
pDC->SetBkMode(TRANSPARENT);
switch (uID)
{
case IDC_RESORG_TITLE:
case IDC_RESORG_PLATFORM:
case IDC_RESORG_VERSION:
pDC->SetTextColor(COLOUR_ABOUTBOX_TITLE);
break;
default:
break;
}
}
return hbr;
}
void CResOrgAboutBox::OnPaint(void)
{
CPaintDC dc(this); // device context for painting
// Select a hollow brush
CBrush* pOldBrush = (CBrush*)dc.SelectStockObject(HOLLOW_BRUSH);
// Create and select a thick, blue pen
CPen pen;
pen.CreatePen(PS_SOLID, 5, RGB(0, 0, 200));
CPen* pOldPen = (CPen*)dc.SelectObject(&pen);
// Get our client rectangle so we can to use it to
// draw a bounding rectangle around the splash screen
CRect rect;
GetClientRect(rect);
// Draw a hollow rectangle
dc.Rectangle(rect);
// Restore the original pen and brush
dc.SelectObject(pOldBrush);
dc.SelectObject(pOldPen);
// Do not call CResOrgSplashWnd_BASE::OnPaint() for painting messages
}
void CResOrgAboutBox::OnClickedExpand(void)
{
m_DlgExpander.OnExpandButton();
if (m_DlgExpander.IsExpanded())
{
// Move the OK and More/Less buttons
CRect rect;
CWnd* pWnd = GetDlgItem(IDC_RESORG_ABOUTBOX_IDOK_EXPANDED);
pWnd->GetWindowRect(rect);
ScreenToClient(rect);
m_ctrlOkButton.MoveWindow(rect);
pWnd = GetDlgItem(IDC_RESORG_ABOUTBOX_CONTRACT);
pWnd->GetWindowRect(rect);
ScreenToClient(rect);
m_ctrlExpandButton.MoveWindow(rect);
}
else
{
m_ctrlOkButton.MoveWindow(m_rectOkButton);
m_ctrlExpandButton.MoveWindow(m_rectExpandButton);
}
}
void CResOrgAboutBox::OnMouseMove(UINT nFlags, CPoint point)
{
if ( (!m_rectAuthorImage.IsRectEmpty() && m_rectAuthorImage.PtInRect(point) ) ||
(!m_rectCompanyLogo.IsRectEmpty() && m_rectCompanyLogo.PtInRect(point) ) )
{
// TODO: Add your message handler code here and/or call default
if (m_hLinkCursor == NULL) // No cursor handle - load our own
{
// Get the windows directory
CString strWndDir;
GetWindowsDirectory(strWndDir.GetBuffer(MAX_PATH), MAX_PATH);
strWndDir.ReleaseBuffer();
strWndDir += _T("\\winhlp32.exe");
// This retrieves cursor #106 from winhlp32.exe, which is a hand pointer
HMODULE hModule = LoadLibrary(strWndDir);
if (hModule)
{
HCURSOR hHandCursor = ::LoadCursor(hModule, MAKEINTRESOURCE(106));
if (NULL != hHandCursor)
{
m_hLinkCursor = CopyCursor(hHandCursor);
}
}
FreeLibrary(hModule);
}
if (NULL != m_hLinkCursor)
{
::SetCursor(m_hLinkCursor);
}
}
CResOrgAboutBox_BASE::OnMouseMove(nFlags, point);
}
void CResOrgAboutBox::OnLButtonDown(UINT nFlags, CPoint point)
{
if (!m_rectAuthorImage.IsRectEmpty() && m_rectAuthorImage.PtInRect(point) )
{
::ShellExecute( NULL, _T("open"), Options.GetAboutMeURL(), NULL, NULL, SW_SHOW);
}
else if (!m_rectCompanyLogo.IsRectEmpty() && m_rectCompanyLogo.PtInRect(point) )
{
::ShellExecute( NULL, _T("open"), _T("http://www.riverblade.co.uk"), NULL, NULL, SW_SHOW);
}
CResOrgAboutBox_BASE::OnLButtonDown(nFlags, point);
}