2008年(909)
分类:
2008-05-06 22:39:13
下载源代码
四、上线时的声音及消息显示时的人物跳动
本人并未实现人物跳动,并不知道是切换图片,还是更改图片的位置,所以此功能有待各位的指点!
五、动感十足的抽屉菜单
我对QQ的这个菜单印象特深,犹其是配的“刷”的声音,充分体验到QQ的生动! 下面就详细介绍自己是如何一步步实现的:
说明:
在程序的一开始就获得最顶端按钮的位置:
// 将该对话框放置到右上角; GetWindowRect(&dlgrect); MoveWindow(GetSystemMetrics(SM_CXSCREEN)-dlgrect.Width()-20, 0, dlgrect.Width(), dlgrect.Height(), true); ////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// // 获取得第一个按钮和最后一个按钮的位置 GetDlgItem(IDC_QQFRIEND)->GetWindowRect(&rect0); ScreenToClient(&rect0); GetDlgItem(IDC_QQQUN)->GetWindowRect(&rect1); ScreenToClient(&rect1);用一个重要的函数分别处理当按下不同铵钮时的反应:
void CMyQQDlg::ChangeView() { // 开始对按钮进行各个处理 if(TopButtonNum!=1&&clicknum==1) { ////////////////////////////////////////////////////////////////////////// // QQ好友按钮已经置于最上层 // 所以无需移动 // 其余全置于下面 m_QQothers.MoveWindow(0, rect1.bottom, rect0.Width(), rect0.Height(), true); m_QQqun.MoveWindow(0, rect1.bottom-rect0.Height(), rect0.Width(), rect0.Height(), true); ////////////////////////////////////////////////////////////////////////// // QQ好友 if(isBigFace) { m_List1.SetImageList(&m_imagelist2, LVSIL_SMALL); } else { m_List1.SetImageList(&m_imagelist1, LVSIL_SMALL); } m_List1.DeleteAllItems(); for(int i=1; i<34; i ) { m_List1.InsertItem(0xffff,"", -1); m_List1.InsertItem(0xffff,"\n" myClass[i-1], i); } m_List1.InsertItem(0xffff,"", -1); ////////////////////////////////////////////////////////////////////////// // 显示该栏目的下的QQ好友, 隐藏其它栏目; m_List1.ShowWindow(SW_SHOW); m_List2.ShowWindow(SW_HIDE); treeCtrl.ShowWindow(SW_HIDE); return; } if(TopButtonNum!=2&&clicknum==2) { // 先将排在它上面的按钮置上不闻; m_QQqun.MoveWindow(0, rect0.bottom, rect0.Width(), rect0.Height(), true); // 将排在它后面的按钮置后; m_QQothers.MoveWindow(0, rect1.bottom, rect0.Width(), rect0.Height(), true); // 显示该栏目的下的QQ群, 隐藏其它栏目; m_List1.ShowWindow(SW_HIDE); m_List2.ShowWindow(SW_HIDE); treeCtrl.ShowWindow(SW_SHOW); return; } ////////////////////////////////////////////////////////////////////////// //* ignoring these codes; if(TopButtonNum!=3&&clicknum==3) { // 全部挤到上面去 m_QQfriend.MoveWindow(0, rect0.top, rect0.Width(), rect0.Height(), true); m_QQqun.MoveWindow(0, rect0.bottom, rect0.Width(), rect0.Height(), true); m_QQothers.MoveWindow(0, rect0.bottom rect0.Height(), rect0.Width(), rect0.Height(), true); ////////////////////////////////////////////////////////////////////////// // 随机产生最近联系人 m_List2.DeleteAllItems(); for(int i=1; i<18; i ) { int j=rand()3; m_List2.InsertItem(0xffff,"", -1); m_List2.InsertItem(0xffff,"\n我的朋友" i, j); } m_List2.InsertItem(0xffff,"", -1); // 显示该栏目的下的QQ联系人或其它, 隐藏其它栏目; m_List1.ShowWindow(SW_HIDE); treeCtrl.ShowWindow(SW_HIDE); m_List2.ShowWindow(SW_SHOW); return; } //*/ //////////////////////////////////////////////////////////////////////////另外大家在处理的过程中,可以在QQ好友和最后一个菜单,这里是最近联系人,可以加一个picture控件,将其设置成很细小,且不可视,定制在对话框的最上和最下位置,这样你就可以随时获得你所需要的按钮移向的位置,另外每个按钮的长宽相同,方便啦处理!
六、发送消息对话框
在这里只讲两部分:
1.动态产生消息对话框
2.按Ctrl Enter键发送消息
动态产生对话框,一般是先在资源中建立一个对话框模板,用Create函数产生一个对话框实例,
本程序是这样实现的:
void CMyQQDlg::OnDblclkMyFriend(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; int m_nCurrentSel = pNMListView->iItem; CString str; str=m_List1.GetItemText(m_nCurrentSel, NULL); CQQSendMessage *dlg=new CQQSendMessage; dlg->msg=str; dlg->Create(IDD_QQ_MESSAGE); dlg->SetWindowText("你正在与" str "聊天当中"); dlg->SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), false); dlg->ShowWindow(SW_SHOW); *pResult = 0; }第2个键盘发送可以做如下处理:
BOOL CQQSendMessage::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if(pMsg->message==WM_KEYDOWN) { if(pMsg->wParam==VK_RETURN && GetKeyState(VK_CONTROL)&0x80) { { //处理发送对话的内容 OnSend(); return 1; } } } return CDialog::PreTranslateMessage(pMsg); }这样你按下Ctrl Enter键后就会处理OnSend()函数,这样就可以实现快捷键 发送消息啦!
七、在桌面顶端上悬挂QQ
这样的实现不知道满意不满意,可以用一个时间片,时刻测试鼠标的坐标,并判断它所处的范围,以判断是否悬挂对话框!
悬挂QQ,并不是让其隐藏而是要留下只剩下一根细线,当鼠标移到这根细线的时候,就立刻反显示!
悬挂代码如下:
LPPOINT pt=new CPoint; GetCursorPos(pt); CRect rect; GetWindowRect(&rect); if(rect.PtInRect(*pt)) { if(rect.top<=2) { MoveWindow(rect.left, rect.top, dlgrect.Width(), dlgrect.Height(), true); } } else { if(rect.top<=2) { MoveWindow(rect.left, 0, rect.Width(), 3, true); } } delete pt;
小结:
不知道通过上面的讲述,你是否感爱到QQ的巧妙?由于本人也在学习阶段,所以分析的也不是很到位,但也希望通过这次学习能有所提高,可以与本人联系:
xuwenq88@126.com
谢谢!
下载本文示例代码
QQ界面的模拟实现(下)QQ界面的模拟实现(下)QQ界面的模拟实现(下)QQ界面的模拟实现(下)QQ界面的模拟实现(下)QQ界面的模拟实现(下)QQ界面的模拟实现(下)QQ界面的模拟实现(下)QQ界面的模拟实现(下)QQ界面的模拟实现(下)QQ界面的模拟实现(下)QQ界面的模拟实现(下)