Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Технологии программирования. Программирование графических интерфейс

.pdf
Скачиваний:
3
Добавлен:
15.11.2022
Размер:
2.24 Mб
Скачать

Пример 4.1

class CChildView : public CWnd {…

protected: CEdit* m_lpEdit;

protected: //{{AFX_MSG(CChildView)

afx_msg int OnCreate (LPCREATESTRUCT lpCreateStruct);

//}}AFX_MSG

DECLARE_MESSAGE_MAP() };

int CChildView:: OnCreate(LPCREATESTRUCT lpCreateStruct)

{

m_lpEdit=new CEdit; m_lpEdit->Create

(

WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHS CROLL|

WS_BORDER, rect,this,IDC_EDIT);

}

CChildView::~CChildView()

{

delete m_lpEdit;

}

В карту сообщений необходимо добавить макрос

ON_WM_CREATE()

71

Обработка сообщений от кнопок CButton

Командные сообщения Windows от меню, акселераторов и кнопокобрабатываютсямакросомON_COMMAND(id,memberFn).

Этот макрос использует в качестве параметров идентификатор элемента управления id и имя обработчика команды memberFn. Прототип обработчика должен быть описан в соответствующем классе и иметь вид afx_msg void memberFn();

Пример 4.2

class CChildView : public CWnd {…

protected: CButton* m_lpBtn;

public:

afx_msg int OnCreate(…); afx_msg void f();

DECLARE_MESSAGE_MAP() };

BEGIN_MESSAGE_MAP(CChildView, CWnd)

ON_WM_CREATE() ON_COMMAND(IDC_BUTTON,f)

END_MESSAGE_MAP()

Функции Create() в качестве последнего параметра передается идентификатор элемента управления, который и используется в макросе ON_COMMAND.

72

4.3.Пример создания простого SDI-приложения

1.Создать рабочую область (workspace) с именем lab04.

2.В этой рабочей области создать проект lab4_1 как при-

ложение MFC AppWizard(exe).

В мастере MFC AppWizard(exe) выполнить следующее:

Шаг 1

Отключить поддержку архитектуры Document/View.

Выбратьтип приложения Single document (SDI) (рис. 4.2).

Рис. 4.2

Шаг 2

Оставить установки по умолчанию (рис. 4.3).

Шаг 3

Убрать отметку ActiveX Controls (рис. 4.4).

73

Рис. 4.3

Рис. 4.4

74

Шаг 4

Убираем отметку Docking toolbar (рис. 4.5).

Рис. 4.5

Шаг 5

Оставляем установки по умолчанию (рис. 4.6).

Шаг 6

Мастер сообщает, что он создал три класса (рис. 4.7):

1)приложения CLab4_1App;

2)главного окна CMainFrame;

3)дочернего окна CChildView.

Дальнейшая работа выполняется с использованием мастера классов ClassWizard.

75

Рис. 4.6

Рис. 4.7

76

3. В класс дочернего окна CChildView добавить закрытые члены-данные – указатели на размещенные в окне элементы управления. Получим примерно следующее:

class CChildView : public CWnd

 

{

 

// …………

 

private:

 

CStatic* myStatic3;

//текст

CStatic* myStatic2;

 

CStatic* myStatic1;

 

CEdit* m_lpEdit;

//окно

редактирования

//кнопка

CButton* m_btn4;

CButton* m_btn3;

 

CButton* m_btn2;

 

CButton* m_btn1;

 

CComboBox* m_lbComboBox;

//список ComboBox

CListBox* m_lbListBox;

//список ListBox

};

4.В карту сообщений для класса CChildView добавить макрос ON_WM_CREATE(), а в определение класса – соответствующую функцию: обработчик сообщения WM_CREATE.

Вэтой функции необходимо создать и инициализировать элементы управления.

5.Записать определение этой функции.

Ниже приведен примерный фрагмент кода:

int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

//………………. m_lbListBox=new CListBox; m_lbListBox->Create (

WS_VISIBLE|WS_CHILD|LBS_STANDARD |LBS_NOTIFY|WS_HSCROLL|LBS_STANDARD,

77

CRect(130,20,230,200),this,1210); m_lbListBox->AddString(“Иванов”); m_lbListBox->AddString(“Петров”); m_lbListBox->AddString(“Сидоров”); m_lbListBox->AddString(“Котов”); //……………

// TODO: Add your specialized creation code here return 0;

}

6.Добавить в класс CChildView обработку сообщений от

кнопок.

7.Добавитьвкласс CChildView обработку двойного щелчка.

8.Отладить и выполнить программу.

4.4. Использование редактора ресурсов

Обычно Windows-приложение использует множество стандартных элементов интерфейса, таких как окна диалогов (Dialog), меню, панели инструментов и другие.

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

Основная программа ссылается на ресурсы с помощью идентификаторов. Здесь принято соглашение об именах. Имена идентификаторов имеют следующие префиксы:

IDD_ – ресурс диалогового окна;

IDR_ – ресурсы, прикрепленные к окну-рамке (меню, панель управления, «горячие клавиши»);

IDC_ – элементы управления и т.д.

Коды ресурсов в двоичном виде помещаются внутрь исполняемого модуля (exe-файла).

78

Файл сценария ресурсов (rc-файл) содержит некий исходный код ресурсов. Он является обычным текстовым файлом, который затем компилируется компилятором ресурсов и превращается в двоичный файл ресурсов (res-файл). Компоновщик присоединяет его к исполняемому файлу приложения. Редакторы ресурсов встроены в Developer Studio и позволяют достаточно просто создавать и редактировать различного вида ресурсы.

Войти в редактор ресурсов можно следующим образом: в меню Insert выбираем команду Resource. В появившемся окне Insert Resource выбираем тип создаваемого ресурса и нажимаем на кнопку New.

Появится редактор выбранного ресурса, в котором создаем ресурс. Порядок работы в редакторе ресурса зависит от типа ресурса.

Редактор ресурса можно также вызвать на вкладке ResourceView браузера Workspace.

Создав ресурс, сохраняем его в файле с расширением rc,

например, myapp.rc.

Теперь надо добавить файл myapp.rc к проекту. Для этого выполним Project/Add to Project/Files. В нашем проекте про-

изошло два изменения: во-первых, появилась вкладка ResourceView и, во-вторых, на вкладке FileView появился файл myapp.rc.

Посмотрим, что надо сделать, чтобы ресурс работал. Для примера рассмотрим ресурс Menu.

После создания ресурса и добавления файла с ресурсом myapp.rc к проекту заменим в конструкторе класса окна строку Create(0, “Заголовок”) на вызов функции, которая загружает ресурс из файла ресурсов

CFirstWnd(){ LoadFrame(IDR_MENU1); }

Здесь IDR_MENU1 – идентификатор меню, который автоматически формируется редактором меню, и его при желании можно изменитьв окнеMenu Item Properties.

79

Кроме этого, надо подключить файл resource.h, в котором автоматически записываются числовые значения идентификаторов:

#include”resource.h”

Файл resource.h содержит строчки вида

#define IDR_MENU1 128

При создании приложения с помощью мастера MFC AppWizard(exe) уже имеем меню, и задача состоит только в его модификации.

Далее необходимо записать обработчики событий от меню (при выборе команд меню). Обработка команд меню аналогична обработке команд от кнопок.

4.5.Пример использования редактора ресурсов

1.В рабочей области создать проект как приложение MFC AppWizard(exe). Отключить поддержку архитектуры

Document/View.

Дальнейшая работа выполняется с использованием масте-

ра классов ClassWizard.

2.В класс дочернего окна CChildView добавить закрытые члены-данные – указатели на размещенные в окне элементы управления: CStatic, CEdit, CListBox, CComboBox. Обратить внимание, что кнопки в окне не размещаются.

3.Войти в редактор ресурсов и, выбрав ресурс главного меню, изменить команды, как показано ниже (рис. 4.8).

4.В карту сообщений для класса CChildView добавить макрос ON_WM_CREATE(), а в определение класса соответствующую функцию – обработчик сообщения WM_CREATE.

5.Записать определение этой функции.

6.Добавить в класс CChildView обработку сообщений от команд меню.

80