完全模仿《金山毒霸 2002》附屬工具 `Duba_GOP.exe` 介面:無標題列、全背景貼圖、自繪圖片按鈕、視窗任意拖曳、懸掛桌面頂端自動收縮。
BOOL CInterfaceDlg::OnInitDialog() {
CDialog::OnInitDialog();
ModifyStyle(WS_CAPTION, 0); // 移除標題列
ModifyStyleEx(0, WS_EX_TOOLWINDOW); // 可選:不顯示在工作列
m_bmpBg.LoadBitmap(IDB_BG_MAIN); // 成員變數 CBitmap
return TRUE;
}
void CInterfaceDlg::OnPaint() {
if (IsIconic()) { CDialog::OnPaint(); return; }
CPaintDC dc(this);
CRect rc; GetClientRect(&rc);
CDC memDC; memDC.CreateCompatibleDC(&dc);
CBitmap* pOld = memDC.SelectObject(&m_bmpBg);
BITMAP bm; m_bmpBg.GetBitmap(&bm);
dc.StretchBlt(0, 0, rc.Width(), rc.Height(), &memDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
memDC.SelectObject(pOld);
}
void CInterfaceDlg::OnLButtonDown(UINT nFlags, CPoint point) {
PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
}
// 對話框成員
CBitmapButton m_btnClose, m_btnHome, m_btnScan, m_btnBrowse;
BOOL CInterfaceDlg::OnInitDialog() {
// ... 前述代碼 ...
m_btnClose.LoadBitmaps(IDB_CLOSE_N, IDB_CLOSE_D, IDB_CLOSE_H); // 正常/按下/游標懸停
m_btnClose.SubclassDlgItem(IDC_BTN_CLOSE, this);
m_btnClose.SizeToContent();
// 同樣處理 Home, Scan, Browse
// 手動 MoveWindow 到背景圖對應座標
}
void CInterfaceDlg::OnBtnScan() {
if (m_bScanning) {
m_btnScan.LoadBitmaps(IDB_SCAN_N, IDB_SCAN_D, IDB_SCAN_H); // 還原「開始掃描」
m_bScanning = FALSE;
} else {
m_btnScan.LoadBitmaps(IDB_STOP_N, IDB_STOP_D, IDB_STOP_H); // 切換為「停止」
m_bScanning = TRUE;
}
}
void CInterfaceDlg::OnTimer(UINT_PTR nID) {
if (nID == TIMER_HANG) {
CPoint pt; GetCursorPos(&pt);
CRect rc; GetWindowRect(&rc);
if (rc.PtInRect(pt)) {
if (rc.top <= 2) MoveWindow(rc.left, 0, rc.Width(), rc.Height());
} else {
if (rc.top <= 2) MoveWindow(rc.left, 0, rc.Width(), 3); // 只留 3 像素細線
}
}
CDialog::OnTimer(nID);
}
| 資源 ID | 用途 | 尺寸建議 |
|---|---|---|
| IDB_BG_MAIN | 主視窗背景 (含標題列、底部 Logo) | 400x300 |
| IDB_CLOSE_N/D/H | 關閉按鈕 三態 | 18x18 |
| IDB_HOME_N/D/H | 首頁按鈕 三態 | 18x18 |
| IDB_SCAN_N/D/H | 開始掃描 三態 | 80x24 |
| IDB_STOP_N/D/H | 停止掃描 三態 | 80x24 |
| IDB_BROWSE_N/D/H | 瀏覽資料夾 三態 | 80x24 |