Московский инженерно-физический институт

Вид материалаПрактикум

Содержание


Список в диалоговом окне
Окно редактирования и статический элемент управления
EDIT, стиль WSBORDER
Подобный материал:
1   ...   16   17   18   19   20   21   22   23   24

Список в диалоговом окне


Список (элемент управления класса 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), которому присвоен идентификатор ID1 (определенный, разумеется, в файле 4-4.H). Статическому элементу присвоен идентификатор -1, поскольку он заполняется текстом непосредственно в файле ресурсов, а программа с ним взаимодействовать не будет. Для списка указано сочетание констант стиля WS_VSCROLL и WS_BORDER, чтобы придать списку рамку и линейку вертикальной прокрутки. Список выступает в качестве главного окна приложения и создается в функции WinMain() вызовом функции DialogBox(). Заполняется список в функции DlgOnInitDialog(), вызываемой при приходе в приложение сообщения WMINITDIALOG. Заполнение списка осуществляется в цикле, в каждом шаге которого сначала с помощью функции sprintf() формируется очередная символьная строка (аргумент x функции exp(-x) и само значение этой функции), а затем с помощью функции SendDlgItemMessage() в элемент с идентификатором ID1, т. е. в список посылается сообщение LBADD­STRING о добавлении строки с указанием имени добавляемой строки str. Как видно из текста программы, параметр wParam для сообщения LB_ADDSTRING должен быть равен 0.

С помощью функции SendDlgItemMessage() в список мож­но посылать и другие сообщения. Так, сообщение LBSETCURSEL позволяет выделить цветом требуемую строку списка; это сообщение можно использовать для начальной установки состояния списка. При щелчке мышью по той или иной строке списка она выделяется цветом; для получения номера этой выделенной строки предусмотрено сообщение LBGETCURSEL. С помощью сообщения LBDELETESTRING заданная строка удаляется из списка (чтобы очистить весь список, это сообщение следует поместить в цикл). Сообщение LBGETCOUNT возвращает число строк в списке, а сообщение LBFINDSTRING позволяет найти в списке строку с указанным сочетанием символов. Всего для обслуживания списка предусмотрено около четырех десятков различных сообщений.

Окно редактирования и статический элемент
управления


Создадим на базе диалогового окна простенький калькулятор, который будет вычислять, например, значение синуса для вводимого с клавиатуры значения аргумента, задаваемого в градусах. Для ввода аргумента используем элемент управления – окно редактирования (называемое иногда окном ввода), а для вывода значения функции – статический элемент управления, т. е. просто текстовую строку. Вывод этой программы приведен на рис. 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, стиль WSBORDER, чтобы у окна была рамка) и статический элемент (класс STATIC, стиль SSLEFT, позиционирующий текст влево). Идентификаторы элементов управления, как и всегда, определены в файле 4-5.H.

В оконной функции диалога DlgProc() обрабатывается единственное сообщение WMCOMMAND, которое поступает в приложение при вводе текста в окно редактирования, а также при нажатии кнопки . Поскольку этих событий всего два, в функции DlgOnCom­mand() для их отбора вместо конструкции switch-case используется оператор if.

При вводе в окно ввода каждой цифры аргумента управление передается на блок, следующий за оператором if (id == IDIN­PUT). Здесь последовательно выполняется несколько операций. Прежде всего текст, введенный в окно редактирования, с помощью функции GetDlgItemText() копируется в символьную строку str. Полученная строка с помощью функции atoi() преобразуется в целое число, которое в этом же предложении умножением на π (константа MPI) и делением на 180 переводится в число радианов (что требуется для функции sin()). Далее вычисляется значение синуса (переменная y), и полученное число функцией sprintf() помещается в ту же строку str. Наконец, с помощью функции SetDlgItemText() строка str копируется в статический элемент управления (идентификатор IDRES).

Стоит заметить, что в отличие от примера 4-2, статический элемент управления заполняется текстом не однократно на этапе создания диалога, а динамически по ходу взаимодействия пользователя с диалоговым окном. Пользователь может многократно вводить в окно редактирования новые данные и получать соответствующий результат вычислений.