Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2069565
  • 博文数量: 909
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 12260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 20:50
文章分类

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 22:39:13

一起学习
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,"\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界面的模拟实现(下)

阅读(246) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~