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

VC++ 模擬 QQ 2002 介面完整實戰 (上):資源提取、登入視窗、任務列圖標動畫

     編輯:VC 教學

前置準備

  • 工具:VC++、Resource Hacker (提取圖示/位圖/對話框模板)、Spy++ (檢視視窗類別/樣式)。
  • QQ 安裝目錄 `QQFace` 資料夾含 100 張頭像 BMP,直接匯入資源。

界面剖析

  1. **頭像/圖標**:Resource Hacker 導出 `.ico`、`.bmp`,嵌入專案資源。
  2. **登入視窗**:無標題列、背景貼圖、圓角矩形區域 (可用 `SetWindowRgn`)。
  3. **任務列圖標動畫**:登入過程中圖標閃爍 (在線/隱身/離線 狀態切換)。
  4. **上線音效/企鵝跳動**:`PlaySound` + 定時器切換頭像圖片實現跳動。
  5. **抽屜選單**:左側導航,按鈕點擊面板滑動展開/收合。
  6. **訊息對話框**:非模態、Ctrl+Enter 發送、來訊音效+快速彈出。
  7. **桌面懸掛**:頂端 3px 細線,滑鼠靠近自動展開。

任務列圖標動畫實作


NOTIFYICONDATA nid = { sizeof(NOTIFYICONDATA) };
nid.hWnd = m_hWnd; nid.uID = IDR_TRAYICON;
nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
nid.uCallbackMessage = WM_TRAYNOTIFY;
nid.hIcon = m_hIcon; // 初始圖標
lstrcpy(nid.szTip, _T("QQ 模擬"));

void CMyQQDlg::AnimateTrayIcon() {
    Shell_NotifyIcon(NIM_ADD, &nid); // 加入托盤
    // 登入模擬:在線/隱身 閃爍 4 次
    for (int i=0; i<4; ++i) {
        nid.hIcon = (i%2) ? m_hIconOnline : m_hIconHidden;
        Shell_NotifyIcon(NIM_MODIFY, &nid);
        Sleep(500);
    }
}

登入視窗無標題列背景繪製


BOOL CLoginDlg::OnInitDialog() {
    ModifyStyle(WS_CAPTION, 0);
    m_bmpBg.LoadBitmap(IDB_LOGIN_BG);
    return TRUE;
}
void CLoginDlg::OnPaint() {
    CPaintDC dc(this);
    CRect rc; GetClientRect(&rc);
    CDC mem; mem.CreateCompatibleDC(&dc);
    CBitmap* pOld = mem.SelectObject(&m_bmpBg);
    BITMAP bm; m_bmpBg.GetBitmap(&bm);
    dc.StretchBlt(0,0,rc.Width(),rc.Height(), &mem, 0,0,bm.bmWidth,bm.bmHeight, SRCCOPY);
    mem.SelectObject(pOld);
}

企鵝跳動 (簡易版)


// 定時器 100ms 切換兩張腳部姿態圖片
void CLoginDlg::OnTimer(UINT_PTR nID) {
    if (nID == TIMER_PENGUIN) {
        m_bPenguinUp = !m_bPenguinUp;
        m_picPenguin.SetBitmap(m_bPenguinUp ? m_bmpUp : m_bmpDown);
    }
}

下集預告

詳細講解抽屜選單滑動動畫、訊息對話框非模態管理、桌面懸掛收縮邏輯。

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