332 lines
7.7 KiB
C++
332 lines
7.7 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1997 - 1999
|
|
//
|
|
// File: msgbox.cpp
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include "pch.h"
|
|
#pragma hdrstop
|
|
|
|
#include "msgbox.h"
|
|
|
|
|
|
//
|
|
// Helper to report system errors.
|
|
// Merely ensures a little consistency with respect to message box
|
|
// flags.
|
|
//
|
|
// Example:
|
|
//
|
|
// CscWin32Message(hwndMain,
|
|
// ERROR_NOT_ENOUGH_MEMORY,
|
|
// CSCUI::SEV_ERROR);
|
|
//
|
|
INT
|
|
CscWin32Message(
|
|
HWND hwndParent,
|
|
DWORD dwError, // From GetLastError().
|
|
CSCUI::Severity severity
|
|
)
|
|
{
|
|
UINT uType = MB_OK;
|
|
|
|
switch(severity)
|
|
{
|
|
case CSCUI::SEV_ERROR:
|
|
uType |= MB_ICONERROR;
|
|
break;
|
|
case CSCUI::SEV_WARNING:
|
|
uType |= MB_ICONWARNING;
|
|
break;
|
|
case CSCUI::SEV_INFORMATION:
|
|
uType |= MB_ICONINFORMATION;
|
|
break;
|
|
default: break;
|
|
}
|
|
|
|
return CscMessageBox(hwndParent, uType, Win32Error(dwError));
|
|
}
|
|
|
|
|
|
INT
|
|
CscMBLoadString(
|
|
HINSTANCE hInstance,
|
|
UINT idStr,
|
|
LPTSTR *ppszOut
|
|
)
|
|
{
|
|
int cch = 0;
|
|
TCHAR szBuffer[MAX_PATH];
|
|
int cchResource = SizeofStringResource(hInstance, idStr);
|
|
if (0 < cchResource)
|
|
{
|
|
cchResource++; // Add for nul term.
|
|
*ppszOut = (LPTSTR)LocalAlloc(LMEM_FIXED, cchResource * sizeof(TCHAR));
|
|
if (NULL != *ppszOut)
|
|
{
|
|
cch = LoadString(hInstance, idStr, *ppszOut, cchResource);
|
|
if (0 == cch)
|
|
{
|
|
LocalFree(*ppszOut);
|
|
*ppszOut = NULL;
|
|
}
|
|
}
|
|
}
|
|
return cch;
|
|
}
|
|
|
|
|
|
INT
|
|
CscMBFormatMessage(
|
|
HINSTANCE hInstance,
|
|
UINT idStr,
|
|
LPTSTR *ppszOut,
|
|
va_list *pargs
|
|
)
|
|
{
|
|
INT iResult = -1;
|
|
LPTSTR pszFmt = NULL;
|
|
int cchLoaded = CscMBLoadString(hInstance, idStr, &pszFmt);
|
|
if (0 == cchLoaded)
|
|
{
|
|
TraceMsg("String resource error");
|
|
throw "resource error"; // Don't want to return a value.
|
|
}
|
|
|
|
cchLoaded = ::FormatMessage(FORMAT_MESSAGE_FROM_STRING |
|
|
FORMAT_MESSAGE_ALLOCATE_BUFFER,
|
|
pszFmt,
|
|
0,
|
|
0,
|
|
(LPTSTR)ppszOut,
|
|
1,
|
|
pargs);
|
|
LocalFree(pszFmt);
|
|
return cchLoaded;
|
|
}
|
|
|
|
//
|
|
// Display a system error message in a message box.
|
|
// The Win32Error class was created to eliminate any signature ambiguities
|
|
// with the other versions of CscMessageBox.
|
|
//
|
|
// Example:
|
|
//
|
|
// CscMessageBox(hwndMain,
|
|
// MB_OK | MB_ICONERROR,
|
|
// Win32Error(ERROR_NOT_ENOUGH_MEMORY));
|
|
//
|
|
INT
|
|
CscMessageBox(
|
|
HWND hwndParent,
|
|
UINT uType,
|
|
const Win32Error& error
|
|
)
|
|
{
|
|
INT iResult = -1;
|
|
LPTSTR pszBuffer = NULL;
|
|
INT cchLoaded = ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
|
|
FORMAT_MESSAGE_ALLOCATE_BUFFER,
|
|
NULL,
|
|
error.Code(),
|
|
0,
|
|
(LPTSTR)&pszBuffer,
|
|
1,
|
|
NULL);
|
|
|
|
if (0 == cchLoaded)
|
|
{
|
|
TraceMsg("String resource error");
|
|
throw "resource error"; // Don't want to return a value.
|
|
}
|
|
if (NULL != pszBuffer)
|
|
{
|
|
iResult = CscMessageBox(hwndParent, uType, pszBuffer);
|
|
LocalFree(pszBuffer);
|
|
}
|
|
return iResult;
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Display a system error message in a message box with additional
|
|
// text.
|
|
//
|
|
// Example:
|
|
//
|
|
// CscMessageBox(hwndMain,
|
|
// MB_OK | MB_ICONERROR,
|
|
// Win32Error(ERROR_NOT_ENOUGH_MEMORY),
|
|
// IDS_FMT_LOADINGFILE,
|
|
// pszFile);
|
|
//
|
|
INT
|
|
CscMessageBox(
|
|
HWND hwndParent,
|
|
UINT uType,
|
|
const Win32Error& error,
|
|
LPCTSTR pszMsgText
|
|
)
|
|
{
|
|
INT iResult = -1;
|
|
int cchMsg = lstrlen(pszMsgText);
|
|
LPTSTR pszBuffer = (LPTSTR)LocalAlloc(LMEM_FIXED, (cchMsg + MAX_PATH) * sizeof(TCHAR));
|
|
if (NULL != pszBuffer)
|
|
{
|
|
lstrcpy(pszBuffer, pszMsgText);
|
|
*(pszBuffer + cchMsg++) = TEXT('\n');
|
|
*(pszBuffer + cchMsg++) = TEXT('\n');
|
|
int cchLoaded = ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
|
|
NULL,
|
|
error.Code(),
|
|
0,
|
|
pszBuffer + cchMsg,
|
|
MAX_PATH - 2, // 2 for newlines.
|
|
NULL);
|
|
if (0 != cchLoaded)
|
|
{
|
|
iResult = CscMessageBox(hwndParent, uType, pszBuffer);
|
|
}
|
|
LocalFree(pszBuffer);
|
|
}
|
|
return iResult;
|
|
}
|
|
|
|
|
|
INT
|
|
CscMessageBox(
|
|
HWND hwndParent,
|
|
UINT uType,
|
|
const Win32Error& error,
|
|
HINSTANCE hInstance,
|
|
UINT idMsgText,
|
|
va_list *pargs
|
|
)
|
|
{
|
|
INT iResult = -1;
|
|
LPTSTR pszBuffer = NULL;
|
|
int cchLoaded = CscMBFormatMessage(hInstance,
|
|
idMsgText,
|
|
&pszBuffer,
|
|
pargs);
|
|
if (0 == cchLoaded)
|
|
{
|
|
TraceMsg("String resource error");
|
|
throw "resource error"; // Don't want to return a value.
|
|
}
|
|
|
|
iResult = CscMessageBox(hwndParent, uType, error, pszBuffer);
|
|
LocalFree(pszBuffer);
|
|
return iResult;
|
|
}
|
|
|
|
|
|
INT
|
|
CscMessageBox(
|
|
HWND hwndParent,
|
|
UINT uType,
|
|
const Win32Error& error,
|
|
HINSTANCE hInstance,
|
|
UINT idMsgText,
|
|
...
|
|
)
|
|
{
|
|
INT iResult = -1;
|
|
va_list args;
|
|
va_start(args, idMsgText);
|
|
iResult = CscMessageBox(hwndParent, uType, error, hInstance, idMsgText, &args);
|
|
va_end(args);
|
|
return iResult;
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Example:
|
|
//
|
|
// CscMessageBox(hwndMain,
|
|
// MB_OK | MB_ICONWARNING,
|
|
// TEXT("File %1 could not be deleted"), pszFilename);
|
|
//
|
|
INT
|
|
CscMessageBox(
|
|
HWND hwndParent,
|
|
UINT uType,
|
|
HINSTANCE hInstance,
|
|
UINT idMsgText,
|
|
va_list *pargs
|
|
)
|
|
{
|
|
INT iResult = -1;
|
|
LPTSTR pszFmt = NULL;
|
|
int cchLoaded = CscMBLoadString(hInstance, idMsgText, &pszFmt);
|
|
if (0 == cchLoaded)
|
|
{
|
|
TraceMsg("String resource error");
|
|
throw "resource error"; // Don't want to return a value.
|
|
}
|
|
|
|
LPTSTR pszMsg = NULL;
|
|
cchLoaded = ::FormatMessage(FORMAT_MESSAGE_FROM_STRING |
|
|
FORMAT_MESSAGE_ALLOCATE_BUFFER,
|
|
pszFmt,
|
|
0,
|
|
0,
|
|
(LPTSTR)&pszMsg,
|
|
1,
|
|
pargs);
|
|
LocalFree(pszFmt);
|
|
if (0 == cchLoaded)
|
|
{
|
|
TraceMsg("String resource error");
|
|
throw "resource error"; // Don't want to return a value.
|
|
}
|
|
|
|
iResult = CscMessageBox(hwndParent, uType, pszMsg);
|
|
LocalFree(pszMsg);
|
|
return iResult;
|
|
}
|
|
|
|
|
|
INT
|
|
CscMessageBox(
|
|
HWND hwndParent,
|
|
UINT uType,
|
|
HINSTANCE hInstance,
|
|
UINT idMsgText,
|
|
...
|
|
)
|
|
{
|
|
INT iResult = -1;
|
|
va_list args;
|
|
va_start(args, idMsgText);
|
|
iResult = CscMessageBox(hwndParent, uType, hInstance, idMsgText, &args);
|
|
va_end(args);
|
|
return iResult;
|
|
}
|
|
|
|
|
|
//
|
|
// All of the other variations of CscMessageBox() end up calling this one.
|
|
//
|
|
INT
|
|
CscMessageBox(
|
|
HWND hwndParent,
|
|
UINT uType,
|
|
LPCTSTR pszMsgText
|
|
)
|
|
{
|
|
|
|
TCHAR szCaption[80] = { TEXT('\0') };
|
|
LoadString(g_hInstance, IDS_APPLICATION, szCaption, ARRAYSIZE(szCaption));
|
|
|
|
return MessageBox(hwndParent, pszMsgText, szCaption, uType);
|
|
}
|
|
|
|
|