首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 仿製金山毒霸專殺工具介面:無標題列、圖形按鈕、自繪背景

     編輯:關於VC++

目標:金山毒霸 2002 附屬工具 Duba_GOP.exe 介面。工具:freeRes 提取資源、Spy++ 分析視窗結構、VC++ 開發。

資源分析

  • 20 張 BMP:完整視窗背景、右上角「主頁/關閉」三態按鈕、底部「瀏覽/掃描」三態大按鈕
  • 無標題列,視覺上標題列實為背景圖一部分
  • 四個圖形按鈕實為 Button 控制項(OwnerDraw)
  • 底部超連結為 Static 控制項

一、視窗背景自繪

void CInterfaceDlg::OnPaint()
{
    if (IsIconic()) { /* 圖示繪製 */ }
    else
    {
        // CDialog::OnPaint();  // 註解掉預設繪製
        CPaintDC dc(this);
        CRect rect; GetClientRect(&rect);
        CDC dcMem; dcMem.CreateCompatibleDC(&dc);
        CBitmap bmp; bmp.LoadBitmap(IDB_BITMAPBACKGROUND);
        BITMAP bm; bmp.GetBitmap(&bm);
        CBitmap* pOld = dcMem.SelectObject(&bmp);
        dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &dcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
        // 建議:位圖載入移至 OnInitDialog,成員變數保存,提升效能
    }
}

對話框屬性:Border = Thin(移除 Dialog Frame 邊框)。

二、任意位置拖曳視窗

void CInterfaceDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
    // 欺騙系統認為點擊在標題列上
}

三、圖形按鈕實作

1. 四個 OwnerDraw Bitmap 按鈕

// 成員變數
CBitmapButton m_HomeBtn, m_CloseBtn, m_BrowseBtn, m_StartBtn;

// OnInitDialog
m_StartBtn.LoadBitmaps(IDB_BTN_ON_NORMAL, IDB_BTN_ON_DOWN);  // 一般/按下
// 「開始掃描」需切換兩組圖示
BOOL m_bScanning = TRUE;
void CInterfaceDlg::OnStartBtn()
{
    if (m_bScanning)
        m_StartBtn.LoadBitmaps(IDB_BTN_OFF_NORMAL, IDB_BTN_OFF_DOWN);
    else
        m_StartBtn.LoadBitmaps(IDB_BTN_ON_NORMAL, IDB_BTN_ON_DOWN);
    m_bScanning = !m_bScanning;
    m_StartBtn.RedrawWindow();
}

2. 三個扁平化 CheckBox(背景透明)

衍生 CColorButton 處理 WM_CTLCOLOR 回傳自訂畫筆:

class CColorButton : public CButton {
    CBrush m_brush; COLORREF m_clr;
public:
    void SetBackColor(COLORREF clr) { m_clr = clr; m_brush.CreateSolidBrush(clr); }
    afx_msg HBRUSH CtlColor(CDC* pDC, UINT) { pDC->SetBkMode(TRANSPARENT); return m_brush; }
    DECLARE_MESSAGE_MAP()
};
// 使用
m_chk1.SubclassDlgItem(IDC_CHECK1, this);
m_chk1.SetBackColor(RGB(222,223,222));  // 背景色

四、自繪 Static 控制項

衍生 CColorStatic,處理 OnPaint 繪製文字與背景:

void CColorStatic::OnPaint()
{
    CPaintDC dc(this); CRect r; GetClientRect(&r);
    dc.SetBkColor(m_backClr); dc.SetBkMode(TRANSPARENT);
    CFont* pFont = GetParent()->GetFont();
    CFont* pOld = dc.SelectObject(pFont);
    dc.SetTextColor(m_textClr);
    dc.DrawText(m_caption, &r, DT_CENTER);
    dc.SelectObject(pOld);
}

五、任務列圖示與標題修復

無標題列導致任務列無圖示。解決:

// OnInitDialog
SetWindowText("金山毒霸專殺工具");  // 設定標題
ModifyStyle(WS_CAPTION, WS_MINIMIZEBOX, SWP_DRAWFRAME);  // 保留最小化按鈕樣式但隱藏標題列
// 微調底部 Static 位置避免遮蓋背景圖文字
CRect r; m_link3.GetWindowRect(&r); r.OffsetRect(0, 17); m_link3.MoveWindow(r);

ListCtrl 移除邊框樣式。專案在 VC6 + Win98/2K/XP 測試通過。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved