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

刺猬DING庚

刺猬DING庚

2016-02-19 21:43

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

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

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

  好,开始准备工具:

  提取资源工具:freeRes

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

  编程工具:VC++

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

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

  之所以不用大家都熟悉的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类来实现:

  在窗体上添加四个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);
/

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
用VC++仿制金山毒霸专杀工具界面

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

C语言教程 C语言函数
仿制金山毒霸专杀工具界面

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

金山毒霸免费wifi怎么用

电脑网络
金山毒霸免费wifi怎么用

金山毒霸9 界面设计欣赏

平面设计 标志设计 UI设计 VI设计
金山毒霸9 界面设计欣赏

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

金山毒霸风险修复怎么用

电脑网络
金山毒霸风险修复怎么用

金山毒霸怎么关闭热点 金山毒霸怎么永久关闭热点

软件教程
金山毒霸怎么关闭热点  金山毒霸怎么永久关闭热点

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

VC++中非法探取密码的原理及其防范

VC++中非法探取密码的原理及其防范

WORD2003文档排版

WORD2003文档排版
下拉加载更多内容 ↓