Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры печатать.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
379.36 Кб
Скачать

124. Диалоговые окна и элементы управления. Формирование ресурсов диалогового окна. Задание идентификаторов диалогового окна и элементов управления. Создание диалогового окна Sample Dialog.

Окна диалога позволяют пользователям отмечать элементы в списке, устанавливать флажки опций, вводить строки и числа непосредственно с клавиатуры и косвенным образом вводить вещественные числа (с плавающей точкой). Начиная с Windows 3.0, в окно диалога также может входить поле со списком. Поле со списком (combo box) — это сочетание однострочного поля редактирования с окном-списком. Окно диалога для программиста является ключевым элементом при организации в программе Windows ввода нетривиальных данных. Диалог также облегчает жизнь программиста, поскольку Windows берет на себя часть необходимых забот о нем.

Окна диалога вызываются при выборе команды из меню и появляются в виде раскрывающихся окон. Команда, которая вызывает появление окна диалога, обычно помечается многоточием после названия. Команды About Box... и Data Entry... в предыдущем разделе вызывают появление окна диалога

Каждый ресурс диалогового блока имеет идентификатор, который позволяет объекту диалогового блока задать, какой ресурс диалогового блока будет использоваться. Идентификатор может быть строкой или целым числом. Вы можете передать этот идентификатор конструктору диалогового блока.

Для построения объекта диалогового блока создайте его, используя указатель на родительское окно и идентификатор ресурса. Родительское окно почти всегда задается как this. Можно также использовать основное окно приложения (это единственное окно, всегда присутствующее в приложении ObjectWindows). Исключением является ситуация, когда вы задаете объект диалогового блока как клиентное окно в конструкторе TFrameWindow. Конструктор передает объект диалогового блока функции TFrameWindow::Init, которая автоматически устанавливает родительский объект диалогового блока.

Ресурс диалогового окна используется для вывода окна на экран самого окна и элементов управления, которые находиться на нем. Класс диалогового окна необходим для программной реализации управления окном и его элементами. Ресурсы диалогового окна создаются редактором ресурсов. Класс окна создает ClassWizard на основе ресурсов диалогового окна. Обычно все эти классы это дети от класса CDialog. Каждый элемент управления обычно имеет переменную в классе диалогового окна. При генерации приложения AppWizard'ом у Вас автоматически генерируется окно о программе.

125. Создание класса диалогового окна. Использование класса диалогового окна. Организация вывода диалогового окна на экран. За кулисами. Использование элемента управления типа список. Использование элементов управления типа переключатель.

Класс CDialog - базовый класс, используемый для отображения диалоговых окон на экране. Диалоговые окна имеют два типа: модальный и немодальный. Модальное диалоговое окно должно быть закрыто пользователем прежде, чем прикладная программа продолжается. Немодальное диалоговое окно позволяет пользователю отображать диалоговое окно и возвращаться к другой задаче без того, чтобы отменить или удалять диалоговое окно.

Объект CDialog - комбинация шаблона диалога и класса наследника CDialog. Используйте редактора диалога, чтобы создать шаблон диалога и сохранять его в ресурсе, затем используйте ClassWizard, чтобы создать класс, полученный из CDialog.

Диалоговое окно, подобно любому другому окну, получает сообщения от Windows. В диалоговом окне, Вы особенно заинтересованы в уведомительных сообщениях обработки из средств элементов управления блока диалога, именно так пользователь взаимодействует с Вашим диалоговым окном. ClassWizard просматривает потенциальные сообщения, сгенерированные каждым элементом управлением в Вашем диалоговом окне, и Вы можете выбирать, которые сообщения Вы желаете обработать. ClassWizard затем добавляет соответствующие входы карты сообщения и функции членства драйвера сообщения к новому классу для Вас. Вы только должны записать специфический для приложения код в функциях членства драйвера.

Функции GetFileName и GetFilePath по сути аналогичны, и предназначены для вывода диалогового окна выбора файла

(при этом можно указать стартовую папку для поиска файла, и тип\расширение выбираемого файла)

Функция GetFilenamesCollection позволяет выборать сразу несколько файлов в одной папке.

Функция GetFolderPath работает аналогично, только служит для вывода диалогового окна выбора папки.

Диалоговые окна Переключатели используются для предоставления во время установки до четырех взаимоисключающих вариантов выбора и возврата выбранного значения. Доступно три диалоговых окна Переключатели: Переключатели (2 варианта выбора), Переключатели (3 варианта выбора) и Переключатели (4 варианта выбора). Эти три диалоговых окна идентичны и различаются только количеством переключателей; каждое из них может быть добавлено к проекту развертывания лишь один раз.

Эти диалоговые окна содержат соответственно два, три и четыре переключателя с подписями и дополнительными метками для предоставления сведений пользователю. Тексты этих меток задаются во время разработки в окне Свойства. Каждый переключатель имеет дополнительные свойства для указания значения по умолчанию и варианта, выбираемого по умолчанию.

На следующем рисунке показано типичное диалоговое окно Переключатели (2 варианта выбора), отображаемое во время установки.

Во многих диалоговых окнах присутствует еще один компонент - блок списка. Этот список позволяет вам просматривать и выбирать запись из списка переменной длины, не выходя из диалогового окна.

Если в списке появляется мерцающий курсор и вы хотите что-то най ти, можно ввести слово (или его первые буквы), после чего IDE выполнит его поиск.

Активизировать блок списка можно щелкнув на нем кнопкой "мыши" или выбрав подсвеченную букву заголовка списка (либо нажать клавишу Tab или клавиши управления курсором, пока он не будет подсвечен). После вывода списка для его просмотра можно использовать полосу прокрутки или клавиши стрелок (вверх и вниз) на клавиатуре.

126. Научная графика: графическое представление функции с использованием меню и окон диалога. Заголовочный файл 24FOUR.H. Заголовочный файл ресурсов 24FOURR.H, файл описания ресурсов 24FOUR.RC и файл описания окна диалога 24FOUR.DLG.

Следующий пример 24FOUR изобразит в рабочей области окна график суммы ряда Фурье. Это приложение использует два ресурса Windows: меню и окна диалога.

С ростом сложности приложений увеличивается и количество файлов, не обходимых для их построения. Для этой программы требуется файл определения модуля (только при создании приложения Windows З.х) 24FOUR.DEF, заголовочный файл 24FOUR.H, заголовочный файл для ресурсов 24FOURR.H (с дополнительным "R" в имени), файл описания ресурсов 24FOUR.RC, файл с описанием окна диалога 24FOUR.DLG и файл с исходным текстом программы 24FOUR.CPP.

Ниже приведен листинг файла определения модуля 24FOUR.DEF:

NAME 24FOUR

DESCRIPTION 'Drawing A Fourier Series Waveform'

; Изображение суммы ряда Фурье

EXETYPE WINDOWS

STUB 'WINSTUB.EXE'

CODE PRELOAD MOVEABLE DISCARDABLE

DATA PRELOAD MOVEABLE MULTIPLE

HEAPSIZE 4096

Заголовочный файл 24FOUR.H, листинг которого приведен ниже, содержит определения классов.

class CMainWnd : public CFrameWnd

{

public:

CMainWnd();

afx_msg void OnPaint();

afx_msg void OnSize(UINT,int,int);

afx_msg int OnCreate(LPCREATESTRUCT cs);

afx_msg void OnAbout();

afx_msg void OnFourierData();

afx_msg void OnExit();

DECLARE_MESSAGE_MAP();

};

class CTheApp : public CWinApp

{

public:

virtual BOOL InitInstance();

};

class CFourierDataDialog : public CModalDialog

{

public:

CFourierDataDialog(CWnd* pParentWnd= NULL)

: CModalDialog("FourierData", pParentWnd)

{ }

virtual void OnOK();

};

Функция OnPaint() вызывается автоматически, когда объекту класса CMainWnd от приложения или от Windows поступает сообщение WM_PAINT. OnSize() вызывается, когда приходит сообщение WM_SIZE, вызванное изменением размеров окна. Эта информация пригодится при масштабировании графика по размерам окна. OnCreate() указывает на структуру, несущую информацию о создаваемом окне. Там содержатся размер, стиль и другие параметры окна. OnAboat(), OnFourierData() и OnExit() — функции, которые реагируют на сообщения WM_COMMAND. Эти сообщения возникают, когда пользователь выбирает команду меню или окна диалога.

Следующий заголовочный файл содержит уже привычные идентификационные номера для меню и окон диалога. Этот файл называется 24FOURR.H.

#define IDM_FOUR 100

#define IDM_ABOUT 110

#define IDM_EXIT 120

#define IDD_TERMS 200

#define IDD_TITLE 201

IDM_FOUR, IDM_ABOUT и IDM_EXIT используются для обозначения пунктов меню, a IDD_TERMS и IDD_TITLE необходимы для окна диалога ввода данных.

Файл описания ресурсов 24FOUR.RC содержит описание меню и значка. Описание окна диалога помещено в отдельный файл.

#include <windows.h>

#include <afxres.h>

#include "24FOURR.h"

FourierMenu MENU

BEGIN

POPUP "Fourier Data"

BEGIN

MENUITEM "Fourier Data...", IDM_FOUR

MENUITEM "Fourier About...", IDM_ABOUT

MENUITEM "Exit", IDM_EXIT

END

END

rcinclude 24FOUR.dlg

В файл 24FOUR.RC включена ссылка на значок, созданный с помощью Icon Editor. Этот значок будет использован для обозначения приложения.

В файле 24FOUR.DLG содержатся описания двух окон диалога: простого окна "О Программе" (About) и окна для ввода данных.

Заголовочный файл ресурсов 24FOURR.H, файл описания ресурсов 24FOUR.RC и файл описания окна диалога 24FOUR.DLG используются компилятором ресурсов для создания единственного файла с готовыми ресурсами Windows.

127. Файл исходного текста 24FOUR.СРР. Создание нового класса CMainWnd. Определение размера рабочей области окна. Рисование графика. Окно диалога "О Программе". Окно диалога для ввода данных. Обработка команды OnExit().

1,2. Можно задать параметры объекта CMainWnd путем создания класса окна при помощи AfxRegisterWndClass. Класс окна имеет много полей, четыре из которых легко изменить: стиль, курсор, фон и значок свернутого окна.

Небольшой фрагмент текста, приведенный здесь, демонстрирует синтаксис для изменения курсора на стандартный курсор в виде крестика (IDC_CROSS) и задания кисти, которая закрасит фон белым (WHITE_BRUSH).

CMainWnd::CMainWnd()

{ Create((AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,

LoadCursor(NULL,IDC_CROSS),

(HBRUSH) (GetStockObject(WHITE_BRUSH)),NULL)),

"Fourier Series Foundation Class Application",

WS_OVERLAPPEDWINDOW,rectDefault,NULL,"FourierMenu");}

Функции Create() передается имя меню для окна.

3. Метод OnSize()определяет размер рабочей области данного окна. Когда размер окна изменяется, оно получает сообщение WM_SIZE. Как показано ниже, размер окна запоминается в двух переменных, m_cxClient и т_су Client.

void CMainWnd::OnSize(UINT,int x,int y)

{ m_cxClient=x; m_cyClient=y; }

4. Чтобы избежать проблем масштабирования, для рисования создается масштабируемое поле.

Как показано в приведенном фрагменте кода, вызовом функции SetMapMode() режим отображения заменяется на MM_ISOTROPIC. Этот режим использует произвольные единицы для задания координат. dc.SetMapMode (MM_ISOTROPIC) ;

Следующая строка задает протяженность координатных осей по х и у в 500 единиц.

dc.SetWindowExt(500,500);

Это просто означает, что длина осей х и у будет составлять 500 единиц, независимо от размеров окна. Физические границы изображения устанавливаются по текущим размерам окна:

dc.SetViewportExt (m_cxClient, -m_cyClient) ;

В этом случае все 500 единиц на координатных осях попадут в окно.

Как показано далее, физическое начало отсчета устанавливается на середине оси у и на небольшом расстоянии (одной двадцатой ширины окна) от левого края по оси х.

dc.SetViewportOrg(m_cxClient/20,m_cyClient/2) ;

Затем в окне изображаются координатные оси х и у.

Метод рисования графика суммы ряда Фурье использует два цикла for. Переменная i управляет значением угла для функции синуса, а переменная j соответствует текущему номеру гармоники. Каждая точка на графике представляет собой сумму всех гармоник для данного значения угла. Таким образом, если потребовать от приложения изобразить ряд из 1000 гармоник, программе придется проделать 400 000 вычислений.

// рисуем; выводим график суммы ряда Фурье

for(i= 0; i<= 400; i++)

{ for(j= 1; j<= nterms; j++)

{ y= (150.0/((j*2.0)-1.0))*sin(((j*2.0)-1.0)*0.015708*ang); yp= yp+ y; }

dc.LineTo(i,(int) yp); yp-= yp; ang++;}

При помощи функции LineTo() точки графика соединяются последовательно, благодаря чему график изображается сплошной линией. Внутренняя область графика будет заполнена серым цветом. Для этого вызывается функция ExtFloodFill(), которой в качестве аргументов передаются координаты точек внутри заполняемого пространства и цвет границы. Параметр FLOODFILLBORDER указывает, что требуется заполнить все пространство до границы заданного цвета.

// Готовимся к закрашиванию графика

// кистью newbrush. newbrush.CreateSolidBrush(dwColor[7]) ;

newbrush.CreateSolidBrush(dwColor[7]);

oldbrush= dc.SelectObject(&newbrush);

dc.ExtFloodFill(150,10,dwColor[0],FLOODFILLBORDER);

dc.ExtFloodFill(300,-10,dwColor[0],FLOODFILLBORDER);

В конце работы выводится заголовок графика, а затем удаляется созданная ранее кисть.

// заголовок графика

ltitle= strlen(mytitle); dc.TextOut(200-(ltitle*8/2),185,mytitle,ltitle);

// удаляем кисть

dc.SelectObject(oldbrush); newbrush.DeleteObject();

Все объекты, выводимые в рабочую область, масштабируются по размерам окна.

5. Окно диалога "О Программе" используется, чтобы сообщить сведения о программе, ее разработчиках, дате регистрации авторских прав и так далее.

Когда пользователь выбирает пункт меню Fourier About..., создается модальное окно диалога. Процедура обработки OnAbout() занимает лишь несколько строк текста:

void CMainWnd::OnAbout()

{ CModalDialog about("AboutBox",this); about.DoModal();}

Конструктору класса CModalDialog в качестве окна-родителя передается указатель на текущее окно. Для этого используется указатель this, который обозначает используемый в данный момент объект. Функция DoModal() обеспечивает отображение окна диалога на экране. При нажатии на кнопку ОК окно диалога исчезает с экрана.

6. Окно диалога, воспринимающее ввод пользователя можно вызвать, выбрав в меню пункт Fourier Data...Пользователь может ввести заголовок графика и целое число, задающее количество гармоник ряда Фурье. Если пользователь нажал кнопку ОК, окно диалога закрывается, а рабочая область окна перерисовывается.

Как уже говорилось, класс CFourierDataDialog порожден от CModalDialog в заголовочном файле 24FOUR.H. Обратите внимание, что именно здесь приложение получает данные. Эти данные были введены пользователем в окно диалога. Вот текст, извлекающий эту информацию после нажатия кнопки ОК:

void CFourierDataDialog::OnOK()

{ GetDlgItemText(IDD_TITLE,mytitle,80);

nterms= GetDlgItemInt(IDD_TERMS,NULL,0); CModalDialog::OnOK();}

Функция GetDlgItemText() заносит информацию о заголовке в виде строки в переменную mytitle. Положение этой информации в окне диалога задается константой IDD_TITLE. Целое число вводится аналогично функцией GetDlgItemInt(). Его идентифицирует константа IDD_TERMS, а значение запоминается в nterms. Второй параметр GetDlgItemText() используется для сообщения об ошибках перевода текста в число, но в данном примере не используется. Если третий параметр GetDlgItemInt() не ноль, функция будет воспринимать числа со знаком. В данном случае возможны только положительные числа.

7. Последний пункт в меню приложения — Exit (выход). При выполнении этой команды окно уничтожается вызовом DestroyWindow():

void CMainWnd::OnExit()

{ DestroyWindow();}

Меню приложения дает пользователю возможность завершить программу, не прибегая к оконному меню.