界面初步分析
主界面用的对话框框架,装载了金山自己定义的窗口.大部分的控件都并非Windows控件(除了中间的列表控件),而是GDI画出来的.代码只列出了的界面有关部分.
à框架窗口类定义:
class KmainDlg//继承以下几个类
, publicCWHRoundRectFrameHelper<KMainDlg>
{}
-->CbkDialogImpl的定义:
template <class T, class TBkView =CBkDialogView, class TBase = CWindow, class TWinTraits =CControlWinTraits>
class CBkDialogImpl : public CWindowImpl<T,TBase, TWinTraits>
{
protected:
TBkView m_richView;// 这里相当于CbkDialogView m_richView;
它所有的控件都是在这个类里面画的.
控件信息都在放在xml资源文件里边.
}
-->m_richView的类定义
classCbkDialogView
{
}
--> CbkDialogViewImpl的定义:
template <class T, class TBkWin =CBkDialog, class TBase = ATL::CWindow, class TWinTraits =CBkDialogViewTraits>
class
{
protected:
}
从xml资源文件中加载信息
当然,它们的xml资源文件怎么去写,肯定有自己的一套规則.
if(pNewWindow) void _ComposingPanel(LPWINDOWPOS lpWndPos);//安置控件 } |
代码如:
IDR_XML1 RESXML "res\\warning_dlg.xml"
ISR_XML_DEF_STR RESXML "res\\def_style.xml"
格式为:资源ID
程序运行时释放资源:
|
è
金山XML资源文件定义格式
附加信息加载
在初始化时一般可以看到如下代码:
void KAppModule::_InitUIResource() { BkString::Load(IDR_STRING_DEF); } |
使用BKString::Load(ID):用来加载XML资源文件.储存在容器CAtlMap<UINT,CString> m_mapString中.使用时利用static函数BKString::Get(ID)释放出来.
|
BKString设计为特殊模式类,使用时不需要使用实例.类中函数都使用_Instance()函数来返回唯一对象.BKStyle及BKSkin类也类似.
专门用来存储界面上的出现的有关文字.
BKSKin和BKStyle是紧密相连的.
BKSkin内里的存储容器是CAtlMap<CStringA,CBkSkinBase *> m_mapPool;
我的理解是这样的:BKSKin是为CBKSkinBase提供服务的.加载,动态创建等.
CbkSkinBase是用来定制绘画行为的一组功能类.如颜色,形状等.
CBKSkinBase的派生类如下:
CBKSkinBase的派生类 CBKImageSkin CbkSkinImgFrame CbkSkinImgHorzExtend CbkSkinButton CbkSkinGradation CbkPngSkin |
一种派生类用于画出一种界面元素.可根据XML节点属性来定制和微调.
Skin XML样例: <skins> <imghorzex name=mainbghead src=1left=3/> <imgframe <imghorzex name=mainbgfoot src=3left=3/> <png </skins> |
根节点为skins,里面是一组节点,src代表.sc2属性值文件中对应BMP资源ID.
BKStyle对应的則是字体形状,鼠标形状,鼠标悬停时颜色,背景颜色,SKIN等控件信息.
Style XML样例: <style> <class name="msgboxhead"skin="msgboxhead" font="0000" crtext="000000" crbg=FBFCFD/> <class name="msgboxbody"skin="msgboxbody" font="0000" crtext="000000" crbg=FBFCFD/> <class name="msgboxfoot"skin="msgboxfoot" font="0000" crtext="000000" crbg=FBFCFD/> </style> |