AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

用Visual C++实现QQ界面的模拟

51自学网 2015-08-30 http://www.wanshiok.com

  三、登陆时任务栏图标的动态显示

  网络上关于在任务栏上添加图标的代码说明不少,本人也是参考了书书籍和借签了一部分代码后,并做了以下模拟处理。

  基础部分:

NOTIFYICONDATA nid;
//此处在类中定义

void CMyQQDlg::DisplayInTask()
{
if(isDisplayInTask)
{
//初始化nid
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd =this->m_hWnd;
nid.uID = IDR_QQMENU;
nid.uFlags = NIF_ICON | NIF_TIP|NIF_MESSAGE ;
nid.hIcon = m_hIcon;
strcpy (nid.szTip, "任务栏图标");
nid.uCallbackMessage=WM_DISPLAYTASKICON;
Shell_NotifyIcon(NIM_ADD,&nid);
isDisplayInTask=FALSE;
}
else
{
Shell_NotifyIcon(NIM_DELETE,&nid);
isDisplayInTask=true;
}
}

  关于Shell_NotifyIcon这个函数共有三种操作,分别为NIM_ADD, NIM_MODIFY, NIM_DELETE,为系统函数,大家对这个不熟悉也不要紧,也就是实现在任务栏上显示的功能,在程序的OnInitDialog函数中添加如下代码:

isDisplayInTask=true;
DisplayInTask(); //显示到任务栏里面去;
Sleep(500);
OnOutline();
Sleep(500);
OnHidden();
Sleep(500);
OnOutline();
Sleep(500);
OnHidden();

  仅仅是个模拟,并没有考虑到程序的具体操作过程,也可以定义一个时间,然后用 KillTime 函数终止也可以!

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

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

  五、动感十足的抽屉菜单

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

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:基于Visual&nbsp;C++&nbsp;6.0的Add-in编程实例  下一篇:在VC对话框中用ChtmlView控件显示HTML