科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网网络频道QQ界面的模拟实现(下)

QQ界面的模拟实现(下)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本人并未实现人物跳动,并不知道是切换图片,还是更改图片的位置,所以此功能有待各位的指点!

作者:zdnet安全频道 来源:论坛整理 2008年7月25日

关键字: 腾讯 QQ

  • 评论
  • 分享微博
  • 分享邮件

  四、上线时的声音及消息显示时的人物跳动

  本人并未实现人物跳动,并不知道是切换图片,还是更改图片的位置,所以此功能有待各位的指点!

  五、动感十足的抽屉菜单

  我对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,"

  "+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,"

  我的朋友"+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控件,将其设置成很细小,且不可视,定制在对话框的最上和最下位置,这样你就可以随时获得你所需要的按钮移向的位置,另外每个按钮的长宽相同,方便啦处理!

  六、发送消息对话框

  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

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章