首页
社区
课程
招聘
[旧帖] (邀请码已发)[原创][原创]MFC中使用BCG构造仿"360漏洞扫描"的界面(申请邀请码) 0.00雪花
发表于: 2010-9-1 22:34 2196

[旧帖] (邀请码已发)[原创][原创]MFC中使用BCG构造仿"360漏洞扫描"的界面(申请邀请码) 0.00雪花

2010-9-1 22:34
2196
最近学习界面设计,研究了下BCG,和大家分享下。见笑了。本来可以直接创建BCG的工程,就可实现。前段时间曾看到有人在问MFC的工程中使用BCG的问题。遂有此文。
360漏洞扫描界面,补丁的展示

QQ医生(现已升级为QQ电脑管家)中漏洞扫描结果展示

我们想要实现这种效果,怎样做呢。最直接想到的是自绘listctrl,codeproject上有份源码CListCtrl and Grouping Rows,实现了类似的功能。但是它在win7,winxp,win2000的界面是不一样的。listctrl的分组只有在winxp以后才有。codeproject上的这个例子在win2000系统下世不支持分组的。QQ和360在win2K到win7的环境下都是同样的界面。都做的很好。

我这里利用BCG来做,顺便说下BCG在MFC中的应用。BCGControlBarPro-V12.00可以到csdn上下载,这里就不上传了。为了使用BCG库,首先要编译出下载的BCG库。
首先建立一个单文档程序
第二步:工具---->选项----->项目和解决方案----->VC++----->包含文件(将BCG头文件所在目录包含进来)
第三步:在stdfax.h中包含头文件
#include <BCGCBProInc.h>
第四步,复制已经编译好的dll和lib文件到建立好的工程目录下,在stdfax.h中先引入
#pragma comment(lib, "BCGCBPRO1200d90.lib")
第五步,使用BCG的类编程。

下面是在MFC中使用BCG实现的效果



实现步骤:

在BCGTestView.h中声明:
public:
        BOOL AddMail (
                LPCTSTR types,
                LPCTSTR strnames,
                LPCTSTR descrs ,
                LPCTSTR times,
                LPCTSTR states);
public:
        CBCGPReportCtrl m_wndGrid;

第二步:在BCGTestView.cpp中实现
BOOL CBcgTestView::AddMail (
LPCTSTR        types,
LPCTSTR       strnames,
LPCTSTR       descrs ,
LPCTSTR       times,
LPCTSTR       states)
{
        CBCGPGridRow* pRow = m_wndGrid.CreateRow (m_wndGrid.GetColumnCount ());

        pRow->GetItem(0)->SetValue(types,FALSE);

        pRow->GetItem (1)->SetValue (strnames, FALSE);
        pRow->GetItem (2)->SetValue (descrs, FALSE);
        pRow->GetItem(3)->SetValue(times,FALSE);
        pRow->GetItem(4)->SetValue(states,FALSE);

        m_wndGrid.AddRow (pRow, FALSE);

        return TRUE;
}

inline int Rand (int nMax)
{
        int nRes = rand () % nMax;
        return min (nRes, nMax - 1);
}

void CBcgTestView::OnInitialUpdate()
{
        CView::OnInitialUpdate();

        // TODO: 在此添加专用代码和/或调用基类
        //ASSERT_VALID (m_wndGrid);

        m_wndGrid.SetScrollBarsStyle (CBCGPScrollBar::BCGP_SBSTYLE_VISUAL_MANAGER);

        CRect rectGrid(0,0,0,0);
        GetClientRect(&rectGrid);
        //rectGrid.top-=2;

        // Create the Windows control and attach it to the Grid object
        m_wndGrid.Create (WS_CHILD | WS_VISIBLE | WS_BORDER, rectGrid, this, IDC_GRDID);

        // Insert columns:
        m_wndGrid.InsertColumn (0, _T("类型"), 100);
        m_wndGrid.InsertColumn (1, _T("补丁名称"), 100);
        m_wndGrid.InsertColumn (2, _T("描述"), 100);
        m_wndGrid.InsertColumn (3, _T("发布日期"), 100);
        m_wndGrid.InsertColumn (4, _T("状态"), 100);
        m_wndGrid.EnableColumnAutoSize (TRUE);
        const int nColumns = m_wndGrid.GetColumnCount ();

#define  TYPE_NUM 3
        LPCTSTR arTypes[TYPE_NUM] =
        {
                _T("可选"),
                _T("重要"),
                _T("紧急"),

        };
#define  TIME_NUM 3
        LPCTSTR arTime[TIME_NUM] =
        {
                _T("2010-06-22"),
                _T("2010-05-15"),
                _T("2009-06-08"),
        };

#define NAMES_NUM         3
        LPCTSTR arNames [NAMES_NUM] =
        {
                _T("KB982312"),
                _T("KB123456"),
                _T("KB956957"),

        };
#define DESCR_NUM        3
        LPCTSTR arDescrs [DESCR_NUM] =
        {
                _T("windows系统安全更新程序"),
                _T("win7更新程序"),
                _T("windows可选补丁"),
        };

#define STATE_NUM        3
        LPCTSTR arState [DESCR_NUM] =
        {
                _T("未修复"),
                _T("已修复"),
                _T("立即修复"),

        };

        for (int i = 0; i <20; i++)
        {
                AddMail (
                        arTypes [Rand (TYPE_NUM)],
                        arNames [Rand (NAMES_NUM)],
                        arDescrs [Rand (DESCR_NUM)],
                        arTime[Rand(TIME_NUM)],
                        arState[Rand(STATE_NUM)]);
        }
        m_wndGrid.InsertGroupColumn(0,0);
        CBCGPVisualManager2007::SetStyle (CBCGPVisualManager2007::VS2007_LunaBlue);
        CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManager2007));
       

        m_wndGrid.AdjustLayout ();
}

注意事项:

编译的BCG库类型要和新建的文档类型相匹配。也即
BCG   编译的库
Debug版本(多字节/UNICODE/共享DLL中使用MFC)
Release(多字节/UNICODE /共享DLL中使用MFC)
MFC
DEBUG版本(多字节/UNICODE/共享DLL中使用MFC )
Release(多字节/UNICODE /共享DLL中使用MFC)
一定要对应,否则出错。

附:我建BCGTest工程中包含了BCG编译的静态库,限于上传大小限制,就不上传了。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 339
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
至于360和QQ实现前面的选择框,只需加几个图片(选中,未选中,等几种状态),实现点击的时候动态变化就行了。
2010-9-1 22:38
0
雪    币: 266
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
一直都很崇拜 会写界面淫
2010-9-28 14:35
0
游客
登录 | 注册 方可回帖
返回
//