65.9K
CodeProject is changing. Read more.
Home

Formatted MessageBox/AfxMessageBox

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.87/5 (7 votes)

Oct 20, 2010

CPOL
viewsIcon

45181

Need to Format/sprintf a string before displaying a messagebox? Here is solution!

You often need to format a string and populate it with relevant data before displaying a message box. For example
int nAge = 27;
TCHAR sName[]="Ajay";
float nSalary = 12500.50;

// Declare variable
CString strMessage;
// Format strMessage.Format( _T("Name is %s, Age is %d, and salary is %.2f"), sName, nAge, nSalary);
// Then display. AfxMessageBox(strMessage);

What if this can be acheived by single statement:
AfxMessageBoxFormatted(_T("Name is %s, Age is %d, and salary is %.2f"), 
   sName, nAge, nSalary);
And here is implementation of AfxMessageBoxFormatted:
void AfxMessageBoxFormatted(LPCTSTR pFormatString, ...)
{
    va_list vl;
    va_start(vl, pFormatString);
CString strFormat; strFormat.FormatV(pFormatString, vl); // This Line is important!
// Display message box. AfxMessageBox(strFormat); }

If you don't you MFC, or don't want to use, you can implement MessageBoxFormatted as:
void MessageBoxFormatted(HWND hWnd, LPCTSTR pCaption, LPCTSTR pFormatString, ...)
{
    va_list vl;
    va_start(vl, pFormatString);
TCHAR strFormat[1024]; // Must ensure size!
// Generic version of vsprintf, works for both MBCS and Unicode builds _vstprintf(strFormat, pFormatString, vl);
// Or use following for more secure code // _vstprintf_s(strFormat, sizeof(strFormat), pFormatString, vl)
::MessageBox(hWnd, strFormat, pCaption,MB_ICONINFORMATION); }



And use it as:
MessageBoxFormatted(NULL,  // Or a valid HWND
    _T("Information"),
    _T("Name is %s, Age is %d, and salary is %.2f"),
    sName, nAge, nSalary);
If you don't understand stuff like TCHAR, LPCTSTR, _T, you better read this Tip/Trick: What are TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR etc?[^]