金山开源(金山卫士开源软件之旅 添加控件CBkEdit与CbkCombo)

发布时间:2025-12-10 19:27:07 浏览次数:23

金山卫士开源软件之旅 添加控件CBkEdit与CbkCombo-金山开源饭店

金山卫士开源软件之旅(六) 添加控件CBkEdit与CbkCombo转载请标明是引用于http://blog.csdn.net/chenyujing1234代码:http://www.rayfile.com/zh-cn/files/43e39bde-8b68-11e1-8d11-0015c55db73d/测试工程参考我的另一篇文章金山卫士开源软件之旅(二)简单教程:如何创建一个基于金山卫士界面库的工程>>:http://blog.csdn.ne

转载请标明是引用于 金山卫士开源软件之旅(六) 添加控件CBkEdit与CbkCombo

代码:

http://www.rayfile.com/zh-cn/files/43e39bde-8b68-11e1-8d11-0015c55db73d/

测试工程参考我的另一篇文章<<金山卫士开源软件之旅(二) 简单教程:如何创建一个基于金山卫士界面库的工程>>:

金山卫士开源软件之旅(六) 添加控件CBkEdit与CbkCombo

最近在金山开源文坛上学习了网友添加控件的方法,这里做个综合,分享给大家.

添加的步骤(以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

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477