程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> VC模擬實現QQ界面(下)

VC模擬實現QQ界面(下)

編輯:關於VC++

四、上線時的聲音及消息顯示時的人物跳動

本人並未實現人物跳動,並不知道是切換圖片,還是更改圖片的位置,所以此功能有待各位的指點!

五、動感十足的抽屜菜單

我對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()%33;
       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的巧妙?由於本人也在學習階段,所以分析的也不是很到位,但也希望通過這次學習能有所提高,可以與本人聯系: [email protected]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved