- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
// Файл settings.cpp
#define SETTINGS_READ
#include "Settings.h"
#undef SETTINGS_READ
#include "Settings.h"
#endif
// ----------------------------------
// Файл settings.h
#ifdef SETTINGS_READ
#define _XML_OPTION_VALUE(name,value) if (XML.FindElem(_CRT_WIDE(#name))) {/*XML.IntoElem();*/ XML.GetData(value); /*ShowVar(value);ShowVar(_CRT_WIDE(#name));*/ /* XML.OutOfElem();*/}
#define _XML_OPTION_ATTR(name,value) XML.GetAttrib(_CRT_WIDE(#name),value)
#define XML_NODE_START(name,value) if (XML.FindElem(_CRT_WIDE(#name))) {XML.IntoElem();
#define XML_NODE_START_WITHATTRIB(name,value) if (XML.FindElem(_CRT_WIDE(#name))) {
#define XML_NODE_STARTS(name,value) if (XML.FindElem(name)) {
#define XML_NODE_START_VALUE(name,value) if (XML.FindElem(_CRT_WIDE(#name))) { XML.GetData(value);XML.IntoElem();
#define XML_NODE_START_VALUE_WITHATTRIB(name,value) if (XML.FindElem(_CRT_WIDE(#name))) { XML.GetData(value);
#define XML_NODE_END() \
XML.OutOfElem(); \
}
#define XML_OPTION_VALUE(name) _XML_OPTION_VALUE(name,name)
#define XML_OPTION_MEMBER_VALUE(prefix, name) _XML_OPTION_VALUE(name, prefix##.name)
#define XML_OPTION_ATTR(name) _XML_OPTION_ATTR(name,name)
#define XML_OPTION_MEMBER_ATTR(prefix, name) _XML_OPTION_ATTR(name, prefix##.name)
#define COLOR_TO_PINT(c) (*(int*)&##c)
#else
// SAVING MACROSES
#define _XML_OPTION_VALUE(name,value) XML.AddElem(_CRT_WIDE(#name),value) ; /*XML.OutOfElem();*/
#define _XML_OPTION_ATTR(name,value) XML.SetAttrib(_CRT_WIDE(#name),value)
#define XML_NODE_START(name,value) XML.AddElem(_CRT_WIDE(#name)); {XML.IntoElem();
// ( еще десяток макросов)
#endif
#ifdef SETTINGS_READ
bool CSettings::MacroLoadSettings(CMyXml &XML)
{
#else
bool CSettings::MacroSaveSettings(CMyXml &XML)
{
#endif
TCHAR szFont[1024];
CString Font;
XML_NODE_START(Settings);
XML_NODE_START(General);
XML_OPTION_MEMBER_VALUE(Settings,Language);
XML_OPTION_VALUE(ExplorerContextMenu);
#ifndef SETTINGS_READ
HotkeysStr= Settings.Hotkeys.toString();
FontToString(&LogoSettings.Font,Font);
#endif
XML_OPTION_VALUE(HotkeysStr);
#ifdef SETTINGS_READ
Settings.Hotkeys.DeSerialize(HotkeysStr);
StringToFont(Font, &LogoSettings.Font);
#endif
#endif
XML_NODE_END();
// ..............................................
XML_NODE_END(); // end of settings
XML_NODE_END(); //
return true;
}
Фееричный пример повторного использования кода с помощью директив препроцессора.
Создано с целью совместить в одном месте чтение/запись настроек программы (с риском что-нибудь забыть) из XML файла.