Московский инженерно-физический институт
Вид материала | Практикум |
СодержаниеСписок в диалоговом окне Окно редактирования и статический элемент управления EDIT, стиль WSBORDER |
- Ю. С. Барсуков 1, А. Ю. Окунев 2 1 Московский инженерно-физический институт (государственный, 29.25kb.
- В. А. Курнаев Московский инженерно-физический институт (государственный университет),, 27.18kb.
- «Вегето-сосудистая дистония», 192.12kb.
- Перечен ь научных разделов и базовых вузов по научным разделам открытого конкурса, 247.02kb.
- Д. В. Гуцко Московский инженерно-физический институт (государственный университет), 34.47kb.
- В. А. Тумольский московский инженерно-физический институт (государственный университет), 27.44kb.
- К. С. Чистов Московский инженерно-физический институт (государственный университет), 24.11kb.
- Вдокладе рассматривается задача оценки рисков инвестиционных проектов электростанций, 29.4kb.
- Резюме Луценко Владимир Юрьевич, 22.32kb.
- Л. Ю. Грецкая московский инженерно-физический институт (государственный университет), 26.28kb.
Список в диалоговом окне
Список (элемент управления класса LISTBOX) удобен тем, что позволяет отображать большие массивы числовой или символьной информации, а также выполнять над этими массивами такие действия, как просмотр всех элементов с помощью линейки прокрутки, добавление и удаление отдельных элементов, упорядочение, выборка элемента с заданным номером и др. Список, в частности, удобно использовать в простых приложениях без главного окна для наблюдения результатов вычислений, если эти результаты представляют собой массивы чисел или коротких строк.
Рассмотрим фрагменты программы 4-4, в которой список, включенный в диалоговое окно, заполняется числовой информацией, конкретно, массивом значений функции e-x (рис. 4.5).

Рис. 4.5. Список в диалоговом окне
/*Пример 4-4. Заполнение списка */
/*Файл 4-4.RC*/
#include "4-4.h"
Dlg DIALOG 20, 20, 100, 108
STYLE WS_SYSMENU
CAPTION "Функции" {
CONTROL,"Экспонента", -1,"STATIC",SS_LEFT, 10,3,120,10
CONTROL "", ID_1, "LISTBOX",WS_VSCROLL | WS_BORDER,
10, 15, 84, 41
}
/*Файл 4-4.CPP*/
BOOL DlgOnInitDialog(HWND hwnd,HWND,LPARAM){
char str[20];
for (float x=0;x<5;x+=0.01){
sprintf(str,"%f %f",x,exp(-x));
SendDlgItemMessage(hwnd, ID_1, LB_ADDSTRING, 0,
(LPARAM)str);
}
return TRUE;
В файле ресурсов 4-4.RC описываются два элемента управления – статический элемент, т. е. в данном случае просто текст (слово "Экспонента"), используемый в качестве заголовка списка, и сам список (элемент класса LISTBOX), которому присвоен идентификатор ID1 (определенный, разумеется, в файле 4-4.H). Статическому элементу присвоен идентификатор -1, поскольку он заполняется текстом непосредственно в файле ресурсов, а программа с ним взаимодействовать не будет. Для списка указано сочетание констант стиля WS_VSCROLL и WS_BORDER, чтобы придать списку рамку и линейку вертикальной прокрутки. Список выступает в качестве главного окна приложения и создается в функции WinMain() вызовом функции DialogBox(). Заполняется список в функции DlgOnInitDialog(), вызываемой при приходе в приложение сообщения WMINITDIALOG. Заполнение списка осуществляется в цикле, в каждом шаге которого сначала с помощью функции sprintf() формируется очередная символьная строка (аргумент x функции exp(-x) и само значение этой функции), а затем с помощью функции SendDlgItemMessage() в элемент с идентификатором ID1, т. е. в список посылается сообщение LBADDSTRING о добавлении строки с указанием имени добавляемой строки str. Как видно из текста программы, параметр wParam для сообщения LB_ADDSTRING должен быть равен 0.
С помощью функции SendDlgItemMessage() в список можно посылать и другие сообщения. Так, сообщение LBSETCURSEL позволяет выделить цветом требуемую строку списка; это сообщение можно использовать для начальной установки состояния списка. При щелчке мышью по той или иной строке списка она выделяется цветом; для получения номера этой выделенной строки предусмотрено сообщение LBGETCURSEL. С помощью сообщения LBDELETESTRING заданная строка удаляется из списка (чтобы очистить весь список, это сообщение следует поместить в цикл). Сообщение LBGETCOUNT возвращает число строк в списке, а сообщение LBFINDSTRING позволяет найти в списке строку с указанным сочетанием символов. Всего для обслуживания списка предусмотрено около четырех десятков различных сообщений.
Окно редактирования и статический элемент
управления
Создадим на базе диалогового окна простенький калькулятор, который будет вычислять, например, значение синуса для вводимого с клавиатуры значения аргумента, задаваемого в градусах. Для ввода аргумента используем элемент управления – окно редактирования (называемое иногда окном ввода), а для вывода значения функции – статический элемент управления, т. е. просто текстовую строку. Вывод этой программы приведен на рис. 4.6. Как видно из рисунка, диалоговое окно, как и в предыдущей программе, выступает в качестве главного окна приложения.

Рис. 4.6. Окно редактирования и статический элемент управления
/*Пример 4-5. Окно редактирования и статический элемент */
/*Файл 4-5.RC*/
#include "4-5.h"
Dlg DIALOG 20, 20, 96, 39
STYLE WS_CAPTION | WS_SYSMENU
CAPTION "Значения синуса" {
CONTROL "", ID_INPUT, "EDIT", WS_BORDER, 6, 4, 84, 10
CONTROL "", ID_RES, "STATIC", SS_LEFT, 6, 24, 58, 10
}
/*Файл 4-5.CPP*/
#include
#include
#include
#include
#include "4-5.h"
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int){
DialogBox(hInst,"Dlg",NULL,DlgProc);
return 0;
}
BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM
wParam,LPARAM lParam){
switch(msg){
HANDLE_MSG(hwnd,WM_COMMAND,DlgOnCommand);
default:
return FALSE;
}
}
void DlgOnCommand(HWND hwnd,int id,HWND,UINT){
char str[20];
float arg;
if(id==ID_INPUT){
GetDlgItemText(hwnd,ID_INPUT,str,19);
arg=atoi(str)*M_PI/180;
float y=sin(arg);
sprintf(str,"%f",y);
SetDlgItemText(hwnd,ID_RES,str);
}
if(id==IDCANCEL)
EndDialog(hwnd,0);
}
В файле ресурсов описывается состав модального диалогового окна: окно редактирования (класс EDIT, стиль WSBORDER, чтобы у окна была рамка) и статический элемент (класс STATIC, стиль SSLEFT, позиционирующий текст влево). Идентификаторы элементов управления, как и всегда, определены в файле 4-5.H.
В оконной функции диалога DlgProc() обрабатывается единственное сообщение WMCOMMAND, которое поступает в приложение при вводе текста в окно редактирования, а также при нажатии кнопки

При вводе в окно ввода каждой цифры аргумента управление передается на блок, следующий за оператором if (id == IDINPUT). Здесь последовательно выполняется несколько операций. Прежде всего текст, введенный в окно редактирования, с помощью функции GetDlgItemText() копируется в символьную строку str. Полученная строка с помощью функции atoi() преобразуется в целое число, которое в этом же предложении умножением на π (константа MPI) и делением на 180 переводится в число радианов (что требуется для функции sin()). Далее вычисляется значение синуса (переменная y), и полученное число функцией sprintf() помещается в ту же строку str. Наконец, с помощью функции SetDlgItemText() строка str копируется в статический элемент управления (идентификатор IDRES).
Стоит заметить, что в отличие от примера 4-2, статический элемент управления заполняется текстом не однократно на этапе создания диалога, а динамически по ходу взаимодействия пользователя с диалоговым окном. Пользователь может многократно вводить в окно редактирования новые данные и получать соответствующий результат вычислений.