用VC++仿制金山毒霸专杀工具界面

2016-02-19 21:43 29 1 收藏

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的用VC++仿制金山毒霸专杀工具界面,过去的都会过去,迎接崭新的开始,释放更美好的自己。

【 tulaoshi.com - 编程语言 】

  金山毒霸2002自推出以来,广受用户的喜爱。今天在这里我要谈的不是金山毒霸的功能,而是其别具一格的界面。本人早就对金山毒霸的界面垂涎三尺,如果自己的程序里能用上金山毒霸那样的界面,那该多爽!

  说干就干,本着由浅入深的原则,我选择了金山毒霸的一个附带工具:Duba_GOP.exe来开刀。该工具在金山毒霸的网站上可以下载到,其界面如图所示:

  好,开始准备工具:

  提取资源工具:freeRes

  编程工具:VC++

  还有一个Vc自带的小工具:spy++

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  之所以不用大家都熟悉的eXeScope,是因为Duba_GOP.exe已经被压缩过了,有些资源提取工具无法再用。

  用freeRes打开Duba_GOP.exe,可看到其带有20个bmp位图,有整个窗体的背景图,右上角两个小按钮“主页”和“关闭”的三态位图,以及两个大按钮“浏览文件夹”和“开始扫描”的三态位图。看到这些图片,即可猜到该软件是没有标题栏的,而显示出来的标题栏只是背景,而且连同窗体下部的金山毒霸的标志都是属于同一幅背景图片!那么“标题栏”上的“主页”,“关闭”是怎么回事?用spy++来试一下,发现这两个是Button,而不是Bitmap。同样“浏览文件夹”和“开始扫描”也是Button,随即想到这四个Button可以用VC中的CBitmap类来实现。而窗体下部的超链接仅仅是Static静态框。把这些难点分析出来了,下面就可以开始我们的编程之旅了,不过记得把有用的图片保存下来。

  一.窗体背景问题

  打开vc,新建一个对话框工程,名为Interface。去掉缺省的一个Static和两个Button,在窗体上点右键,在出现的属性对话框中,去掉标题栏,再将用freeRes提取的所有图片Import进工程的资源中。修改CInterfaceDlg::OnPaint()如下:

void CInterfaceDlg::OnPaint()
{
  if (IsIconic())
  {
    CPaintDC dc(this); // device context for painting
    SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
    // Center icon in client rectangle
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2;
    // Draw the icon
    dc.DrawIcon(x, y, m_hIcon);
  }
  else
  {
//   CDialog::OnPaint();//将这一句注销掉
    ***************************************************************
    CPaintDC dc(this);
    CRect rect;
    GetClientRect(&rect);//得到窗体的大小
    CDC dcMem;
    dcMem.CreateCompatibleDC(&dc);
    CBitmap bmpBackground;
    bmpBackground.LoadBitmap(IDB_BITMAPBACKGROUND);//加载背景图片
    BITMAP bitMap;
    bmpBackground.GetBitmap(&bitMap);
    CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
    dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);//画窗体
    **************************************************************
  }
}

  其中两个“*”行之间的部分为所添加部分。

  这段代码的作用是将那幅背景图片画在窗体上, 其中我使用了StretchBlt来画出窗体,StretchBlt比BitBlt要慢许多,如果你想得到更好的速度,可以考虑建立与背景位图相同尺寸的窗体,然后用BitBlt来画出。CBitmap bmpBackground;最好作为CInterfaceDlg的成员变量并在CInterfaceDlg::OnInitDialog中提前加载位图,感兴趣的朋友可以试试。

  编译,运行。可看到修改后的效果,由于该图片是平铺在窗体上的,如果图片和窗体尺寸不一致就会导致图片发生扭曲。因此可将窗体调整到与图片相同或相近的尺寸大小,那么运行后看起来就顺眼多了。但是窗体边框还是不大对劲,于是再进vc的资源编辑器,将窗体的Border由“Dialog Frame”该为“Thin”,重新编译,运行,搞定!

  但是没过一秒钟就觉得这话说早了,标题栏没了,窗体怎么移动啊?

别急,车到山前必有路,我们不妨骗骗Windows。当我们的鼠标在窗体任意位置上拖动鼠标时,让Windows以为鼠标在标题栏上拖动,不就可以实现任意点击窗体的什么地方都可以移动窗体了吗?于是在CInterfaceDlg::OnLButtonDown(UINT nFlags, CPoint point)中添加下面一句:PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x, point.y));该语句的作用是向系统发送HTCAPTION消息,让系统以为鼠标点在标题栏上。
  现在编译,运行,真的搞定了!

  二.按钮问题

  Duba_GOP.exe中包括两类按钮,第一类就是上面所说的四个图片按钮,可以CBitmap类来实现:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  在窗体上添加四个Button,设为Bitmap和OwnerDraw风格。为窗体添加4个CBitmap的成员变量,比如:

CBitmapButton  m_StartBtn;并与这四个Button关联上,再在CInterfaceDlg::OnInitDialog()中添加:m_StartBtn.LoadBitmaps(IDB_BITMAPONNORMAL,IDB_BITMAPONDOWN);//让窗体初始化时就加载按钮位图其中IDB_BITMAPONNORMA是一般状态下的按钮的图片ID,IDB_BITMAPONDOWN是鼠标按下时的按钮的图片ID。 合理摆放这四个按钮的位置,使其与Duba_GOP.exe界面上的位置一致,现在运行一下看看,界面增色不少吧。只是有一点:“开始扫描”这个按钮比较特殊,当鼠标点击时,会变成停止的位图,当再次点击时,又变成开始的位图,因此这个按钮拥有两套,4个位图。为此,再为CInterfaceDlg添加一个成员变量: BOOL m_bEnable;并在CInterfaceDlg::OnInitDialog()中设其初值为True。

  然后在点击“开始扫描”按钮的相应事件CInterfaceDlg::OnStartbtn()中添加:if(m_bEnable)
  {
    m_StartBtn.LoadBitmaps(IDB_BITMAPOFFNORMAL,IDB_BITMAPOFFDOWN);//加载位图
    m_bEnable=false;
    m_StartBtn.RedrawWindow();
  }
  else
  {
    m_StartBtn.LoadBitmaps(IDB_BITMAPONNORMAL,IDB_BITMAPONDOWN);//加载另一套位图
    m_bEnable=true;
    m_StartBtn.RedrawWindow();
  }以上代码的作用是控制两套位图的切换。

  好了,现在轮到Duba_GOP.exe界面中上部的那三个CheckBox风格的Button了。首先添加三个这样的按钮,但看上去与Duba_GOP.exe的按钮不太一样,于是将我的三个按钮加上“平坦”的风格,OK,行了。---www.bianceng.cn

  编译,运行,顿时大吃一惊,原来新添加的三个CheckBox的背景还是缺省的灰色,与白色的窗体背景极不协调,非常难看。看来需要改变该类Button的背景颜色了。于是,从CButton类派生出一个CColorButton类,其主要代码如下: // ColorButton.h : header file
class CColorButton : public CButton
{
……//省略了无关代码
public:
  CBrush m_brush;
  void SetBackColor(COLORREF BackColor);
protected:
  COLORREF m_BackColor;
  //{{AFX_MSG(CColorButton)
  afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
/

来源:https://www.tulaoshi.com/n/20160219/1626956.html

延伸阅读
标签: 电脑入门
1、定时查毒好处多 如今20GB的硬盘,杀毒再快,时间也是较长的。于是定时查毒就派上用场了,你可以固定一个你休息的时候查毒,不用经历长时间的等待,到时候就帮你解决了。定时查毒还有另一个功效,帮你记住一些难以忘却的日子,比如4月26日CIH发作日等。 此外,软件的升级周期是一周一次,所以建议定时查毒的周期也是每周一次,一升级就查...
金山毒霸如何锁定主页 (1)打开金山毒霸后,点击浏览器保护; (2)IE默认主页选择内选择空白内的hao123网址导航,按一键锁定即可。         注 :更多精彩教程请关注图老师电脑教程栏目
查看金山毒霸监控事件   金山毒霸是老牌的国内杀毒软件之一。普通用户在使用金山毒霸的过程中,通常都会感觉到金山毒霸似乎比较文静。在电脑系统比较安全的情况下,它并不会主动弹出各种提示来,与用户进行交流。我们在做一些杀毒软件使用反馈的调查中也发现,在普通安全的电脑中,杀毒软件似乎如同休眠一般的安静。但事实是不是真的...
金山毒霸热点怎么关闭   1.点击右上角的菜单按钮,然后。 2.选择,点击即可。 从今以后金山毒霸热点弹窗就永远都不会弹出来了。
如何用金山毒霸照片恢复   第一步:毒霸主界面的"百宝箱"中: 第二步:百宝箱照片恢复,点击"照片恢复",显示如下界面: 第三步:继续点击"闪电恢复",系统经过短暂扫描以后,显示如下界面: 第四步:勾选需要恢复的照片,点击"恢复选中文件",即可看到:选择恢复文...

经验教程

808

收藏

28
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部