转载请标明是引用于 http://blog.csdn.net/chenyujing1234
代码:
http://www.rayfile.com/zh-cn/files/43e39bde-8b68-11e1-8d11-0015c55db73d/
测试工程参考我的另一篇文章<<金山卫士开源软件之旅(二) 简单教程:如何创建一个基于金山卫士界面库的工程>>:
http://blog.csdn.net/chenyujing1234/article/details/7399014
最近在金山开源文坛上学习了网友添加控件的方法,这里做个综合,分享给大家.
添加的步骤(以CBkEdit为例):
1、完成控件bkwndedit.h代码。
具体实现方法请参考代码,这里主要分析加入的控件与外部的接口
class CBkEdit : public CBkWindow
{
BKOBJ_DECLARE_CLASS_NAME(CBkEdit, "edit")
........
}
// BkObject Class Name Declaration #define BKOBJ_DECLARE_CLASS_NAME(theclass, classname) \ public: \ static theclass* CheckAndNew(LPCSTR lpszName) \ { \ if (strcmp(GetClassName(), lpszName) == 0) \ return new theclass; \ else \ return NULL; \ } \ \ static LPCSTR GetClassName() \ { \ return classname; \ } \ \ virtual LPCSTR GetObjectClass() \ { \ return classname; \ } \ \ virtual BOOL IsClass(LPCSTR lpszName) \ { \ return strcmp(GetClassName(), lpszName) == 0; \ } \
上面的宏中classname就是我们在IDR_BK_MAIN_DIALOG(即res\\dlg_main.xml 文件,这个文件名可设定的)
中要加入的节点的控件名字.这在下面会讲到.
2、在bkwndpanel.h中添加头文件
#include "bkwndedit.h"
并在inline CBkWindow* CBkPanel::_CreateBkWindowByName(LPCSTR lpszName)
添加代码
inline CBkWindow* CBkPanel::_CreateBkWindowByName(LPCSTR lpszName) { CBkWindow *pNewWindow = NULL; pNewWindow = CBkEdit::CheckAndNew(lpszName); if (pNewWindow) return pNewWindow;
第二步是根据XML主界面文件中的
<edit id="200" defaultfont="0200" pos="100,355,230,375">编辑框</edit>
节点前名edit传给lpszName,然后根据名字去调用CheckAndNew函数。这个函数就是上第1点中讲到的宏里定义的.
这里补充讲一下加载过程,让大家明白做第二步的原因.=========================================================================================
而红色函数 BOOL LoadChilds(TiXmlElement* pTiXmlChildElem)
的实现是
BOOL LoadChilds(TiXmlElement* pTiXmlChildElem) { BkSendMessage(WM_DESTROY); BOOL bVisible = IsVisible(TRUE); for (TiXmlElement* pXmlChild = pTiXmlChildElem; NULL != pXmlChild; pXmlChild = pXmlChild->NextSiblingElement()) { CBkWindow *pNewChildWindow = _CreateBkWindowByName(pXmlChild->Value()); if (!pNewChildWindow) continue; // int nID = 0; // pXmlChild->Attribute("id", &nID); pNewChildWindow->SetParent(m_hBkWnd); pNewChildWindow->SetContainer(m_hWndContainer); pNewChildWindow->Load(pXmlChild); // if (pNewChildWindow->IsVisible()) // pNewChildWindow->BkSendMessage(WM_SHOWWINDOW, bVisible); m_lstWndChild.AddTail(pNewChildWindow); } return TRUE; }
里面的CreateBkWindowByName函数就是我们修改的部分,如果没有添加的话那么就不会去创建CBkEdit对象了.
3、在主界面文件中添加节点
<body class="dialogbody" width="full" height="full">
<dlg pos="3,0,-3,-0">
<text pos="20,350,100,370">用户名:</text>
<edit id="200" defaultfont="0200" pos="100,355,230,375">编辑框</edit>
<combo id="1000" pos="10,30,100,50"></combo>
</dlg>
</body>
==============================================================================================
参考文章:
http://bbs.code.ijinshan.com/thread-1861-1-1.html