Главная » C++, C++ Builder » Взаимодействие Visual C++ и формы CBuilder

0

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

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

Для написания этого приложения нам опять потребуется создать в CBuilder DLL,  содержащую форму для введения адресов. Выполните это самостоятель но. Форма, которую вы должны создать, показана на рис. 12.3. Когда вы закончите с этим, мы перейдем к следующему этапу — добавлению данных в приложение MFC.

Рис. 12.3. Форма для ввода адреса

Первое, что нам надо сделать в приложении, — это добавить оберточную функцию для DLL, которая позволит нам создать форму. Давайте сначала посмотрим на код, а потом обсудим некоторые интересные моменты, которые в нем встретятся:

extern "C"

{

void WINAPI __declspec(dllexport) CreateAddressForm(TAddress *pObject)

{

// Сначала создаем форму

TForm1 *pForm = new TForm1(NULL);

// Получаем данные от пользователя

pForm->ShowModal();

// Передаем данные обратно в структуру

pObject->SetLastName(  pForm->Edit1->Text.c_str()); pObject->SetFirstName(  pForm->Edit2->Text.c_str()); pObject->SetAddress1(  pForm->Edit3->Text.c_str()); pObject->SetAddress2(  pForm->Edit4->Text.c_str()); pObject->SetCity(  pForm->Edit5->Text.c_str()); pObject->SetState(  pForm->Edit6->Text.c_str()); pObject->SetZipCode(  pForm->Edit7->Text.c_str());

}

}; // Конец блока extern "C"

Первое, что бросается в глаза, — здесь мы опять создаем оберточную функцию, используя объявление extern "C", с тем чтобы эту функцию можно было вызвать из MFC. Но на этот раз у функции есть аргумент, представляющий объект, созданный в MFC для хранения данных, введенных пользователем в форму. Давайте посмотрим на этот объект, который, кстати, вам придется добавить в новый файл с именем Address.h. Этот файл и будет использоваться в приложении MFC для осуществления передачи данных:

#ifndef _ADDRESS_H_

#define _ADDRESS_H_ class TAddress

{

char strLastName[80]; char strFirstName[80]; char strAddress1[80]; char strAddress2[80]; char strCity[40];

char strState[4];

char strZipCode[10]; public: TAddress(void)

{

}

~TAddress(void)

{

}

const char *GetLastName(void)

{

return strLastName;

}

const char *GetFirstName(void)

{

return strFirstName;

}

const char *GetAddress1(void)

{

return strAddress1;

}

const char *GetAddress2(void)

{

return strAddress2;

}

const char *GetCity(void)

{

return strCity;

}

const char *GetState(void)

{

return strState;

}

const char *GetZipCode(void)

{

return strZipCode;

}

void SetLastName( const char *strLast )

{

strncpy( strLastName, strLast, 80 );

}

void SetFirstName( const char *strFirst )

{

strncpy( strFirstName, strFirst, 80 );

}

void SetAddress1( const char *strAdd1 )

{

strncpy(strAddress1,  strAdd1,80);

}

void SetAddress2( const char *strAdd2 )

{

strncpy(strAddress2,  strAdd2,80);

}

void SetCity( const char *strC )

{

strncpy(strCity,  strCity,40);

}

void SetState( const char *strSt )

{

strncpy(strState, strSt,4);

}

void SetZipCode( const char *strZip )

{

strncpy(strZipCode, strZip, 10);

}

};

#endif

Как вы видите, это простой объект C++, предназначенный для хранения информации из нашей записной книжки. Используя стандартный объект C++, мы облегчаем задачу присоединения DLL к приложению MFC. Код в оберточной функции определяет части объекта-адреса посредством вызова функций класса, так что нам не надо волноваться о выравнивании или определении объекта. Мы доверяем

объекту хранение информации в том виде, в каком ему надо, для того чтобы она воспринималась

Visual C++ и MFC.

И последнее замечание: вам надо подключить заголовочный файл Address.h к исходному файлу

project.cpp с тем, чтобы описание класса TAddress было доступно компилятору. Как вы видите,

«форвардное»  описание  оберточной  функции  содержится  в  конце  заголовочного  файла —  для нужд приложения Visual C++.

Приложение Visual C++

Та часть работы, которая была связана с CBuilder, завершена, и теперь нам надо создать приложение Visual C++ для использования оберточной функции DLL. Итак, при помощи Мастера приложений создайте простое приложение, назовите его MfcBcbTest и выберите для него тип однодокументного  интерфейса.

В класс CMainFrame добавьте обработчик для пункта меню Файл д Новый. Воспользуйтесь советом Мастера классов, назовите этот обработчик OnFileNew. Теперь в  метод  OnFileNew класса CMainFrame добавьте следующие строки:

void  CMainFrame::OnFileNew()

{

TAddress *pAddress = new TAddress; CreateAddressForm(pAddress);

MessageBox(pAddress->GetLastName(), " Фамилия ", MB_OK );

}

Как видно из этого кода, мы создаем новый экземпляр класса TAdress (заголовочный файл для него вы должны добавить к исходному файлу mainfrm.cpp). Этот объект играет роль интерфейса между приложением MFC и DLL CBuilder. После того как объект создан, мы передаем указатель на него в оберточную функцию, прототип которой был описан в заголовочном файле Address.h. Функция вызывается, и наша форма отображается в виде модального диалога. Когда пользователь нажимает кнопку OK, форма закрывается и объект возвращается приложению MFC. Чтобы удостовериться в том, что данные были переданы корректно, мы после возврата  управления от функции отображаем на экране окно сообщения, содержащее фамилию, введенную пользователем в форму.

Вот и все. Теперь вы знаете, что требуется для передачи данных между формой CBuilder и приложением MFC — на самом деле, не так уж и много всего.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии