Как создать нестандартное окно сообщения
{codecitation class=»brush: pascal; gutter: false;» width=»600px»}
Оформил: DeeCo
Автор: Paul Bludov
Введение
Окна сообщения (Message Box) – это стандартные диалоговые окна, используемые в программах для информирования пользователя, предупреждения или уточнения его желаний. Типичное окно сообщения выглядит так:
Рисунок 1. Типичное окно собщения.
Для вывода окна сообщения служит функция Windows API ::MessageBox().
intMessageBox
(HWNDhWnd,
LPCTSTRlpText,
LPCTSTRlpCaption,
UINTuType
);
Параметр hWnd – это родительское окно. Как правило, это главное окно приложения. Если приложение не имеет окон (например, консольное приложение), этот параметр может быть равен NULL.
Параметр lpText – это собственно текст сообщения.
Параметр lpCaption – это заголовок окна сообщения. Если он равен NULL, используется строка «Ошибка».
Параметр uType задает количество кнопок и другие параметры окна сообщения. С его помощью можно задать иконку слева от текста и такие свойства окна, как модальность (modality).
К сожалению, этого иногда оказывается недостаточно. Например, нужна возможность подавления сообщения в будущем, что-то вроде:
Рисунок 2. Окно сообщения с ‘галочкой’.
Как же расширить возможности этой функции?
Нестандартное окно сообщения Способ №1: диалоговое окно
Первое, что приходит на ум – создать диалоговое окно, и расставить на нем все нужные кнопки. Это наиболее простой способ.
INT_PTR CALLBACK _CustomDialogProc
(HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
if (WM_COMMAND == uMsg)
::EndDialog(hwndDlg, LOWORD(wParam));
return FALSE;
}
int nRet = : : DialogBoxParam(hInstance, MAKEINTRESOURCE(ID_CUSTOMDIALOG),
NULL, _CustomDialogProc, 0);
Но, к сожалению, это и наиболее трудоемкий способ. Все эти диалоги нужно сначала нарисовать. Кроме того, каждое из таких «неуниверсальных» диалоговых окон увеличивает размер программы.
Способ №2: универсальное диалоговое окно
Если программе нужно выводить большое количество сообщений, и ::MessageBox() по каким-либо причинам не подходит, можно написать свой аналог.
Для этого понадобится заготовка – небольшой диалог со всеми кнопками, которые могут понадобиться, и двумя полями для текста и иконки, плюс немного кода, чтобы «спрятать» лишние кнопки и настроить текстовое поле и иконку.
Листинг 1. Код инициализации диалога
LRESULT _CustomMessageBoxInit(HWND hwndDlg, _SCustomMessageBoxParam * pInit)
{
// Расстояние между кнопками, а также бордюр
const int nBorder = 11;
UINT uType = pInit-