windows-nt/Source/XPSP1/NT/enduser/netmeeting/ui/conf/dshowdlg.cpp
2020-09-26 16:20:57 +08:00

425 lines
10 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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));
}