Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум «Основы разработки приложений Windows» книга 1.DOC
Скачиваний:
107
Добавлен:
10.05.2014
Размер:
721.41 Кб
Скачать

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

Создадим на базе диалогового окна простенький калькулятор, который будет вычислять, например, значение синуса для вводимого с клавиатуры значения аргумента, задаваемого в градусах. Для ввода аргумента используем элемент управления – окно редактирования (называемое иногда окном ввода), а для вывода значения функции – статический элемент управления, т. е. просто текстовую строку. Вывод этой программы приведен на рис.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 <windows.h>

#include <windowsx.h>

#include <stdio.h>

#include <math.h>

#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, которое поступает в приложение при вводе текста в окно редактирования, а также при нажатии кнопки. Поскольку этих событий всего два, в функцииDlgOnCom­mand()для их отбора вместо конструкцииswitch-case используется операторif.

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

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