Как создать нестандартное окно сообщения

{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-

Добавить комментарий