QQ 左側導航欄點擊按鈕,對應面板滑動展開,其他面板收合,配合「刷」音效。
// 記錄首個/末個按鈕位置
CRect rcFirst, rcLast;
GetDlgItem(IDC_QQFRIEND)->GetWindowRect(&rcFirst); ScreenToClient(&rcFirst);
GetDlgItem(IDC_QQQUN)->GetWindowRect(&rcLast); ScreenToClient(&rcLast);
void CMyQQDlg::ChangeView(int clickIdx) {
// clickIdx: 1=好友 2=群組 3=最近聯繫人
// 計算目標 Y 座標,MoveWindow 動畫移動面板
// 同時 ShowWindow(SW_SHOW/HIDE) 對應 ListCtrl/TreeCtrl
// 播放音效: PlaySound(_T("slide.wav"), NULL, SND_ASYNC|SND_RESOURCE);
}
void CMyQQDlg::OnDblclkFriend(NMHDR* pNMHDR, LRESULT* pResult) {
NM_LISTVIEW* pLV = (NM_LISTVIEW*)pNMHDR;
CString name = m_List1.GetItemText(pLV->iItem, 0);
CQQSendMsg* dlg = new CQQSendMsg;
dlg->m_strTarget = name;
dlg->Create(IDD_QQ_MESSAGE); // 模態改為非模態
dlg->SetWindowText(_T("正在與 ") + name + _T(" 聊天"));
dlg->ShowWindow(SW_SHOW);
}
BOOL CQQSendMsg::PreTranslateMessage(MSG* pMsg) {
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN &&
(GetKeyState(VK_CONTROL) & 0x8000)) {
OnSend(); return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
void CMyQQDlg::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); // 收縮為 3px 細線
}
}
CDialog::OnTimer(nID);
}
xuwenq88@126.com — 歡迎交流改進建議。