425 lines
10 KiB
C++
425 lines
10 KiB
C++
#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));
|
||
}
|
||
|
||
|
||
|
||
|