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);
}
}
詳細講解抽屜選單滑動動畫、訊息對話框非模態管理、桌面懸掛收縮邏輯。