⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ngmessagebox.cpp

📁 ResOrg 图形化管理Vc项目的资源ID的工具的源代码。 ResOrg - Manage and Renumber Resource Symbol IDs Introduction The
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////
// 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 + -