[MFC] InterfaceXML - библиотека для поддержки XML-based UI
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 26.01.05 11:38
Оценка: 17 (4)
Состав библиотеки:


Исходные тексты: InterfaceXML.zip (72,3 Кб)

Внимание: файл InterfaceXML.zip содержит более поздние версии исходных файлов, чем те архивы, которые можно скачать по ссылкам, указанным в топиках "CDialogXML" и "CMenuXML/CHotKeysXML". Например, в класс CDialogXML добавлена возможность указывать в текстах элементов управления перенос на новую строку с помощью символа "|".

Класс CStringsXML

Представляет собой аналог ресурса "таблица строк" (String Table) на основе XML-файла следующего формата:

<?xml version="1.0" encoding="Windows-1252"?>
<Strings>
    <String ID="40001" Text="Shows the test dialog|Test Dialog"/>
    <String ID="40002" Text="Quits the application|Exit"/>
    <String ID="40003" Text="Displays program information and copyright|About"/>
    ...
</Strings>

Атрибут "ID" задает идентификатор строки и должен быть строковым представлением 4-байтового целого числа в десятичной системе счисления. Атрибут "Text" задает текст строки; все символы "|" будут заменены на символ "новая строка" ("\n").

Конструктор имеет вид

CStringsXML(LPCTSTR pszStringsName);

В качестве параметра pszStringsName необходимо передать имя таблицы строк (принципы обработки этого имени подробно изложены в сообщении [MFC] CDialogXML &mdash; rev. 3
Автор: SchweinDeBurg
Дата: 14.01.05
).

Доступ к строкам осуществляется при помощи оператора индексации

CString operator [](DWORD dwID);

принимающем через параметр dwID идентификатор требуемой строки. Если строка с таким атрибутом отсутствует в XML-файле, оператор возвращает пустую строку. Заметим, что единожды полученные строки кэшируются и при повторном запросе обращения к XML-файлу не происходит. Данный кэш можно очистить при помощи метода

void CleanupCache(void);

При желании, после конструирования объекта можно закэшировать сразу все строки соответствующего XML-файла; для этого предназначен метод

int PutStringsToCache(void);

возвращающий колчество успешно добавленных в кэш строк.

Предусмотрен также метод

CString Format(DWORD dwID, ...);

который использует строку с идентификатором dwID в качестве форматирующего выражения и возвращает результирующую строку аналогичто методу CString::Format() или функции CRT sprintf().

Заметим, что количество экземпляров CStringsXML, одновременно используемых в приложении, может быть произвольным (в прилагающемся примере их два — CGenericApp::m_stringsMain и CMainFrame::m_stringsStatus); идентификаторы строк должны быть уникальными в пределах одной таблицы.

Вспомогательные классы CDialogXML_t, CMenuXML_t, CHotKeysXML_t и CStringsXML_t

Данные шаблонные потомки (интерфес и реализация находятся в файле "GetXMLpath.h") соответствующих классов предназначены для упрощения использования библиотеки в том случае, когда XML-файлы должны располагаться в папке, имя которой определяется отличным от предусмотренной реализации образом. Вместо того, чтобы наследоваться от C*XML и перекрывать виртуальный метод GetXMLpath, достаточно просто реализовать единую функцию, возвращающую требуемый путь, и воспользоваться ей в качестве параметра шаблона. Ниже приведен простой пример:

// stdafx.h

void GetAppDataPath(CString& strDest);

typedef CDialogXML_t<GetAppDataPath> CMyDialogXML;
typedef CMenuXML_t<GetAppDataPath> CMyMenuXML;
typedef CHotKeysXML_t<GetAppDataPath> CMyHotKeysXML;
typedef CStringsXML_t<GetAppDataPath> CMyStringsXML;

// GetAppDataPath.cpp

void GetAppDataPath(CString& strDest)
{
    strDest = ...
}

Теперь можно создавать объекты-экземпляры CMyMenuXML, CMyHotKeysXML и CMyStringsXML; а также использовать CMyDialogXML в качестве базового класса для всех диалогов приложения:

// AboutDialog.h

class CAboutDialog: public CMyDialogXML
{
    DECLARE_DYNAMIC(CAboutDialog)
    DECLARE_MESSAGE_MAP()
...
};

// AboutDialog.cpp

IMPLEMENT_DYNAMIC(CAboutDialog, CDialogXML)

// message map
BEGIN_MESSAGE_MAP(CAboutDialog, CDialogXML)
    ...
END_MESSAGE_MAP()

Обратите внимание, что в макросах IMPLEMENT_DYNAMIC() и BEGIN_MESSAGE_MAP() в качестве базового класса необходимо указывать CDialogXML, поскольку CDialogXML_t не содержит MFC-шной RTTI (то же самое касается и остальных C*XML_t классов).
[ posted via RSDN@Home 1.1.4 beta 4 r303 ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.