学卫网教程:是一个免费提供流行杀毒软件教程、在线学习分享的学习平台!

金山卫士开源软件之旅(二) 容易指南:怎么创建1个基于金山卫士界面库的工程-程序设计

金山卫士它采用金山领先的云安全技术,不仅能查杀上亿已知木马,还能5分钟内发现新木马;漏洞检测针对windows7优化,速度更快;更有实时保护、插件清理、修复IE等功能,全面保护电脑的系统安全。
上一篇 http://www.2cto.com/kf/201203/125262.html


完整解决方案代码压缩包:test_full.zip http://up.2cto.com/2012/0328/20120328061229666.zip
 (267.59 KB)
 
参考:
 
http://bbs.code.ijinshan.com/thread-1391-1-1.html
 
为了让更多的朋友能够让自己的程序使用上金山卫士的界面库,现将创建界面库的过程用文字说明,希望可以帮助到各位。如果觉得过程麻烦,也可以直接下载创建后的完整代码。
 
 
基本要求:安装WTL,下载地址:http://wtl.sourceforge.net/。下载解压后,到解压目录的AppWiz子目录下运行setup80.js(对应VS2005)即可安装完毕。
 
       这是补充:要告诉VS2005编译器WTL下的头文件的位置。
 
      工具->选项->VC++目录 在包含中加入    D:\WTL80_7161_Final\include
 
第一步、复制卫士界面库必要的文件
 
在VS2005中,单击菜单“文件”->“新建”->“项目”,在新建对话框中选择项目类型为“WTL”,模版只有一个“ATL/WTL Application Wizard”,选中它并在下方的编辑框中输入项目名和项目位置,这里假设创建后的目录为H:\MyProject\test。单击“确定”,在出现的向导中选择“下一步”,选择“Dialog Based”,并单击“Finish”按钮。


图片1.png

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


图片2.png

第二步、添加包含目录

在VS2005的“解决方案资源管理器”中,右键点击test项目(注意是项目而不是解决方案),选择属性。


图片3.png

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

 第三步、将Bkres、TinyXML加入项目中

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


图片5.png


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

 


图片6.png

第四步、去除TinyXML预编译头设置

展开publish\TinyXML筛选器,右键点击一个cpp文件,选择属性。


图片7.png

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

 


 图片8.png

  
对TinyXML筛选器下所有cpp文件都执行这一步。
 
 
第五步,添加必要的代码
 
主要是替换默认生成的WTL基本对话框的代码,转而使用调用卫士界面库的代码,并且加入卫士界面库必需的定义XML相关文件和图片资源。此处为了方便起见,将代码打包,各位可以直接从附件中下载,将文件替换掉原先创建项目时自动生成的代码,然后将新增的bkwinres.h以及bkwinres.rc2添加到项目中即可。
 
这里可以看到_tMain函数中的
 
CMainDlg dlgMain; 
 dlgMain.DoModal(); 
 
而构建CMainDlg的方法是:
 
 
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是金山开源软件中自定义的类,我们在看它们的实现.
 
 
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; 
    } 
}; 
 
 
 
 
////////////////////////////////////////////////////////////////////////// 
// CBkDialogImpl 
 
template <class T, class TBkView = CBkDialogView, class TBase = CWindow, class TWinTraits = CControlWinTraits> 
class ATL_NO_VTABLE CBkDialogImpl : public CWindowImpl<T, TBase, TWinTraits> 

public: 
 
    static BOOL IsWinXPAndLater() 
    { 
        DWORD dwVersion = GetVersion(); 
        DWORD dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); 
        DWORD dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); 
 
        if (dwMajorVersion > 5)         // Vista and later 
            return TRUE; 
        else if (dwMajorVersion < 5)    // 98/NT4 and before 
            return FALSE; 
        else if (dwMinorVersion > 0)    // XP and 2003 
            return TRUE; 
        else                            // 2000 
            return FALSE; 
    } 
 
    static ATL::CWndClassInfo& GetWndClassInfo() 
    { 
        static ATL::CWndClassInfo wc = { 
                { sizeof(WNDCLASSEX),  
                CS_HREDRAW
软件下载:      

(网视站,专业提供浏览器下载)

标签:软件 金山 程序 如何 

相关软件

2345安全卫士最新官方版

2345安全卫士官方版 | 45.34MB

2345安全卫士官方版

2345安全卫士是集电脑体检、木马查杀、垃圾清理、修复系统漏洞、系统加速、软件管理等功能为一体的电脑安全管理的软件.提供全方位检测,用户可以通过检测结果快速了解自己的电脑并且对电脑进行优化..

360杀毒软件官方正式版

360杀毒软件官方正式版 | 35.10MB

360杀毒软件官方正式版

360杀毒具有查杀率高、资源占用少、升级迅速等优点。零广告、零打扰、零胁迫,一键扫描,快速、全面地诊断系统安全状况和健康程度,并进行精准修复,带来安全、专业、有效、新颖的查杀防护体验...

360安全卫士最新版下载

360安全卫士最新版下载 | 50.3MB

360安全卫士最新版下载

360安全卫士是一款由奇虎360公司推出的功能强、效果好、受用户欢迎的安全杀毒软件。360安全卫士拥有查杀木马、清理插件、修复漏洞、电脑体检、电脑救援、保护隐私,电脑专家,清理垃圾,清理痕迹...

QQ电脑管家官方正式版

QQ电脑管家官方正式版 | 24.2MB

QQ电脑管家官方正式版

腾讯电脑管家(Tencent PC Manager/原名QQ电脑管家)是腾讯公司推出的免费安全软件。拥有云查杀木马,系统加速,漏洞修复,实时防护,网速保护,电脑诊所,健康小助手...

金山毒霸2022最新版下载

金山毒霸2022下载 | 37MB

金山毒霸2018最新版下载

金山毒霸融合了启发式搜索、代码分析、虚拟机查毒等技术。经业界证明成熟可靠的反病毒技术,以及丰富的经验,使其在查杀病毒种类、查杀病毒速度、未知病毒防治等多方面达到世界先进水平...

猎豹清理大师官方版下载

猎豹清理大师下载 | 47.4MB

猎豹清理大师官方版下载

猎豹清理大师(原金山清理大师)是由金山网络开发的智能手机应用。它可以清理智能手机上的应用缓存、残余程序文件、历史痕迹以及应用程序安装包...