/******************************************************************************* * * (C) COPYRIGHT MICROSOFT CORPORATION, 2000 * * TITLE: MBOXEX.CPP * * VERSION: 1.0 * * AUTHOR: ShaunIv * * DATE: 7/13/2000 * * DESCRIPTION: Super duper message box * *******************************************************************************/ #include "precomp.h" #pragma hdrstop #include #include #include #include #include #include "mboxex.rh" #include "mboxex.h" extern HINSTANCE g_hInstance; CMessageBoxEx::CMessageBoxEx( HWND hWnd ) : m_hWnd(hWnd), m_pData(NULL) { } LRESULT CMessageBoxEx::OnInitDialog( WPARAM, LPARAM lParam ) { WIA_PUSHFUNCTION(TEXT("CMessageBoxEx::OnInitDialog")); // // Actual button ids // const UINT nButtonIds[MaxButtons] = { IDC_MESSAGEBOX_BUTTON_1, IDC_MESSAGEBOX_BUTTON_2, IDC_MESSAGEBOX_BUTTON_3, IDC_MESSAGEBOX_BUTTON_4 }; // // Get the data, and return and error if it is invalid // m_pData = reinterpret_cast(lParam); if (!m_pData) { EndDialog( m_hWnd, -1 ); return 0; } // // Set the button text for the used buttons // for (UINT i=0,nStart=MaxButtons-m_pData->m_nButtonCount;im_nButtonCount;i++) { SetWindowLongPtr( GetDlgItem( m_hWnd, nButtonIds[nStart+i] ), GWLP_USERDATA, nButtonIds[nStart+i] ); } // // Set the default for the "Hide future messages" button // if (m_pData->m_bHideMessageInFuture) { SendDlgItemMessage( m_hWnd, IDC_MESSAGEBOX_HIDEINFUTURE, BM_SETCHECK, BST_CHECKED, 0 ); } int nDeltaY = 0; HDC hDC = GetDC( GetDlgItem( m_hWnd, IDC_MESSAGEBOX_MESSAGE ) ); if (hDC) { // // Get the window rect of the message control // CSimpleRect rcMessage( GetDlgItem( m_hWnd, IDC_MESSAGEBOX_MESSAGE ), CSimpleRect::WindowRect ); rcMessage.ScreenToClient(m_hWnd); // // Get the correct font // HFONT hFont = reinterpret_cast(SendDlgItemMessage( m_hWnd, IDC_MESSAGEBOX_MESSAGE, WM_GETFONT, 0, 0 )); if (!hFont) { hFont = reinterpret_cast(GetStockObject(SYSTEM_FONT)); } if (hFont) { // // Calculate the height of the text // CSimpleRect rcText = rcMessage; HFONT hOldFont = reinterpret_cast(SelectObject( hDC, hFont )); int nHeight = DrawText( hDC, m_pData->m_strMessage, m_pData->m_strMessage.Length(), &rcText, DT_CALCRECT|DT_EXPANDTABS|DT_NOPREFIX|DT_WORDBREAK ); // // Only resize the control if it needs to be larger. Don't do it if the control needs to be smaller. // if (nHeight > rcMessage.Height()) { nDeltaY += (rcMessage.Height() - nHeight); CMoveWindow().Size( GetDlgItem( m_hWnd, IDC_MESSAGEBOX_MESSAGE ), 0, nHeight, CMoveWindow::NO_SIZEX ); } SelectObject( hDC, hOldFont ); } ReleaseDC( GetDlgItem( m_hWnd, IDC_MESSAGEBOX_MESSAGE ), hDC ); } // // If we are not supposed to show the "Hide future messages" button, hide it // and move all of the controls up by its height and vertical margin. // if ((m_pData->m_nFlags & MBEX_HIDEFUTUREMESSAGES) == 0) { EnableWindow( GetDlgItem( m_hWnd, IDC_MESSAGEBOX_HIDEINFUTURE ), FALSE ); ShowWindow( GetDlgItem( m_hWnd, IDC_MESSAGEBOX_HIDEINFUTURE ), SW_HIDE ); // // Figure out how much to move the controls up // nDeltaY += CSimpleRect( GetDlgItem( m_hWnd, IDC_MESSAGEBOX_HIDEINFUTURE ), CSimpleRect::WindowRect ).Height() + CDialogUnits(m_hWnd).Y(7); } if (nDeltaY) { CMoveWindow mw; // // Move the "Hide future messages" button // mw.Move( GetDlgItem( m_hWnd, IDC_MESSAGEBOX_HIDEINFUTURE ), 0, CSimpleRect( GetDlgItem( m_hWnd, IDC_MESSAGEBOX_HIDEINFUTURE ), CSimpleRect::WindowRect ).ScreenToClient(m_hWnd).top - nDeltaY, CMoveWindow::NO_MOVEX ); // // Figure out what the top row is // int nButtonTopRow = CSimpleRect( GetDlgItem( m_hWnd, IDC_MESSAGEBOX_BUTTON_4 ), CSimpleRect::WindowRect ).ScreenToClient(m_hWnd).top - nDeltaY; // // Move all of the buttons // mw.Move( GetDlgItem( m_hWnd, IDC_MESSAGEBOX_BUTTON_1 ), 0, nButtonTopRow, CMoveWindow::NO_MOVEX ); mw.Move( GetDlgItem( m_hWnd, IDC_MESSAGEBOX_BUTTON_2 ), 0, nButtonTopRow, CMoveWindow::NO_MOVEX ); mw.Move( GetDlgItem( m_hWnd, IDC_MESSAGEBOX_BUTTON_3 ), 0, nButtonTopRow, CMoveWindow::NO_MOVEX ); mw.Move( GetDlgItem( m_hWnd, IDC_MESSAGEBOX_BUTTON_4 ), 0, nButtonTopRow, CMoveWindow::NO_MOVEX ); mw.Apply(); // // Resize the dialog // CSimpleRect rcDialog( m_hWnd, CSimpleRect::WindowRect ); SetWindowPos( m_hWnd, NULL, 0, 0, rcDialog.Width(), rcDialog.Height()-nDeltaY, SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE ); } // // Hide and disable the unused buttons // for (i=0;im_nButtonCount;i++) { EnableWindow( GetDlgItem( m_hWnd, nButtonIds[i] ), FALSE ); ShowWindow( GetDlgItem( m_hWnd, nButtonIds[i] ), SW_HIDE ); } // // Set the button IDs. Do this last, so we can use constants until then // for (UINT i=0,nStart=MaxButtons-m_pData->m_nButtonCount;im_nButtonCount;i++) { WIA_TRACE((TEXT("SetWindowLongPtr( GetDlgItem( m_hWnd, %d ), GWLP_ID, %d );"), nButtonIds[nStart+i], m_pData->m_Buttons[i] )); SetWindowLongPtr( GetDlgItem( m_hWnd, nButtonIds[nStart+i] ), GWLP_ID, m_pData->m_Buttons[i] ); } // // Set the focus and default button // if (m_pData->m_nDefault) { SetFocus( GetDlgItem( m_hWnd, m_pData->m_nDefault) ); SendDlgItemMessage( GetParent(m_hWnd), m_pData->m_nDefault, BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE,0) ); SendMessage( m_hWnd, DM_SETDEFID, m_pData->m_nDefault, 0 ); } // // Set the icon // SendDlgItemMessage( m_hWnd, IDC_MESSAGEBOX_ICON, STM_SETICON, reinterpret_cast(m_pData->m_hIcon), 0 ); // // Set the message text // m_pData->m_strMessage.SetWindowText( GetDlgItem( m_hWnd, IDC_MESSAGEBOX_MESSAGE ) ); // // Set the window text // m_pData->m_strTitle.SetWindowText( m_hWnd ); SetForegroundWindow( m_hWnd ); return TRUE; } LRESULT CMessageBoxEx::OnCommand( WPARAM wParam, LPARAM lParam ) { // // First, check to see if this message pertains to one of our buttons // for (UINT i=0;im_nButtonCount;i++) { if ((LOWORD(wParam) == m_pData->m_Buttons[i]) == (HIWORD(wParam) == BN_CLICKED)) { // // Store the "Hide this message in the future" value // m_pData->m_bHideMessageInFuture = (BST_CHECKED == SendDlgItemMessage( m_hWnd, IDC_MESSAGEBOX_HIDEINFUTURE, BM_GETCHECK, 0, 0 )); // // Close the dialog // EndDialog( m_hWnd, LOWORD(wParam) ); return 0; } } if (LOWORD(wParam) == IDCANCEL) { EndDialog( m_hWnd, IDCANCEL ); return 0; } SC_BEGIN_COMMAND_HANDLERS() { } SC_END_COMMAND_HANDLERS(); } INT_PTR CALLBACK CMessageBoxEx::DialogProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { SC_BEGIN_DIALOG_MESSAGE_HANDLERS(CMessageBoxEx) { SC_HANDLE_DIALOG_MESSAGE( WM_INITDIALOG, OnInitDialog ); SC_HANDLE_DIALOG_MESSAGE( WM_COMMAND, OnCommand ); } SC_END_DIALOG_MESSAGE_HANDLERS(); } UINT CMessageBoxEx::MessageBox( HWND hWndParent, LPCTSTR pszMessage, LPCTSTR pszTitle, UINT nFlags, bool *pbHideFutureMessages ) { CData Data; Data.m_nFlags = nFlags; Data.m_strMessage = pszMessage; Data.m_strTitle = pszTitle; // // Figure out which set of buttons to use // int nDialogResource = 0; if (nFlags & MBEX_OKCANCEL) { nDialogResource = IDD_MESSAGEBOX_OKCANCEL; Data.m_Buttons[0] = IDMBEX_OK; Data.m_Buttons[1] = IDMBEX_CANCEL; Data.m_nButtonCount = 2; } else if (nFlags & MBEX_YESNO) { nDialogResource = IDD_MESSAGEBOX_YESNO; Data.m_Buttons[0] = IDMBEX_YES; Data.m_Buttons[1] = IDMBEX_NO; Data.m_nButtonCount = 2; } else if (nFlags & MBEX_CANCELRETRYSKIPSKIPALL) { nDialogResource = IDD_MESSAGEBOX_CANCELRETRYSKIPSKIPALL; Data.m_Buttons[0] = IDMBEX_CANCEL; Data.m_Buttons[1] = IDMBEX_RETRY; Data.m_Buttons[2] = IDMBEX_SKIP; Data.m_Buttons[3] = IDMBEX_SKIPALL; Data.m_nButtonCount = 4; } else if (nFlags & MBEX_CANCELRETRY) { nDialogResource = IDD_MESSAGEBOX_CANCELRETRY; Data.m_Buttons[0] = IDMBEX_CANCEL; Data.m_Buttons[1] = IDMBEX_RETRY; Data.m_nButtonCount = 2; } else if (nFlags & MBEX_YESYESTOALLNONOTOALL) { nDialogResource = IDD_MESSAGEBOX_YESYESTOALLNONOTOALL; Data.m_Buttons[0] = IDMBEX_YES; Data.m_Buttons[1] = IDMBEX_YESTOALL; Data.m_Buttons[2] = IDMBEX_NO; Data.m_Buttons[3] = IDMBEX_NOTOALL; Data.m_nButtonCount = 4; } else { nDialogResource = IDD_MESSAGEBOX_OK; Data.m_Buttons[0] = IDMBEX_OK; Data.m_nButtonCount = 1; } // // Figure out which icon to use // if (nFlags & MBEX_ICONWARNING) { Data.m_hIcon = LoadIcon( NULL, IDI_WARNING ); MessageBeep( MB_ICONWARNING ); } else if (nFlags & MBEX_ICONERROR) { Data.m_hIcon = LoadIcon( NULL, IDI_ERROR ); MessageBeep( MB_ICONERROR ); } else if (nFlags & MBEX_ICONQUESTION) { Data.m_hIcon = LoadIcon( NULL, IDI_QUESTION ); MessageBeep( MB_ICONQUESTION ); } else { Data.m_hIcon = LoadIcon( NULL, IDI_INFORMATION ); MessageBeep( MB_ICONINFORMATION ); } // // Figure out which button should be the default // if (nFlags & MBEX_DEFBUTTON2) { Data.m_nDefault = Data.m_Buttons[1]; } else if (nFlags & MBEX_DEFBUTTON3) { Data.m_nDefault = Data.m_Buttons[2]; } else if (nFlags & MBEX_DEFBUTTON4) { Data.m_nDefault = Data.m_Buttons[3]; } else { Data.m_nDefault = Data.m_Buttons[0]; } if (pbHideFutureMessages) { Data.m_bHideMessageInFuture = *pbHideFutureMessages; } INT_PTR nResult = DialogBoxParam( g_hInstance, MAKEINTRESOURCE(nDialogResource), hWndParent, DialogProc, reinterpret_cast(&Data) ); if (pbHideFutureMessages) { *pbHideFutureMessages = Data.m_bHideMessageInFuture; } return static_cast(nResult); } UINT CMessageBoxEx::MessageBox( HWND hWndParent, LPCTSTR pszMessage, LPCTSTR pszTitle, UINT nFlags, bool &bHideFutureMessages ) { return MessageBox( hWndParent, pszMessage, pszTitle, nFlags|MBEX_HIDEFUTUREMESSAGES, &bHideFutureMessages ); } UINT CMessageBoxEx::MessageBox( HWND hWndParent, LPCTSTR pszMessage, LPCTSTR pszTitle, UINT nFlags ) { return MessageBox( hWndParent, pszMessage, pszTitle, nFlags, NULL ); } UINT CMessageBoxEx::MessageBox( LPCTSTR pszMessage, LPCTSTR pszTitle, UINT nFlags ) { return MessageBox( NULL, pszMessage, pszTitle, nFlags, NULL ); } UINT CMessageBoxEx::MessageBox( HWND hWndParent, HINSTANCE hInstance, UINT nMessageId, UINT nTitleId, UINT nFlags, bool &bHideFutureMessages ) { return MessageBox( hWndParent, CSimpleString(nMessageId,hInstance), CSimpleString(nTitleId,hInstance), nFlags|MBEX_HIDEFUTUREMESSAGES, &bHideFutureMessages ); } UINT CMessageBoxEx::MessageBox( HWND hWndParent, LPCTSTR pszTitle, UINT nFlags, LPCTSTR pszFormat, ... ) { TCHAR szMessage[1024] = {0}; va_list arglist; va_start( arglist, pszFormat ); wvnsprintf( szMessage, ARRAYSIZE(szMessage), pszFormat, arglist ); va_end( arglist ); return MessageBox( hWndParent, szMessage, pszTitle, nFlags, NULL ); } UINT CMessageBoxEx::MessageBox( HWND hWndParent, LPCTSTR pszTitle, UINT nFlags, bool &bHideFutureMessages, LPCTSTR pszFormat, ... ) { TCHAR szMessage[1024] = {0}; va_list arglist; va_start( arglist, pszFormat ); wvnsprintf( szMessage, ARRAYSIZE(szMessage), pszFormat, arglist ); va_end( arglist ); return MessageBox( hWndParent, szMessage, pszTitle, nFlags, &bHideFutureMessages ); } UINT CMessageBoxEx::MessageBox( HWND hWndParent, HINSTANCE hInstance, UINT nTitleId, UINT nFlags, UINT nFormatId, ... ) { TCHAR szMessage[1024] = {0}; va_list arglist; va_start( arglist, nFormatId ); wvnsprintf( szMessage, ARRAYSIZE(szMessage), CSimpleString(nFormatId,hInstance), arglist ); va_end( arglist ); return MessageBox( hWndParent, szMessage, CSimpleString(nTitleId,hInstance), nFlags, NULL ); }