金山开源界面初步分析(转)

觉他们金山的BKWin内面包含的这些类是一个专门为开发类似界面而写的.

 

界面初步分析

主界面用的对话框框架,装载了金山自己定义的窗口.大部分的控件都并非Windows控件(除了中间的列表控件),而是GDI画出来的.代码只列出了的界面有关部分.

 

à框架窗口类定义:

class KmainDlg//继承以下几个类

   : publicCBkDialogImpl<KMainDlg>//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功能

    : publicCBkDialogViewImpl<CBkDialogView>

{

}

 

--> CbkDialogViewImpl的定义:

template <class T, class TBkWin =CBkDialog, class TBase = ATL::CWindow, class TWinTraits =CBkDialogViewTraits>

class  CBkDialogViewImpl

    : publicATL::CWindowImpl<T, TBase,TWinTraits>

    , publicCBkViewImpl<T>

{

protected:

    TBkWinm_bkHeader; //根据默认参数,即CbkDialog m_bkHeader;

    TBkWinm_bkBody;   //             CbkDialog m_bkBody; 

    TBkWinm_bkFooter; //             CbkDialog m_bkFooter;

       //这三个参数分别代表了不同的部分.标题,躯体,以及最下面的部分.如下图                                                                                                                           

}

                                                                                                                                                       

 类继承关系图:                                                                                                                                        

           CBkObject                                                                                                                                         

            |--CBKWindow                                                                                                                                         

                    |--CBButton…                                                                                                                                                                                                                                    

                    |--CBKContainerWnd                                                                                                                      

                             |--- CBkPanel                                                                                                                     

                                        |---CBkDialog                                                                                                              

                                                                                                                                                     

 其中,CbkObject有个很重要的虚函数:                                                                                                                                                    

 virtual BOOL Load(TiXmlElement* pXmlElem)                                 

从xml资源文件中加载信息                                                                                                                                                

当然,它们的xml资源文件怎么去写,肯定有自己的一套规則.                                                                                                                                                    

 CBKWindow封装了一个默认的窗口.它不是一个Windows窗口类,只是画出来的.                                                                                                                                                    

  如: // BkWindowHandle                                                                                                                                                                

     typedef DWORDHBKWND                                                                                                                                                                                                                                                                        

     连OnCreate(),OnDestroy()都是空的                                                                                                                                            

 这些类大部分代码都是用来绘制控件,以及响应控件坐标行为变动的.                                                                                                                                                  

 CbkContainerWnd内部只有几个空的虚函数而已.                              

                                                                                                                                                  

  CbkPanel这个类用得非常多:

   Class CbkPanel:publicCBkContainerWnd                                                                                                                                                  

                                                                                                                                                                                                                                                                                                        

      CAtlList<CBkWindow *>m_lstWndChild;//这个list包含了所有的内部控件                                                                                                                                              

      _CreateBkWindowByName(LPCSTRlpszName)//动态创建类                                                                                                                                            

                                                                                                                                                   

          CBkWindow*pNewWindow =NULL;                                                                                                                                          

                                                                                                                                                     

                      //根据xml加载的string来用CheckAndNew动态创建                  

             pNewWindow= CBkDialog::CheckAndNew(lpszName);

if(pNewWindow)                     

                    returnpNewWindow;

       ……                                                                                                                                          

   }

void _ComposingPanel(LPWINDOWPOS lpWndPos);//安置控件

}

                                                                                                                                                  

                                                                                                                                             

    这个类把一些消息都分发给了m_lstWndChild里面的控件,如:MouseMove,OnPaint, OnEraseBkgnd,OnDestroy,OnCreate.                                                                                                                                               

 中间的列表也是自绘来的,整个BKWin体系挻复杂烦琐的.正准备用它们的方法模拟个简单的实现,尤于时间不多,原来这WTL方面的项目也很少做,所以只刚开了个头.                                                                                                                                                   

                                                                                                                                                     

                         自定义资源简单使用                                                                                                                   

    自定义资源文件一般放在xxx.rc2文件.                                                                                                                                               

代码如:

IDR_XML1 RESXML "res\\warning_dlg.xml"

ISR_XML_DEF_STR RESXML "res\\def_style.xml"                                                                                                                                          

格式为:资源ID  资源类型    资源位置                                                                                                                                                 

程序运行时释放资源:

    HINSTANCEhInstance = ::GetModuleHandle(NULL);//当前exe文件的句柄

    HRSRChResInfo = ::FindResource(hInstance, MAKEINTRESOURCE(IDR_XML1),_T("RESXML"));

    HGLOBALhgRes = ::LoadResource(hInstance, hResInfo);

    DWORD cbRes= ::SizeofResource(hInstance, hResInfo);

    void* pvRes= ::LockResource(hgRes);

 

 

   然后根据指针pvRes,及其长度cbRes使用资源文件.                                                                                                                                               

   最后调用::FreeResource(hgRes)释放.                                                                                                                                                 

 

                          Xml资源文件简单使用

   使用libxml,iconv库以UTF-8格式加载,汉字可使用iconv库转换成GB2312                                                                                                                                            

    docPtr=xmlReadMemory((constchar*)pvRes,cbRes,NULL,"UTF-8",XML_PARSE_RECOVER);

è                                                      iconv_open(),  iconv(), iconv_close().   

 

 

金山XML资源文件定义格式

附加信息加载

在初始化时一般可以看到如下代码:

 

void KAppModule::_InitUIResource()

{

   BkFontPool::SetDefaultFont(_T("宋体"), -12);

BkString::Load(IDR_STRING_DEF);

   BkSkin::LoadSkins(IDR_SKIN_DEF);

   BkStyle::LoadStyles(IDR_STYLE_DEF);

}

 

使用BKString::Load(ID):用来加载XML资源文件.储存在容器CAtlMap<UINT,CString> m_mapString中.使用时利用static函数BKString::Get(ID)释放出来.

 

    staticBkString* _Instance()

    {

       if (!ms_pInstance)

           ms_pInstance = new BkString;

       return ms_pInstance;

    }

BKString设计为特殊模式类,使用时不需要使用实例.类中函数都使用_Instance()函数来返回唯一对象.BKStyle及BKSkin类也类似.

专门用来存储界面上的出现的有关文字.

 

BKSKin和BKStyle是紧密相连的.

BKSkin内里的存储容器是CAtlMap<CStringA,CBkSkinBase *> m_mapPool;

我的理解是这样的:BKSKin是为CBKSkinBase提供服务的.加载,动态创建等.

CbkSkinBase是用来定制绘画行为的一组功能类.如颜色,形状等.

CBKSkinBase的派生类如下:

CBKSkinBase的派生类  关键字(用来匹配xml中的节点名,根据此来生成类实例)

CBKImageSkin         imglst

CbkSkinImgFrame      imgframe

CbkSkinImgHorzExtend imghorzex

CbkSkinButton        button

CbkSkinGradation     gradation

CbkPngSkin           png

一种派生类用于画出一种界面元素.可根据XML节点属性来定制和微调.

Skin XML样例:

<skins>

<imghorzex name=mainbghead src=1left=3/>

<imgframe name=mainbgbody src=2 top=2 left=1 mode=maskcrbg=FBFCFD/>

<imghorzex name=mainbgfoot src=3left=3/>

<png      name=btnStop   src=3subwidth=122/>

</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>

 

 

 

 

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值