程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 用VC++仿制金山毒霸專殺工具界面

用VC++仿制金山毒霸專殺工具界面

編輯:vc教程

  金山毒霸2002自推出以來,廣受用戶的喜愛。今天在這裡我要談的不是金山毒霸的功能,而是其別具一格的界面。本人早就對金山毒霸的界面垂涎三尺,如果自己的程序裡能用上金山毒霸那樣的界面,那該多爽!

  說干就干,本著由淺入深的原則,我選擇了金山毒霸的一個附帶工具:Duba_GOP.exe來開刀。該工具在金山毒霸的網站上可以下載到,其界面如圖所示:

  好,開始准備工具:

  提取資源工具:freeRes

  編程工具:VC++

  還有一個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

[1] [2] [3] 下一頁

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved