Application Security Testing: An Integral Part of DevOps
Environment: VC++ 6.0, XP, Win2k, NT 4.0, Win9x/ME
If running under Windows XP the application buttons will be skinned using the current selected theme (if any), while if running under Windows 9x/ME/NT/2000 the buttons will have the standard, well known CButtonST flat style. In both cases all CButtonST features are granted! Using CXPStyleButtonST, with a zero-cost implementation, your applications running under XP will have the new, smooth and elegant style but also will run error-less under old Windows versions.
How to integrate CXPStyleButtonST in your application
In your project include the following files:
CThemeHelperST. This class encapsulates all the required APIs to access the current selected theme (if any) or to run error-less if none is selected or if running under a old Windows version. You need only one instance for all the buttons, so this can be global to the application or only to the current dialog.
Create a CXPStyleButtonST object statically
With dialog editor create a standard button called, for example, IDOK (you don't need to make it owner drawn) and create a member variable for this button:
Now attach the button to CXPStyleButtonST. For dialog-based applications, in your OnInitDialog:
// Call the base-class method CDialog::OnInitDialog(); // Create the IDOK button m_btnOk.SubclassDlgItem(IDOK, this);
Or in your DoDataExchange:
// Call the base method CDialog::DoDataExchange(pDX); // Create the IDOK button DDX_Control(pDX, IDOK, m_btnOk);
Assign the CThemeHelperST instance to the button. This is fundamental or your button will not have the current theme style even if running under XP !
In your OnInitDialog:
// Assign theme helper instance to the button m_btnOk.SetThemeHelper(&m_ThemeHelper);
Create a CXPStyleButtonST object dynamically
In your application, create a member variable for the button. Please note that this variable is a pointer:
Now create the button. For dialog-based applications, in your OnInitDialog:
// Call the base-class method CDialog::OnInitDialog(); // Create the IDOK button m_pbtnOk = new CXPStyleButtonST; m_pbtnOk->Create(_T("&Ok"), WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, CRect(10, 10, 200, 100), this, IDOK); // Set the same font of the application m_pbtnOk->SetFont(GetFont());Assign the CThemeHelperST instance to the button as described in the previous section. Remember to destroy the button or you will get a memory leak. This can be done, for example, in your class destructor:
if (m_pbtnOk) delete m_pbtnOk;
Assigns a CThemeHelperST instance to the button.
// Parameters: // [IN] pTheme // Pointer to a CThemeHelperST instance. // Pass NULL to remove any previous instance. // void SetThemeHelper(CThemeHelperST* pTheme)
Returns the class version as a short value.
// Return value: // Class version. Divide by 10 to get actual version. // static short GetVersionI()
Returns the class version as a string value.
// Return value: // Pointer to a null-terminated string containing // the class version. // static LPCTSTR GetVersionC()
CXPStyleButtonST you need the Platform SDK (August 2001 or newer). This is not mandatory because at compile-time, if not found, it will be emulated. At run-time you don't need any additional SDK or libraries installed.