📄 ngmessagebox.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
// NGMessageBox.h
//
// Implements the extended Message Box class.
//
// xx-Nov-98 Thales P. Carvalho
// Created.
//
#include "stdafx.h"
#include "NGMessageBox.h"
#include <RichEdit.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Local constants
//
// Dialog template - to use with InitModalIndirect.
//
// Note: the following code was used to dump this binary data
//
// void DumpDlgRes( UINT uIDD )
// {
// HMODULE hMod = AfxGetResourceHandle();
//
// HRSRC hRsrc = ::FindResource( hMod,
// MAKEINTRESOURCE(uIDD), RT_DIALOG );
//
// HGLOBAL hData = ::LoadResource( hMod, hRsrc );
// LPBYTE pData = (LPBYTE)::LockResource( hData );
// DWORD dwcData = ::SizeofResource( hMod, hRsrc );
//
// for( DWORD i = 0; i < dwcData; ++i )
// {
// if( i % 16 == 0 )
// TRACE( "\n" );
//
// TRACE( "0x%02x, ", pData[i] );
// }
// }
//
static const BYTE _dlgData[] =
{
0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
0xc0, 0x00, 0xc8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x00,
0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x53, 0x00, 0x20, 0x00, 0x53, 0x00,
0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x53, 0x00, 0x65, 0x00,
0x72, 0x00, 0x69, 0x00, 0x66, 0x00, 0x00, 0x00,
};
/////////////////////////////////////////////////////////////////////////////
// Local utility functions
//
// RTF edit control StreamIn's callback function
// - see CRichEditCtrl::StreamIn
//
static DWORD CALLBACK _LoadRtfCallback(
DWORD dwCookie, // (in) pointer to the string
LPBYTE pbBuff, // (in) pointer to the destination buffer
LONG cb, // (in) size in bytes of the destination buffer
LONG FAR *pcb // (out) number of bytes transfered
)
{
LPCTSTR pszMsg = (LPCTSTR)dwCookie;
// number of bytes to copy
*pcb = _tcslen( pszMsg ) * sizeof(TCHAR);
// limiting it up to the buffer's size
if( *pcb > cb )
*pcb = cb;
// copying the string to the buffer
memcpy( pbBuff, pszMsg, *pcb );
// advancing to the end of the string
pszMsg += *pcb / sizeof(TCHAR);
// if it's the end of the string, returns NULL;
// otherwise, returns a pointer to the next char to transfer as the cookie
return ( *pszMsg != '\0' ) ? (DWORD)pszMsg : NULL;
}
static BOOL _LoadStringEx( LPCTSTR pszResId, LPCTSTR pszRsType, CString& strOut )
{
HINSTANCE hInst = ::AfxFindResourceHandle( pszResId, pszRsType );
if( hInst == NULL )
return FALSE;
HRSRC hRsrc = ::FindResource( hInst, pszResId, pszRsType );
if( hRsrc == NULL )
return FALSE;
HGLOBAL hGlobal = ::LoadResource( hInst, hRsrc );
if (hGlobal == NULL)
return FALSE;
const BYTE* pData = (const BYTE*)::LockResource( hGlobal );
DWORD dwSize = ::SizeofResource( hInst, hRsrc );
if( pData == NULL )
return FALSE;
CString str( (LPCTSTR)pData, dwSize );
strOut = str;
::UnlockResource( hGlobal );
::FreeResource( hGlobal );
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CNGMessageBox
// Constructor
CNGMessageBox::CNGMessageBox(
CWnd* pParentWnd // parent window (NULL for main window)
) :
m_uDefCmdId( (UINT)IDC_STATIC ),
m_uEscCmdId( (UINT)IDC_STATIC ),
m_bRtf( FALSE ),
m_hIcon( NULL ),
m_strTitle( AfxGetApp()->m_pszAppName )
{
m_pParentWnd = pParentWnd;
// default metric values
const int _aDefMetrics[NUM_OF_METRICS] =
{
10, // CX_LEFT_BORDER,
10, // CX_RIGHT_BORDER,
10, // CY_TOP_BORDER,
7, // CY_BOTTOM_BORDER,
10, // CX_ICON_MSG_SPACE,
7, // CY_BTNS_MSG_SPACE,
7, // CX_BTN_BORDER,
4, // CY_BTN_BORDER,
7, // CX_BTNS_SPACE,
40, // CX_MIN_BTN,
};
for( int i = 0; i < NUM_OF_METRICS; ++i )
m_aMetrics[i] = _aDefMetrics[i];
AfxInitRichEdit(); // Just in case nobody else has...
}
// Destructor
CNGMessageBox::~CNGMessageBox()
{
}
// Replaces CDialog::DoModal
int CNGMessageBox::DoModal()
{
InitModalIndirect( (LPCDLGTEMPLATE)_dlgData, m_pParentWnd );
return CDialog::DoModal();
}
/////////////////////////////////////////////////////////////////////////////
// CNGMessageBox - Button operations
// Add a button
void CNGMessageBox::AddButton(
UINT uIDC, // button command ID
BOOL bIsDefault, // set the button as default
BOOL bIsEscape, // return this command if user press escape
LPCTSTR pszText // button text
)
{
ASSERT( uIDC != (UINT)IDC_STATIC );
BTNDATA btndata;
btndata.uIDC = uIDC;
btndata.strBtn = pszText;
m_aBtns.Add( btndata );
if( bIsEscape )
m_uEscCmdId = uIDC;
if( bIsDefault )
m_uDefCmdId = uIDC;
}
// Add a button
void CNGMessageBox::AddButton(
UINT uIDC, // button command ID
BOOL bIsDefault, // set the button as default
BOOL bIsEscape, // return this command if user press escape
UINT uIdText // string ID of button's text
)
{
CString str;
if( uIdText == (UINT)-1 )
uIdText = uIDC;
VERIFY( str.LoadString( uIdText ) );
AddButton( uIDC, bIsDefault, bIsEscape, str );
}
/////////////////////////////////////////////////////////////////////////////
// CNGMessageBox - Plain text operations
BOOL CNGMessageBox::SetMsg( UINT uMsgId )
{
return m_strMsg.LoadString( uMsgId );
}
BOOL CNGMessageBox::SetMsg( LPCTSTR pszMsg )
{
m_strMsg = pszMsg;
return TRUE;
}
BOOL CNGMessageBox::SetMsgEx( LPCTSTR pszMsgResId, LPCTSTR pszMsgResType )
{
return _LoadStringEx( pszMsgResId, pszMsgResType, m_strMsg );
}
BOOL CNGMessageBox::FormatMsg( LPCTSTR pszFmt, ... )
{
va_list marker;
va_start( marker, pszFmt );
BOOL bOK = FormatMsgV( pszFmt, marker );
va_end( marker );
return bOK;
}
BOOL CNGMessageBox::FormatMsg( UINT uFmtStrId, ... )
{
CString strFmt;
if( !strFmt.LoadString( uFmtStrId ) )
return FALSE;
va_list marker;
va_start( marker, uFmtStrId );
BOOL bOK = FormatMsgV( strFmt, marker );
va_end( marker );
return bOK;
}
BOOL CNGMessageBox::FormatMsgEx( LPCTSTR pszMsgResId, LPCTSTR pszMsgResType, ... )
{
CString strFmt;
if( !_LoadStringEx( pszMsgResId, pszMsgResType, strFmt ) )
return FALSE;
va_list marker;
va_start( marker, pszMsgResType );
BOOL bOK = FormatMsgV( strFmt, marker );
va_end( marker );
return bOK;
}
BOOL CNGMessageBox::FormatMsgV( LPCTSTR pszFmt, va_list marker )
{
XString str;
str.FormatV( pszFmt, marker );
m_strMsg = str;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CNGMessageBox - Icon operations
void CNGMessageBox::SetIcon( HICON hIcon )
{
m_hIcon = hIcon;
if( m_hIcon != NULL )
{
// loading the icon and extracting it's dimensions
ICONINFO ii;
GetIconInfo( m_hIcon, &ii );
BITMAP bm;
GetObject( ii.hbmColor, sizeof(bm), &bm );
m_dimIcon.cx = bm.bmWidth;
m_dimIcon.cy = bm.bmHeight;
}
else
{
m_dimIcon.cx = 0;
m_dimIcon.cy = 0;
}
}
void CNGMessageBox::SetIcon( UINT uIcon )
{
SetIcon( AfxGetApp()->LoadIcon( uIcon ) );
}
void CNGMessageBox::SetStandardIcon( LPCTSTR pszIconName )
{
SetIcon( AfxGetApp()->LoadStandardIcon( pszIconName ) );
}
/////////////////////////////////////////////////////////////////////////////
// CNGMessageBox - Overrides
BOOL CNGMessageBox::OnInitDialog()
{
if( !CDialog::OnInitDialog() )
return FALSE;
SetWindowText( m_strTitle );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -