Розробка DLL-модулів розширення MFC мовою Visual C + +

Підготовка і компонування DLL-модуля для деякого зразка розширеного класу.


Кваліфіковані фахівці, що займаються підготовкою програм для Windows, поступово відмовляються від застосування інструментального комплекту SDK Windows і переходять до сучасних середовищами розробки для цієї ОС, які забезпечують більш високу ступінь абстрагування від діючих на низькому рівні вбудованих механізмів цієї системи. У результаті таких змін у виграшній ситуації виявилася мова Microsoft Visual C++, в якому основою для об'єктно-орієнтованого представлення Windows API служить бібліотека базових класів MFC (Microsoft Foundation Classes).


MFC в руках досвідченого розробника – потужне, але далеко не досконалий засіб. Насправді мало не всі знайомі мені програмісти, що покладаються в роботі на MFC, змушені були хоч раз в житті розробляти власний набір розширень на базі класів MFC, з яких породжувалися необхідні похідні класи. Але це, врешті-решт, ставиться до можливостей Сі + +. Якщо який-небудь клас не годиться для ваших потреб (і якщо, по суті, йому спочатку відводилася роль базового класу), ви можете вивести з нього похідний клас, а потім внести зміни в ті його компоненти, які вас не влаштовують.


Припустимо, що ви підготували набір розширень для MFC, якими, як передбачається, будуть користуватися і інші програмісти вашої компанії. Виникає питання, як скомпонувати ці розширення? Можна було б поширити файли з вихідними текстами або роздати компоненти, сумісні з галереєю Component Gallery Visual C + +. Або, якщо ви віддаєте перевагу MFC, скомпонувати підготовлені вами розширення у вигляді DLL-модулів. З DLL-модулів розширення MFC класи експортуються таким же чином, як із звичайних DLL-модулів функції. Будь-яка програма, динамічно пов'язана з DLL-модулями MFC, може знову ж динамічно зв'язуватися з DLL-модулями розширення MFC. Все, що потрібно від розробника, – включити необхідні заголовки та бібліотеку імпорту DLL в список зв'язків цієї програми.


Наскільки важко підготувати DLL-модуль розширення MFC? Дуже просто, якщо вдатися до засобів Visual C++ і MFC. У цій статті ми покажемо, як створити DLL-модуль розширення MFC, який заповнив б кричущий недолік MFC класу CToolTipCtrl. Крім цього, ми розповімо, як скласти програму, що працює з цим модулем. Коли ви зрозумієте, наскільки все це просто, у вас, можливо, виникне бажання самостійно зайнятися розробкою MFC-розширень.


Підготовка DLL-модуля розширення MFC


Теоретично ви без будь-яких труднощів призначите підказки TollTips елементам керування діалогового вікна або його довільно обраним областям за допомогою наявного в MFC класу CToolTipCtrl. (Підказки ToolTips – це мініатюрний вікно з довідковим текстом, яке спливає, коли курсор миші встановлюється на кнопці панелі інструментів або на іншому об'єкті інтерфейсу.) Але є одна проблема. Оскільки функція CToolTipCtrl:: AddTool не виконує автоматично поділу на підкласи вікна, якій призначається підказка ToolTip, інформацію про події, пов'язані з мишею, вам доводиться передавати елементу управління ToolTip самостійно. Це зазвичай означає, що завдання поділу вікна на підкласи покладається на вас.


Елемент управління ToolTip, який служить основою об'єкта CToolTipCtrl, буде самостійно виконувати поділ на підкласи, якщо ви подбаєте про передачу йому відповідних прапорців, – функція, яку команда розробників MFC обійшла своєю увагою. На щастя, виправити цю помилку зовсім неважко. Треба просто підготувати клас, похідний від класу CToolTipCtrl, і замінити функцію CToolTipCtrl:: AddTool аналогічною, яка містить прапорець TTF_SUBCLASS в полі uFlags структури TOOLINFO, використовуваної в повідомленнях TTM_ADDTOOL. А ще краще замінити її двома функціями – для додавання підказок ToolTips до дочірніх вікнам і до прямокутним областям вікна. Функція AddTool передбачає ці можливості, але синтаксично два цих методу дуже відрізняються один від одного.


На лист. 1 і 2 наведено текст для похідного від CToolTipCtrl класу, що носить назву CToolTipCtrlEx. Похідному класу крім успадкованих від CToolTipCtrl: AddWindow належать дві функції: для призначення підказки ToolTip дочірньому вікна і AddRectangle, яка виконує те ж саме для прямокутної області вікна. Щоб полегшити завдання призначення підказки, в обох функціях використовується прапорець TTF_SUBCLASS. Позначимо об'єкт CToolTipCtrlEx як m_tooltipCtrl, тоді фрагмент для присвоєння підказки ToolTip кнопкові перемикачі з ідентифікатором IDC_BUTTON виглядає досить елементарно:

m_tooltipCtrl.AddWindow (GetDlgItem (IDC_BUTTON),
"Введіть сюди текст підказки!");

Ліст. 1. Заголовний файл класу CToolTipCtrlEx.

 / / ToolTip.h: заголовний файл
//

////////////////////////////////////////////////////////////
/ / Вікно CToolTipCtrlEx

class AFX_EXT_CLASS CToolTipCtrlEx : public CToolTipCtrl
{
/ / Конструктор
public:
BOOL AddRectangle (CWnd* pWnd, LPCTSTR pszText,
LPCRECT pRect, UINT nIDTool);
BOOL AddWindow (CWnd* pWnd, LPCTSTR pszText);
CToolTipCtrlEx();

/ / Атрибути
public:

/ / Операції
public:

/ / Перевизначення
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CToolTipCtrlEx)
//}}AFX_VIRTUAL

/ / Реалізація
public:
virtual ~CToolTipCtrlEx();

/ / Згенеровані функції message map
protected:
//{{AFX_MSG(CToolTipCtrlEx)
/ / Зверніть увагу – "майстер" ClassWizard додасть
/ / Макрокоманди
// remove member functions here,
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

————————————————– ——————————
Ліст. 2. cpp-файл для класу CToolTipCtrlEx.

/ / ToolTip.cpp: файл реалізації
//

#include “stdafx.h”
#include “stdafx.h”
#include “ToolTip.h”

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

////////////////////////////////////////////////////////////
// CToolTipCtrlEx

CToolTipCtrlEx::CToolTipCtrlEx()
{
}

CToolTipCtrlEx::~CToolTipCtrlEx()
{
}

BEGIN_MESSAGE_MAP(CToolTipCtrlEx, CToolTipCtrl)
//{{AFX_MSG_MAP(CToolTipCtrlEx)
// NOTE – the ClassWizard will add remove mapping
// macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

///////////////////////////////////////////////////////////
/ / Обробники повідомлень CToolTipCtrlEx

BOOL CToolTipCtrlEx::AddWindow (CWnd* pWnd, LPCTSTR pszText)
{
TOOLINFO ti;
ti, cbSize = sizeof (TOOLINFO);
ti.uFlags = TTF_IDISHWND / TTF_SUBCLASS;
ti.hwnd = pWnd->GetParent ()->GetSafeHwnd ();
ti.uId = (UINT) pWnd->GetSafeHwnd ();
ti.hinst = AfxGetInstanceHandle ();
ti.lpszText = (LPSTR) pszText;

return (BOOL) SendMessage (TTM_ADDTOOL, 0, (LPARAM) &ti);
}

BOOL CToolCtrlEx::AddRectangle (CWnd* pWnd, LPCTSTR pszText,
LPCRECT pRect, UINT nIDTool)
{
TOOLINFO ti;
ti.cbSize = sizeof (TOOLINFO);
ti.uFlags = TTF_SUBCLASS;
ti.hwnd = pWnd->GetSafeHwnd ();
ti.uId = nIDTool;
ti.hinst = AfxGetInstanceHandle ();
ti.lpszText = (LPSTR) pszText;
::CopyRect (&ti.rect, pRect);

return (BOOL) SendMessage (TTM_ADDTOOL, 0, (LPARAM) &ti);
}


Як оформити клас CToolTipCtrlEx у вигляді DLL-модуля? Пропонуємо покрокові інструкції для Visual C + + версії 4.x:


Запуcтіте Visual C + +, створіть новий проект, вибравши пункт New (новий) в меню File, і клацніть двічі на команді Project Workspace (робоча область проекту). У полі Name (ім'я) робочої області нового проекту New Project Workspace наберіть символи "MfcExt" (без лапок). У вікні Type (тип) виберіть "майстри" MFC AppWizard (dll), потім клацніть на кнопці Create (створити).


У вікні Step 1 "майстри" AppWizard у відповідь на питання: "What type of DLL would you like to create?" ("Якого типу DLL-модуль ви хочете сформувати?") – Виберіть "MFC Extension DLL (using shared MFC DLL) [DLL-модуль розширення MFC (з використанням розділяється модуля DLL MFC).] Клацніть на кнопці Finish (завершити) і на кнопці OK, щоб згенерувати початковий текст DLL-модуля. Зверніть увагу на укладену в дужки фразу "using shared MFC DLL", наступну за словами "MFC Extension DLL". Якщо ви складаєте DLL-модуль розширення MFC, немає необхідності реалізовувати можливість постійної прив'язки до MFC. DLL-модуль повинен бути пов'язаний з бібліотеками MFC динамічно.


Зверніться до "майстру" класів ClassWizard і клацніть на кнопці Add Class (додати клас). Виберіть New, щоб відкрити вікно Create New Class (створити новий клас). У цьому вікні виберіть CToolTipCtrl в панелі "Base class" (базовий клас) і тип "CToolTipCtrlEx" в панелі "Name". Клацніть на кнопці Change (змінити), щоб змінити імена файлів Tooltip.h і Tooltip.cpp. (Особливою потреби в подібних змінах немає, але я все ж виконую цей крок, щоб позбутися довгих імен файлів.) Відмініть вибір у вікні "Add to Component Gallery" ("Додати до галереї компонентів"), щоб заощадити простір на диску. Клацніть на команді Create, щоб повідомити "майстру" класів ClassWizard про необхідність породити новий клас, і на кнопці OK, щоб завершити роботу цього "майстра".


Додайте до класу CToolTipCtrlEx належать функції AddWindow і AddRectangle. Подбайте про те, щоб обидві функції були оголошені як public (загальнодоступні), оскільки звернення до них будуть відбуватися за межами класу CToolTipCtrlEx. У Visual C + + є простий спосіб додати функцію, що належить класу, – клацнути правою кнопкою миші на імені класу у вікні ClassView і вибрати в контекстному меню команду Add Function (додати функцію).


У вікні ClassView клацніть двічі на CToolTipCtrlEx, щоб відкрити заголовний файл цього класу. Додайте AFX_EXT_CLASS до опису класу праворуч від ключового слова class (див. лист. 1).


Створіть свій проект. У результаті ви отримаєте два дуже важливих файлу: власне DLL-модуль (Mfcext.dll) і бібліотеку імпорту DLL-модуля (Mfcext.lib). Бібліотека імпорту містить в основному список імен експортованих функцій чи, як у нашому випадку, перелік експортованих класів C + +. Завдяки зв'язку з бібліотекою імпорту програма може працювати з класами, експортованими з DLL-модулів розширення MFC, так, немов бібліотека, що містить ці класи, пов'язана статично. Крім цього, зв'язок з бібліотекою Mfcext.lib служить для Windows ознакою того, що для виконання конкретної програми необхідний файл Mfcext.dll.


Застосування DLL-модуля розширення MFC


Підготовка програми, що працює з модулем Mfcext.dll, не складає особливих труднощів. Просто увімкніть заголовний файл Tooltip.h в кожен клас, що працює з похідним класом CToolTipCtrlEx, і включіть файл Mfcext.lib в список пов'язаних з вашим проектом бібліотек. Після чого слід розглядати клас CToolTipCtrlEx як звичайний клас MFC. Не забудьте, що потрібно вибрати "As a shared DLL" ("Як розділяється DLL-модуль "), коли настане момент відповідати на питання" майстри "AppWizard, щоб ваша програма могла зв'язуватися з MFC динамічно. Ви можете додати до списку зв'язків вашого проекту файл Mfcext.lib, виберіть для цього пункт Settings (параметри) у меню Build мови Visual C + +, клацніть на закладці Link (зв'язок) і введіть маршрут до файлу Mfcext.lib у вікні "Object / library modules" (об'єктні / бібліотечні модулі).


Для прикладу ми наводимо програму ToolTest, яка виводить єдину кнопку в діалоговому вікні. Вона динамічно зв'язується з файлом Mfcext.dll і використовує клас CToolTipCtrlEx. Програма працює з діалоговими вікнами, а класу діалогового вікна належить змінна CToolTipCtrlEx на ім'я m_tooltipCtrl. Наступний фрагмент вихідного тексту функції OnInitDialog діалогового вікна створює елемент управління ToolTip і привласнює екранної кнопці цього вікна підказку ToolTip:

m_tooltipCtrl.Create (this);
m_tooltipCtrl.AddWindowTool (
GetDlgItem (IDC_EXIT);
"Щоб закрити, клацніть тут");

Коли курсор встановлюється на цій кнопці, у вікні ToolTip з'являється текст "Щоб закрити, клацніть тут". Клацання на кнопці – і програма буде закрита.


Програму ToolTest і файл Mfcext.dll можна завантажити разом з вихідними текстами зі служби PC Magazine Online (www.pcmag.com). Виберіть пункт Downloads в меню, розташованому з лівого боку базової сторінки, потім пункт PC Tech Archives, а після цього пункт V16n15.zip. Цей файл ви можете знайти також в оперативній інформаційній службі CompuServe у форумі Utilities / Tips (GO ZNT: TIPS). Наші файли входять до цього архів. У процесі їх розархівування (Mfcext.zip і Tooltest.zip) встановите перемикач в PKUNZIP в положення-d, щоб розгорнути і каталоги, що зберігаються в ZIP-файлах. Перш ніж ви запустите ToolTest на виконання, скопіюйте файл Mfcext.dll в системний каталог Windows або в той каталог, в якому знаходиться виконуваний модуль Tooltest.exe. В іншому випадку Windows не зможе знайти файл Mfcext.dll, коли почнеться виконання програми ToolTest. Якщо ви вирішите зайнятися підготовкою своєї власної версії модуля Tooltest.exe, внесіть зміни в ім'я маршруту в полі "Object / library modules" діалогового вікна Project Settings, щоб інформувати Visual C + + про те, в якому каталозі вашого ПК знаходиться файл Mfcext.lib.


Висновок


Розробка DLL-модулів розширення MFC – задача проста, якщо, звичайно, ви знаєте, як це робиться. Коли ви ділитеся подібними розширеннями з іншими розробниками, не забудьте окрім самих DLL-файлів передати їм і заголовні файли, що описують класи цих DLL-модулів, і відповідні LIB-файли. Тоді у ваших колег буде все необхідне, щоб скористатися підготовленими вами розширеннями.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*