Состав библиотеки:
Исходные тексты: 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 — 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 ]