您的位置:首页 > 其它

如何创建一个基于金山卫士界面库的工程

2012-07-05 15:12 651 查看
源自:

http://blog.csdn.net/chenyujing1234/article/details/7399014#

 

为了让更多的朋友能够让自己的程序使用上金山卫士的界面库,现将创建界面库的过程用文字说明,希望可以帮助到各位。如果觉得过程麻烦,也可以直接下载创建后的完整代码。

 

基本要求:安装WTL,下载地址:http://wtl.sourceforge.net/。下载解压后,到解压目录的AppWiz子目录下运行setup80.js(对应VS2005)即可安装完毕。
      这是补充:要告诉VS2005编译器WTL下的头文件的位置。

     工具->选项->VC++目录 在包含中加入  D:\WTL80_7161_Final\include

第一步、复制卫士界面库必要的文件
在VS2005中,单击菜单“文件”->“新建”->“项目”,在新建对话框中选择项目类型为“WTL”,模版只有一个“ATL/WTLApplication
Wizard”,选中它并在下方的编辑框中输入项目名和项目位置,这里假设创建后的目录为H:\MyProject\test。单击“确定”,在出现的向导中选择“下一步”,选择“DialogBased”,并单击“Finish”按钮。





下载 (98.64 KB)
2011-9-30 17:27

 

在H:\MyProject\test\test下创建publish文件夹,然后到http://code.ijinshan.com下载金山卫士源代码,将其解压到某个目录,打开其子目录pcmanager\src\publish,将其下的bkres、bkwin、tinyxml和wtlhelper复制到H:\MyProject\test\test\publish下。





下载 (111.41 KB)
2011-9-30 17:29

 

第二步、添加包含目录
在VS2005的“解决方案资源管理器”中,右键点击test项目(注意是项目而不是解决方案),选择属性。





下载 (25.54KB)

2011-9-3017:31

在出现的“test属性页”对话框中,选择左边的“配置属性”->“C/C++”->“常规”项,在右边的“附加包含目录”中输入publish,点击“确定”保存设置。





下载 (109.83KB)

2011-9-3017:38

 

第三步、将Bkres、TinyXML加入项目中
在“解决方案资源管理器”中,右键点击“ResourceFiles”,选择“添加”->“现有项”,定位到publish\bkres目录下,将bkres.rc添加进项目。





下载 (19.21KB)

2011-9-3017:39

然后再在test项目上点击右键,选择“添加”->“新建筛选器”,创建名为publish的筛选器,再在publish下创建TinyXML筛选器(创建筛选器只是为了分类方便,这一步可以略过,文件添加到任何一个筛选器中)。接下来用和以上相同的添加现有项的方法将publish\tinyxml下的所有文件添加到TinyXML筛选器下。





下载 (27.18KB)

2011-9-3017:39

 

第四步、去除TinyXML预编译头设置
展开publish\TinyXML筛选器,右键点击一个cpp文件,选择属性。





下载 (21.34KB)

2011-9-3017:40

点击左边的“配置属性”->“C/C++”->“预编译头”,将右边的“创建/使用预编译头”选项设置为“不使用预编译头”,点击“确定”。





下载 (75.72KB)

2011-9-3017:40

对TinyXML筛选器下所有cpp文件都执行这一步。

第五步,添加必要的代码
主要是替换默认生成的WTL基本对话框的代码,转而使用调用卫士界面库的代码,并且加入卫士界面库必需的定义XML相关文件和图片资源。此处为了方便起见,将代码打包,各位可以直接从附件中下载,将文件替换掉原先创建项目时自动生成的代码,然后将新增的bkwinres.h以及bkwinres.rc2添加到项目中即可。
这里可以看到_tMain函数中的 

[cpp] viewplaincopy

CMainDlg dlgMain;  

 dlgMain.DoModal();  

而构建CMainDlg的方法是:

[cpp] viewplaincopy

class CMainDlg  : public CBkDialogImpl<CMainDlg>  

                , public CWHRoundRectFrameHelper<CMainDlg>  

{  

public:  

    CMainDlg():CBkDialogImpl<CMainDlg>(IDR_BK_MAIN_DIALOG)  

    {  

    }  

  

    BK_NOTIFY_MAP(IDC_RICHVIEW_WIN)  

        BK_NOTIFY_ID_COMMAND(IDC_BTN_CLOSE, OnBtnClose)  

        BK_NOTIFY_ID_COMMAND(IDC_BTN_MIN, OnMinBtnClick)  

    BK_NOTIFY_MAP_END()  

  

    BEGIN_MSG_MAP(CMainDlg)  

        MSG_BK_NOTIFY(IDC_RICHVIEW_WIN)  

        CHAIN_MSG_MAP(CBkDialogImpl<CMainDlg>)  

        CHAIN_MSG_MAP(CWHRoundRectFrameHelper<CMainDlg>)  

        MSG_WM_SYSCOMMAND(OnCommand)  

        MSG_WM_INITDIALOG(OnInitDialog)  

    END_MSG_MAP()  

  

protected:  

    LRESULT OnCommand(UINT wParam, CPoint point);  

    BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam);  

    void OnBtnClose();  

    void OnMinBtnClick();  

};  

CBkDialogImpl CWHRoundRectFrameHelper是金山开源软件中自定义的类,我们在看它们的实现.

[cpp] viewplaincopy

template <class T>  

class CWHRoundRectFrameHelper  

{  

protected:  

  

    SIZE m_sizeWnd;  

  

    void OnSize(UINT nType, CSize size)  

    {  

        T *pT = static_cast<T*>(this);  

  

        if (nType == SIZE_MINIMIZED)  

            return;  

  

        if (size == m_sizeWnd)  

            return;  

  

        CRect rcWindow, rcClient;  

        CRgn rgnWindow, rgnMinus, rgnAdd;  

  

        pT->GetWindowRect(rcWindow);  

        pT->GetClientRect(rcClient);  

        pT->ClientToScreen(rcClient);  

  

        rcClient.OffsetRect(- rcWindow.TopLeft());  

  

        rgnWindow.CreateRectRgn(rcClient.left, rcClient.top + 2, rcClient.right, rcClient.bottom - 2);  

        rgnAdd.CreateRectRgn(rcClient.left + 2, rcClient.top, rcClient.right - 2, rcClient.top + 1);  

        rgnWindow.CombineRgn(rgnAdd, RGN_OR);  

        rgnAdd.OffsetRgn(0, rcClient.Height() - 1);  

        rgnWindow.CombineRgn(rgnAdd, RGN_OR);  

        rgnAdd.SetRectRgn(rcClient.left + 1, rcClient.top + 1, rcClient.right - 1, rcClient.top + 2);  

        rgnWindow.CombineRgn(rgnAdd, RGN_OR);  

        rgnAdd.OffsetRgn(0, rcClient.Height() - 3);  

        rgnWindow.CombineRgn(rgnAdd, RGN_OR);  

//         rgnAdd.OffsetRgn(0, rcClient.Height());  

//         rgnWindow.CombineRgn(rgnAdd, RGN_OR);  

  

//         rgnMinus.CreateRectRgn(rcClient.left, rcClient.top, rcClient.left + 2, rcClient.top + 1);  

//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  

//         rgnMinus.OffsetRgn(rcClient.Width() - 2, 0);  

//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  

//         rgnMinus.OffsetRgn(0, rcClient.Height() - 1);  

//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  

//         rgnMinus.OffsetRgn(3 - rcClient.Width(), 0);  

//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  

//   

//         rgnMinus.SetRectRgn(rcClient.left, rcClient.top, rcClient.left + 1, rcClient.top + 2);  

//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  

//         rgnMinus.OffsetRgn(rcClient.Width() - 1, 0);  

//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  

//         rgnMinus.OffsetRgn(0, rcClient.Height() - 2);  

//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  

//         rgnMinus.OffsetRgn(1 - rcClient.Width(), 0);  

//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  

  

        pT->SetWindowRgn(rgnWindow);  

  

        m_sizeWnd = size;  

    }  

  

public:  

  

    BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID = 0)  

    {  

        BOOL bHandled = TRUE;  

  

        switch(dwMsgMapID)  

        {  

        case 0:  

            if (uMsg == WM_SIZE)  

            {  

                OnSize((UINT)wParam, _WTYPES_NS::CSize(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)));  

                lResult = 0;  

            }  

            break;  

        }  

        return FALSE;  

    }  

};  

 

  在参考了文章《初步分析整理了xml文件与类之间的关联。分享给大家。》后
http://bbs.code.ijinshan.com/thread-1584-1-1.html
得到下图,希望对大家有帮助:



 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息