|
|
#include "precomp.h"
#include "resource.h"
/****************************************************************************
* * FILE: DShowDlg.cpp * * CREATED: Chris Pirich (ChrisPi) 5-6-96 * * CONTENTS: CDontShowDlg object * ****************************************************************************/
#include "DShowDlg.h"
#include "conf.h"
#include "ConfUtil.h"
/****************************************************************************
* * CLASS: CDontShowDlg * * MEMBER: CDontShowDlg() * * PURPOSE: Constructor - initializes variables * ****************************************************************************/
CDontShowDlg::CDontShowDlg( UINT uMsgId, LPCTSTR pcszRegVal, UINT uFlags): m_uMsgId (uMsgId), m_hwnd (NULL), m_reDontShow (UI_KEY, HKEY_CURRENT_USER), m_uFlags (uFlags), m_nWidth (0), m_nHeight (0), m_nTextWidth (0), m_nTextHeight (0) { DebugEntry(CDontShowDlg::CDontShowDlg);
ASSERT(pcszRegVal); m_pszRegVal = PszAlloc(pcszRegVal);
DebugExitVOID(CDontShowDlg::CDontShowDlg); }
/****************************************************************************
* * CLASS: CDontShowDlg * * MEMBER: DoModal() * * PURPOSE: Brings up the modal dialog box * ****************************************************************************/
INT_PTR CDontShowDlg::DoModal(HWND hwnd) { DebugEntry(CDontShowDlg::DoModal);
INT_PTR nRet = IDCANCEL;
if (_Module.InitControlMode()) { nRet = IDOK; } else if (NULL != m_pszRegVal) { // If the "dont show me" check box has been checked before and stored in
// the registry, then return IDOK, so the calling code doesn't have to
// differentiate the two cases.
nRet = (TRUE == m_reDontShow.GetNumber(m_pszRegVal, FALSE)) ? IDOK : IDCANCEL; } if (IDOK != nRet) { HWND hwndDesktop = ::GetDesktopWindow(); if (NULL != hwndDesktop) { HDC hdc = ::GetDC(hwndDesktop); if (NULL != hdc) { HFONT hFontOld = (HFONT) SelectObject(hdc, g_hfontDlg); TCHAR szString[DS_MAX_MESSAGE_LENGTH]; LPTSTR pszString = NULL; if (0 != HIWORD(m_uMsgId)) { // use m_uMsgId as a string pointer
// NOTE: object must be used on the stack since the pointer is
// not copied
pszString = (LPTSTR) m_uMsgId; } else if (::LoadString( ::GetInstanceHandle(), (UINT)m_uMsgId, szString, ARRAY_ELEMENTS(szString))) { pszString = szString; } if (NULL != pszString) { m_nTextWidth = DS_MAX_TEXT_WIDTH;
RECT rct = {0, 0, m_nTextWidth, 0xFFFF}; m_nTextHeight = ::DrawText( hdc, pszString, -1, &rct, DT_LEFT | DT_CALCRECT | DT_WORDBREAK); } ::SelectObject(hdc, hFontOld); ::ReleaseDC(hwndDesktop, hdc); } }
// If the box wasn't checked before, then bring up the dialog:
nRet = DialogBoxParam( ::GetInstanceHandle(), MAKEINTRESOURCE(IDD_DONT_SHOW_ME), hwnd, CDontShowDlg::DontShowDlgProc, (LPARAM) this); }
DebugExitINT_PTR(CDontShowDlg::DoModal, nRet);
return nRet; }
/****************************************************************************
* * CLASS: CDontShowDlg * * MEMBER: DontShowDlgProc() * * PURPOSE: Dialog Proc - handles all messages * ****************************************************************************/
INT_PTR CALLBACK CDontShowDlg::DontShowDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL bMsgHandled = FALSE;
// uMsg may be any value.
// wparam may be any value.
// lparam may be any value.
ASSERT(IS_VALID_HANDLE(hDlg, WND));
switch (uMsg) { case WM_INITDIALOG: { if (NULL != lParam) { CDontShowDlg* pdsd = (CDontShowDlg*) lParam; pdsd->m_hwnd = hDlg; ::SetWindowLongPtr(hDlg, DWLP_USER, lParam);
int nInitialTextWidth = 0; int nInitialTextHeight = 0;
TCHAR szMsgBuf[DS_MAX_MESSAGE_LENGTH]; if (0 != HIWORD(pdsd->m_uMsgId)) { // use m_uMsgId as a string pointer
// NOTE: object must be used on the stack since the pointer is
// not copied
ASSERT(IS_VALID_READ_PTR((LPTSTR) pdsd->m_uMsgId, TCHAR)); lstrcpyn(szMsgBuf, (LPTSTR) pdsd->m_uMsgId, CCHMAX(szMsgBuf)); } else { ::LoadString( ::GetInstanceHandle(), (INT)pdsd->m_uMsgId, szMsgBuf, (INT)ARRAY_ELEMENTS(szMsgBuf)); }
// Set the text
::SetDlgItemText( hDlg, IDC_TEXT_STATIC, szMsgBuf);
RECT rctDlg; ::GetWindowRect(hDlg, &rctDlg); int nOrigWidth = rctDlg.right - rctDlg.left; int nOrigHeight = rctDlg.bottom - rctDlg.top; HWND hwndText = ::GetDlgItem(hDlg, IDC_TEXT_STATIC); if (NULL != hwndText) { RECT rctText; if (::GetWindowRect(hwndText, &rctText)) { nInitialTextWidth = rctText.right - rctText.left; nInitialTextHeight = rctText.bottom - rctText.top; // Resize the text control
::SetWindowPos( hwndText, NULL, 0, 0, pdsd->m_nTextWidth, pdsd->m_nTextHeight, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW); }
// Set the font (for DBCS systems)
::SendMessage(hwndText, WM_SETFONT, (WPARAM) g_hfontDlg, 0); }
pdsd->m_nWidth = (nOrigWidth - nInitialTextWidth) + pdsd->m_nTextWidth; pdsd->m_nHeight = (nOrigHeight - nInitialTextHeight) + pdsd->m_nTextHeight;
RECT rctCtrl; // Move the ok button (IDOK)
HWND hwndOK = ::GetDlgItem(hDlg, IDOK); if ((NULL != hwndOK) && ::GetWindowRect(hwndOK, &rctCtrl)) { // Turn rctCtrl's top and left into client coords:
::MapWindowPoints(NULL, hDlg, (LPPOINT) &rctCtrl, 2); if (pdsd->m_uFlags & MB_OKCANCEL) { ::SetWindowPos( hwndOK, NULL, rctCtrl.left + ((pdsd->m_nWidth - nOrigWidth) / 2), rctCtrl.top + (pdsd->m_nHeight - nOrigHeight), 0, 0, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOREDRAW); } else { // center the OK button
::SetWindowPos( hwndOK, NULL, (pdsd->m_nWidth / 2) - ((rctCtrl.right - rctCtrl.left) / 2), rctCtrl.top + (pdsd->m_nHeight - nOrigHeight), 0, 0, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOREDRAW); } } // Move the cancel button (IDCANCEL)
HWND hwndCancel = ::GetDlgItem(hDlg, IDCANCEL); if ((NULL != hwndCancel) && ::GetWindowRect(hwndCancel, &rctCtrl)) { if (pdsd->m_uFlags & MB_OKCANCEL) { // Turn rctCtrl's top and left into client coords:
::MapWindowPoints(NULL, hDlg, (LPPOINT) &rctCtrl, 1); ::SetWindowPos( hwndCancel, NULL, rctCtrl.left + ((pdsd->m_nWidth - nOrigWidth) / 2), rctCtrl.top + (pdsd->m_nHeight - nOrigHeight), 0, 0, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOREDRAW); } else { ::ShowWindow(hwndCancel, SW_HIDE); } } // Move the check box (IDC_DONT_SHOW_ME_CHECK)
HWND hwndCheck = ::GetDlgItem(hDlg, IDC_DONT_SHOW_ME_CHECK); if ((NULL != hwndCheck) && ::GetWindowRect(hwndCheck, &rctCtrl)) { // Turn rctCtrl's top and left into client coords:
::MapWindowPoints(NULL, hDlg, (LPPOINT) &rctCtrl, 1); ::SetWindowPos( hwndCheck, NULL, rctCtrl.left, rctCtrl.top + (pdsd->m_nHeight - nOrigHeight), 0, 0, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOREDRAW); } // Show, resize, and activate
::SetWindowPos( hDlg, 0, 0, 0, pdsd->m_nWidth, pdsd->m_nHeight, SWP_SHOWWINDOW | SWP_NOZORDER | SWP_NOMOVE | SWP_DRAWFRAME);
// Put the appropriate icon on the dialog:
HWND hwndIcon = ::GetDlgItem(hDlg, IDC_ICON_STATIC); ::SendMessage( hwndIcon, STM_SETICON, (WPARAM) ::LoadIcon(NULL, IDI_INFORMATION), 0);
if (pdsd->m_uFlags & DSD_ALWAYSONTOP) { ::SetWindowPos( hDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); } if (pdsd->m_uFlags & MB_SETFOREGROUND) { ::SetForegroundWindow(hDlg); } }
bMsgHandled = 1; break; }
default: { CDontShowDlg* ppd = (CDontShowDlg*) GetWindowLongPtr( hDlg, DWLP_USER);
if (NULL != ppd) { bMsgHandled = ppd->OnMessage(uMsg, wParam, lParam); } } }
return bMsgHandled; }
/****************************************************************************
* * CLASS: CDontShowDlg * * MEMBER: OnMessage() * * PURPOSE: processes all messages except WM_INITDIALOG * ****************************************************************************/
BOOL CDontShowDlg::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL bRet = FALSE; ASSERT(m_hwnd); switch (uMsg) { case WM_COMMAND: { switch (LOWORD(wParam)) { case IDOK: { bRet = OnOk(); break; }
case IDCANCEL: { ::EndDialog(m_hwnd, LOWORD(wParam)); bRet = TRUE; break; }
} break; } default: break; }
return bRet; }
/****************************************************************************
* * CLASS: CDontShowDlg * * MEMBER: OnOk() * * PURPOSE: processes the WM_COMMAND,IDOK message * ****************************************************************************/
BOOL CDontShowDlg::OnOk() { DebugEntry(CDontShowDlg::OnOk);
BOOL bRet = TRUE;
if ((BST_CHECKED == ::IsDlgButtonChecked(m_hwnd, IDC_DONT_SHOW_ME_CHECK)) && (NULL != m_pszRegVal)) { m_reDontShow.SetValue(m_pszRegVal, TRUE); }
::EndDialog(m_hwnd, IDOK);
DebugExitBOOL(CDontShowDlg::OnOk, bRet);
return bRet; }
///////////////////////////////////////////////////////////////////////////////
//
/* F E N A B L E D O N T S H O W */ /*-------------------------------------------------------------------------
%%Function: FEnableDontShow
Return TRUE if the "Don't Show" dialog is enabled -------------------------------------------------------------------------*/ BOOL FEnableDontShow(LPCTSTR pszKey) { RegEntry reUI(UI_KEY, HKEY_CURRENT_USER); return (0 == reUI.GetNumber(pszKey, 0)); }
|