当前位置: 首页 > 图文教程 > 开发语言 > VC++ > QQ界面的模拟实现(下)

VC++
指向类成员
防止信号处理失灵
用转换操作符保护代码的安全
C++ 中重载 + 操作符的正确方法
删除托管对象,如何果包装一个库?及其它......
调用虚拟函数,持续化视图状态,POD 类型概念
关于volatile关键字的说明以及测试
C++/VC++编程的疑难问题及解答(二)
揭开C/C++中数组形参的迷雾
C++对象计数
实现真正意义上的二维动态数组模板
C语言和Fortran语言
C++中的 static 关键字
C++/VC++编程的疑难问题及解答
C/C++作用域引申出的编码规范
GRETA正则表达式模板类库
一个简单的链表模版类的实现
CString 操作指南
深入理解sizeof
源码统计器1.1版

VC++ 中的 QQ界面的模拟实现(下)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 72 ::
收藏到网摘: n/a

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()%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_L