В этой статье мы разберём 3 метода браузера (объекта window
): alert
, prompt
и confirm
.
КАК вызывать и обрабатывать диалоговые окна?
До сих пор мы пользовались
только готовыми диалоговыми окнами: сообщениями об ошибке, информационными сообщениями,
предупреждениями и др. Их вызывала стандартная функция MessageDlg(), которую
к этому моменту мы успели уже вызубрить, как “Отче наш”. Всё остальное
– графический вывод, информацию пользователя мы выводили в главное окно приложения.
Это не всегда удобно, т.к. в крупных программах появляется постоянная необходимость
в перерисовке главного окна. Кроме того, получать данные через главное окно
и выводить результат туда же не всегда удаётся. Налицо дефицит свободного места.
Вы наверное, уже задавались вопросом как происходит обработка сообщений от диалоговых
окон, как получать через них данные и что с ними можно делать. Постараемся ответить
на все эти вопросы.
Создадим собственное диалоговое окно, в которое пользователю будет вежливо предложено
ввести данные. Пользователь вводит числа в поля ввода, нажимает кнопку, а программа
сама подставит эти числа в теорему Пифгора и выдаст ответ на экран.
Хотите попробовать? Создайте пустой проект Win32 API. Добавьте в него исходник-шаблон
первой программы.
Новые диалоговые окна, с которым мы будем работать, можно добавлять как новый
ресурс приложения, через insert->Resource, а можно набирать их текст вручную.
В файле RC для диалоговых окон припасено много тёплых слов.
Чем лучше набирать вручную? Вы знакомитесь с языком ресурсов и полностью контроллируете
процесс. Имейте в виду, что редактор ресурсов предназначен в первую очередь,
всё-таки для MFC приложений, поэтому в файл ресурсов будет автоматически включено
помимо нужной информации, масса констант и директив препроцессора. Из-за этого
он может некорректно работать с приложением Win32 API, вплоть до того, что вообще
не вызываться. Эта тема слабых мест Microsoft довольно болезнена и редко обсуждается.
Тем не менее, в любой книге по Win 32 API авторы приводят тексты RC файлов непохожие
на те, что генерирует редактор ресурсов. Мы рассмотрим оба способа.
Выберите следующие пункты меню: Insert->Resource->Dialog->New
для 6-й верссии. В 7-й версии это будет: Project->Add Resource->Dialog->New
.
Вот что должно получиться:
Итак, файл ресурсов описывает
и диалоговые окна. Все компоненты окна – кнопки, элементы управления и даже
статический текст, имеют свои идентификаторы, координаты в окне и номера, как
имеют их и элементы меню. Точно так же, как мы это делали для меню, мы должны
присвоить каждому элементу число, включая и само диалоговое окно IDD_PIFAGORUS.
#define IDD_PIFAGORUS
101
#define IDC_VALUE1 1000
#define IDC_VALUE2 1001
#define ID_EXIT 1002
#define ID_COUNT 1003
#define ID_CLEAR 1004
#define IDC_STATIC -1
#define IDM_ENTER 1005
#define IDM_EXIT 1006
//И небольшое такое меню
Директивы #define можно включать как в файл RC, так и в исходный текст программы
для того, чтобы не создавать третий файл – заголовочный, который обычно называют
resource.h. Вы можете в нём указать все ваши #define и включить на него ссылку
как в файле RC, так и в файле CPP:
#include “resource.h”
Итак, меню создано. Создано и диалоговое окно. Они появились во вкладке ресурсов:

Теперь поговорим об особенностях работы с диалоговыми окнами. Хотя у нас есть
меню и есть уже готовое окно, вызвать это окно из программы мы пока не умеем.
КАК вызвать с помощью строчки меню диалоговое окно?
Опишем поэтапно, после чего я приведу уже весь текст программы.
1. Для каждого окна нужная своя функция окна, поэтому в программу помимо WndProc
– функции главного окна, придётся включить PifProc() – функцию диалогового окна.
Аргументы у неё будут такие же, как и у WndProc:
BOOL CALLBACK PifProc(HWND, UINT, WPARAM, LPARAM);
2. В функции окна будет обработка по меньшей мере двух сообщеий: WM_INITDIALOG
– для главного окна мы не обрабатывали это сообщение, и сообщение WM_COMMAND,
аналогичное такому же сообщению главного окна. Оно будет обрабатывать сообщения
элементов управления диалога. Вот как это будет выглядеть:
case ID_COUNT: //Нажатие кнопки “Считать”
case ID_CLEAR: //Нажатие кнопки “Очистить”
case ID_EXIT: //Нажатие кнопки “Выход”
EndDialog(hdlg, LOWORD(wParam));
return TRUE;
break;
case IDM_ENTER:
DialogBox(hInst, (LPCTSTR)IDD_PIFAGORUS, hWnd, (DLGPROC)PifProc);
break;
Функция DialogBox()
выводит окно на экран. В этой функции мы указываем
идентификатор приложения hInst, идентификатор диалогового окна IDD_PIFAGORUS
(в большой программе может быть десяток диалогов, и чтобы вызвать нужный, надо
знать его идентификатор). Далее мы указываем идентфикатор окна-родителя hWnd
и функцию, которая будет обрабатывать все сообщения этого окна PifProc()
.
Окно не исчезнет до тех пор, пока не будет закрыто пользователем и не получит
сообщение WM_QUIT. Сообщение выхода генерируется функцией EndDialog()
,
которая закрывает диалоговое окно.
Теперь, когда понятен механизм, рассмотрим всю программу целиком. Ничего нового
в ней не будет.
//resource.h
#define IDD_PIFAGORUS 101
#define IDC_VALUE1 1000
#define IDC_VALUE2 1001
#define ID_EXIT 1002
#define ID_COUNT 1003
#define ID_CLEAR 1004
#define IDC_STATIC -1
#define IDM_ENTER 1005
#define IDM_EXIT 1006
#include
#include
#include
//Прототип функции главного
окна
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//Прототип функции диалогового окна
BOOL CALLBACK PifProc(HWND, UINT, WPARAM, LPARAM);
//Если не удалось зарегистрировать
класс окна – выходим
if(!RegisterClass(&w))
return 0;
//Создадим окно в памяти,
заполнив аргументы CreateWindow
hWnd=CreateWindow(szProgName,
“Теорема Пифагора”,
WS_OVERLAPPEDWINDOW,
100,
100,
500,
400,
(HWND)NULL,
(HMENU)NULL,
hInstance,
(LPSTR)NULL);
//Выводим окно из памяти
на экран
ShowWindow(hWnd, nCmdShow);
//Обновим содержимое окна
UpdateWindow(hWnd);
case ID_COUNT: //Кнопка “Cчитать”
GetDlgItemText(hdlg, IDC_VALUE1, str, 40);
a=atof(str);
GetDlgItemText(hdlg, IDC_VALUE2, str, 40);
b=atof(str);
c=sqrt(a*a+b*b);
gcvt(c, 10, str);
MessageBox(hdlg, str, “Ответ: “, 0);
break;
//Очистка полей ввода
case ID_CLEAR:
SetDlgItemText(hdlg, IDC_VALUE1, “”);
SetDlgItemText(hdlg, IDC_VALUE2, “”);
break;
//Закрытие окна
case ID_EXIT:
EndDialog(hdlg, LOWORD(wParam));
return TRUE;
break;
case WM_QUIT:
DestroyWindow(hdlg);
break;
default: return false;
}
case IDM_ENTER:
DialogBox(hInst, (LPCTSTR)IDD_PIFAGORUS, hWnd, PifProc);
break;
//Выход из программы
case IDM_EXIT:
DestroyWindow(hWnd);
break;
}
break;
//Вывод строки на экран
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
SetTextColor(hdc, RGB(255,255,0));
SetBkMode(hdc, TRANSPARENT);
TextOut(hdc, 10,10, szMessage, strlen(szMessage));
ValidateRect(hWnd, NULL);
EndPaint(hWnd, &ps);
break;
//Завершение работы
окна
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, messg, wParam, lParam));
}
return 0;
}
Как видите, даже небольшая
программа на API приводит к разрастанию исходного текста. За это многие не любят
API и предпочитают библиотеки классов MFC и VCL. До классов мы ещё доберёмся,
а пока поразмышляем, как работает программа.
Как создавать дилаоги мы уже разобрались. Как вызывать их из меню, вроде бы
тоже. Мы написали для диалогового окна свою функцию обработки сообщений. Теперь
самое главное понять, как программа узнала что мы ввели в поля ввода.
Поэтому для нас представляют интерес функции GetDlgItemText()
и SetDlgItemText()
.
Функция GetDlgItemText получает текст из любого элемента управления. Причём
ей совсем неважно кнопка это, поле ввода или статическая метка. Главное – указать
идентификатор. Синтаксис у неё такой:
UINT GetDlgItemText(HWND hdlg, int IDC_VALUE, LPSTR str, int maxcol);
hdlg – идентификатор окна диалога
IDC_VALUE – идентификатор поля ввода, из которого получаем данные
str – строка, в которую помещаем текст
maxcol – длина строки (массива символов)
Функция хороша тем, что позволяет считывать любые данные из поля ввода – строки,
целые и дробные числа. Изначально данные будут представлены, как строки, но
используя функции конвертирования всегда можно преобразовать их в целые и дробные
числа. Для ввода целых чисел правда есть ещё функция GetDlgItemInt()
,
но в математических программах она используется редко.
Обратная по значению функция SetDlgItemText()
, которая может записать
в поле ввода любую строку. Это может быть ответ решения, значение по умолчанию,
фраза-приглашение и др. Синтаксис у неё аналогичен.
SetDlgItemText(HWND hdlg, int IDC_EDIT, LPSTR str);
Кстати говоря, с помощью
SetDlgItemText
вы сможете менять текст и на кнопках и в текстовых метках.
Главное – указать правильно идентификатор.
Вы видите, какая громоздкая
получается программа, когда в ней есть диалоговые окна. И функцию свою этому
окну надо создавать и свой цикл обработки сообщений. Это очень неудобно, а самое
главное (действительно, кого интересуют неудобства какого-то программиста) это
замедляет скорость создания программ. В условиях современного рынка программы
нужно создавать быстро. Слова быстро и API-программа почти несовместимы.
Подытожим. В этой главе мы укрепили навыки работы с меню, научились смело вызывать
диалоговые окна и начуились всему, что может потребоваться в отношении полей
ввода. Теперь написать простенькую математическую программу для нас не проблема.
Задание 1:
Добавьте к этой программе окно “О программе”, в котором
будет информация о вас, как о создателе. Пусть окно это вызывается из пункта
меню “Помощь”-“О программе”. В окне можно разместить свою
фотографию, переместив на него компонент Picture из редактора ресурсов. Разобраться
с этим компонентом я предлагаю вам самим.
Задание 3:
Ещё немного математики. Вычисляем формулу квадратного уравнения:
a*x*x+b*x+c=0. Вводим через поля ввода a,b,c. Программа считает x1, x2, ответ
выводится на экран, причём надо предусмотреть случаи, когда дискриминант <
0 и = 0. Вот математика этой задачи:
d=b*b-4*a*c. Если d=0, то х будет всего один, если d<0, то решений нет.
x1=-b+sqrt(b*b-4*a*c)/2*a
x2=-b-sqrt(b*b-4*a*c)/2*a
Часто техническому человеку приходится заниматься кое-какими вычислениями в
этой жизни. Как правило, многие формулы приходится использовать снова и снова
– например расчёт делителей напряжения, равнодействующей сил или закон Ома.
Чтобы облегчить себе жизнь, вы можете написать программу-уникум, в которой есть
диалоговые окна для всех вычислений, встречающихся в вашей жизни. Это будет
хорошей практикой!
И ещё. В дальнейшем, когда
мы будем проходить элементы управления пользовательского интерфейса, я иногда
буду давать вам не исходники целиком, а только функции окон. Вам нужно будет
самим прописывать в пункты меню вызов диалогового окна и вставлять функцию этого
окна. Так вы быстрее запомните, как добавлять в проект новые окна. Это будет
хорошим подспорьем к дальнейшей вашей деятельности. Когда вам нужно будет вставить
в проект новое окно, это будет вызывать у вас не зубную боль, а радость и ликование
ещё раз доказать себе свой профессионализм. Поэтому ещё раз настоятельно рекомендую
вам выполнять все домашние задания.
Назад
Главная
Вперёд
Метод prompt()
Метод prompt()
предназначен для вывода диалогового окна с сообщением, текстовым полем для
ввода данных и кнопками «ОК» и «Отмена». Это окно предназначено для запроса данных, которые пользователю нужно ввести
в текстовое поле.
// message - текст сообщения (является не обязательным), предназначено для информирования пользователя о том, какие данные у него запрашиваются
// default - начальное значение для поля ввода, которое будет по умолчанию в нём отображаться (является не обязательным)
const result = prompt(message, default); В переменную result
возвращается значение введённое пользователем или null
. Если пользователь не ввёл данные (поле ввода пустое) и нажал на «ОК», то в result
будет находиться пустая строка.
Например, запросим имя пользователя при входе его на сайт с помощью prompt, а затем выведем его в элемент #welcome
:
<div id="welcome"></div>
<script>
const name = prompt('Пожалуйста, представьтесь?');
if (name) { document.querySelector('#welcome').innerHTML = `<b>${name}</b>, добро пожаловать на сайт!`;
} else { document.querySelector('#welcome').innerHTML = '<b>Гость</b>, добро пожаловать на сайт!';
}
</script> 
Создание диалогового окна¶
Диалоговые окна, как элементы графического интерфейса, предназначены для вывода сообщений пользователю, получения от него какой-либо информации, а также управления.
Создадим свое диалоговое окно. Для примера оно создается используя несколько виджетов:
"Message box title" "My message content!"

Мы получили простейшее диалоговое окно, и хотя диалоговые окна весьма разнообразны, их вид уже устоялся.
Нет необходимости создавать диалоговые окна с нуля, для это можно использовать «заготовки».
Окна открытия и сохранения файлов¶
Рассмотрим, как запрограммировать с помощью Tkinter вызов диалоговых окон открытия и сохранения файлов и работу с ними. При этом требуется дополнительно импортировать «подмодуль» Tkinter – tkinter.filedialog, в котором описаны классы для окон данного типа:
Метод alert()
Функция alert()
предназначена для вывода в браузере предупреждающего модального диалогового окна с некоторым сообщением и кнопкой «ОК»
. При его появлении дальнейшее выполнение кода страницы прекращается
до тех пор, пока пользователь не закроет это окно. Кроме этого, оно также блокирует возможность взаимодействия пользователя с остальной частью страницы. Применение этого окна в основном используется для вывода некоторых данных при изучении языка JavaScript, в реальных проектах команда alert()
не используется.
Синтаксис метода alert()
:
// message - текст сообщения
alert(message); Метод alert()
имеет один аргумент ( message
) – текст сообщения,
которое необходимо вывести в модальном диалоговом окне. В качестве результата alert()
ничего
не возвращает.
Например, выведем при клике в диалоговое окно alert координаты курсора:
// es6
document.addEventListener('click', (e) => {
alert(`Координаты: (${e.clientX},${e.clientY})`);
});
// es5
document.addEventListener('click', function (e) {
alert('Координаты: (' + e.clientX + ',' + e.clientY + ')');
}); 
Если alert сообщение нужно вывести на нескольких строках, то в этом случае следует воспользоваться «символом перевода строки», который в JavaScript записывается как \n
:
// перенос строки в alert
alert('Строка 1\nСтрока 2'); Примеры
1. Использование методов prompt
и alert
для создания игры «Угадай число»?
<script>
// число, которое нужно угадать, в данном случае 7
const number = 7;
let result = false;
while (!result) { const answer = prompt('Угадай число от 1 до 10?'); if (answer === null) { break; } switch (+answer) { case number - 2: case number + 2: alert('Уже теплее!'); break; case number - 1: case number + 1: alert('Горячо!'); break; case number: alert('Ты угадал! Это число {$number}.'); result = true; break; default: alert('Холодно!'); }
}
</script> 
Диалоговые окна
Последнее обновление: 21.03.2016
WPF поддерживает возможность создания модальных диалоговых окон. При вызове модальное окно блокирует доступ к родительскому окну, пока пользователь
не закроет модальное окно.
Для работы добавим в проект новое окно, которое назовем . Это окно будет выполнять роль модального.
Изменим интерфейс PasswordWindow:
<Window x:Class="WindowApp. PasswordWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WindowApp" mc:Ignorable="d" Title="Авторизация" SizeToContent="WidthAndHeight" WindowStartupLocation="CenterScreen"> <Grid Margin="10"> <Grid. RowDefinitions> <RowDefinition Height="20" /> <RowDefinition Height="20" /> <RowDefinition Height="Auto" /> </Grid. RowDefinitions> <TextBlock>Введите пароль:</TextBlock> <TextBox Name="passwordBox" Grid. Row="1" MinWidth="250">Пароль</TextBox> <WrapPanel Grid. Row="2" HorizontalAlignment="Right" Margin="0,15,0,0"> <Button IsDefault="True" Click="Accept_Click" MinWidth="60" Margin="0,0,10,0">OK</Button> <Button IsCancel="True" MinWidth="60">Отмена</Button> </WrapPanel> </Grid> </Window>
Здесь определено текстовое поле для ввода пароля и две кнопки. Вторая кнопка с атрибутом IsCancel="True"
будет выполнять роль отмены.
А первая кнопка будет подтверждать ввод.
Для подтверждения ввода и успешного выхода из модального окна определим в файле кода PasswordWindow определим обработчик первой кнопки Accept_Click:
using System. Windows;
namespace WindowApp
{ public partial class PasswordWindow : Window { public PasswordWindow() { InitializeComponent(); } private void Accept_Click(object sender, RoutedEventArgs e) { this. DialogResult = true; } public string Password { get { return passwordBox. Text; } } }
} Для успешного выхода из модального диалогового окна нам надо для свойства установить значение true
. Для
второй кнопки необязательно определять обработчик, так как у нее установлен атрибут IsCancel="True"
, следовательно, ее нажатие будет эквивалентно
результату this.DialogResult = false;
. Этот же результат будет при закрытии диалогового окна на крестик.
Кроме того, здесь определяется свойство Password
, через которое мы можем извне получить введенный пароль.
И изменим главную форму MainWindow, чтобы из нее запускать диалоговое окно. Во-первых, определим кнопку:
<Window x:Class="WindowApp. MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WindowApp" mc:Ignorable="d" Title="MainWindow" Height="250" Width="300"> <Grid> <Button Width="100" Height="30" Content="Авторизация" Click="Login_Click" /> </Grid> </Window>
И определим обработчик для этой кнопки:
private void Login_Click(object sender, RoutedEventArgs e)
{ PasswordWindow passwordWindow = new PasswordWindow(); if(passwordWindow. ShowDialog()==true) { if(passwordWindow. Password=="12345678") MessageBox. Show("Авторизация пройдена"); else MessageBox. Show("Неверный пароль"); } else { MessageBox. Show("Авторизация не пройдена"); }
} В итоге при нажатии на кнопку будет отображаться следующее диалоговое окно:

И в зависимости от результатов ввода будет отображаться то или иное сообщение.
Messagebox – окно с информацией¶
Для информирования пользователя о процессах происходящих в ПК можно использовать Messagebox – окно с информацией. При этом
требуется дополнительно импортировать «подмодуль» Tkinter – tkinter messagbox, в котором описаны классы для окон данного типа.
Код созданного информационного окна может быть следующим:
'Message info content'

Для привлечения внимания можно использовать окно предупреждения:
'Message warning title' 'Message warning content' #shows warning message

Окно с возникшей ошибкой ПО думаю встречал каждый, на питоне его можно создать, написав следующий код:
'Message error title' 'Message error content' #shows error message

Метод confirm()
Метод confirm()
объекта window
применяется для вывода модального
диалогового окна с сообщением и кнопками «ОК» и «Отмена». Оно обычно используется для запроса у пользователя
разрешения на выполнение того или иного действия.
Синтаксис метода confirm()
:
// question - текст сообщения (вопроса)
const result = confirm(question); В переменную result
возвращается:
-
true
– если пользователь нажал на кнопку «ОК»; -
false
– в остальных случаях.
Например, выведем в элемент #result
текст в зависимости то того на какую кнопку нажал
пользователь в диалоговом окне confirm:
<div id="result"></div>
<script>
// es6
const result = confirm('Вам нравится JavaScript?');
if (result) {
document.querySelector('#result').textContent = 'Вы ответили, что Вам нравится JavaScript';
} else {
document.querySelector('#result').textContent = 'Вы ответили, что Вам не нравится JavaScript';
}
</script> 
Messagebox – окно с вопросом¶
'Message ask content' 'Message y/n content' 'Message y/n/cancel content' 'Message ok/cancel content' 'Message retry/cancel content'
Итого
В этой статье мы рассмотрели 3 функции браузера: alert
, prompt
и
confirm
. Они предназначены для взаимодействия с пользователем. Диалоговые окна создаваемые
этими методами являются модальными. Это значит, что они блокируют доступ пользователя к остальной части страницы пока
оно не будет закрыто. Кроме этого, они ещё приостанавливают загрузку дальнейшей части страницы. По этим причинам, их
имеет смысл использовать в скриптах только при изучении JavaScript, чтобы запросить или вывести некоторую информацию
на экран. В настоящих проектах они обычно не используются.
Ещё одно ограничение при использовании этих окон связано с тем, что их расположение и оформление определяется
браузером. Как-то изменить или настроить это нельзя.




