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

類似 FlashGet/迅雷 的浮動下載條視窗完整實作

     編輯:關於VC++

浮動視窗五大核心特徵

  1. 無標題列、視窗大小貼合背景圖片
  2. 永久置頂顯示 (HWND_TOPMOST)
  3. 客戶區滑鼠左鍵拖曳移動
  4. 支援分層視窗透明度調節 (0-255)
  5. 雙擊喚醒主視窗

關鍵技術逐項實作

1. 無框視窗與尺寸自適應


// 對話框資源設為 POPUP 風格,移除 Title Bar
// 程式碼動態調整視窗大小貼合位圖
CBitmap m_Bitmap;
HBITMAP hBitmap = m_Logo.GetBitmap();
BITMAP bmp; m_Bitmap.GetBitmap(&bmp);
MoveWindow(0, 0, bmp.bmWidth, bmp.bmHeight);
m_Logo.MoveWindow(0, 0, bmp.bmWidth, bmp.bmHeight);
CenterWindow();

2. 置頂顯示

::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

3. 客戶區拖曳移動 (Hit-Test 欺騙法)


UINT CFloatWnd::OnNcHitTest(CPoint pt)
{
    UINT nHitTest = CDialog::OnNcHitTest(pt);
    if (nHitTest == HTCLIENT && ::GetAsyncKeyState(MK_LBUTTON) < 0)
        nHitTest = HTCAPTION; // 告訴系統:使用者在拖曳標題列
    return nHitTest;
}

4. 分層視窗透明度控制


// 啟用 WS_EX_LAYERED 擴展風格 (0x80000)
SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) ^ 0x80000);

// 動態載入 User32.dll 取得 SetLayeredWindowAttributes
void CFloatWnd::OnUpdateTransparent(int iTransparent)
{
    HINSTANCE hInst = LoadLibrary(_T("User32.DLL"));
    if (hInst) {
        typedef BOOL (WINAPI *SLWA)(HWND, COLORREF, BYTE, DWORD);
        SLWA pFun = (SLWA)GetProcAddress(hInst, "SetLayeredWindowAttributes");
        if (pFun) pFun(m_hWnd, 0, (BYTE)iTransparent, LWA_ALPHA); // LWA_ALPHA = 0x2
        FreeLibrary(hInst);
    }
}

5. 雙擊喚醒主視窗


void CFloatWnd::OnNcLButtonDblClk(UINT nFlags, CPoint point)
{
    CWnd* pParent = GetParent();
    if (!pParent->IsWindowVisible()) pParent->ShowWindow(SW_SHOW);
    pParent->SetForegroundWindow();
    CDialog::OnNcLButtonDblClk(nFlags, point);
}

注意:因 OnNcHitTest 回傳 HTCAPTION,雙擊會觸發 WM_NCLBUTTONDBLCLK 而非 WM_LBUTTONDBLCLK。

滑桿控制透明度完整代碼


void CMainDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    int iCurPos = m_Slider.GetPos();
    // 處理 SB_LINELEFT, SB_LINERIGHT, SB_PAGELEFT, SB_PAGERIGHT, SB_THUMBTRACK...
    m_Slider.SetPos(iCurPos);
    pFloatWnd->OnUpdateTransparent(iCurPos);
    CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

執行環境與原始碼

Windows XP SP2 + Visual C++ 6.0 編譯通過。完整原始碼包含右鍵選單、顯示/隱藏切換、程式結束等輔助功能。

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