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

VC++
泛型编程-转移构造函数(Generic Programming: Move Constructor)
C++中的废料收集
C语言中trim的实现
使非MFC窗口程序的窗口回调过程成为C++类的成员函数
可用于数论计算的无符号大整数类
基于位操作的类CBitBuffer
What are you, Anyway?
《新加坡程序员考题一则及分析》的讨论
关于拷贝构造函数和赋值运算符
简单模板概念
析构函数的奥秘
从软件工程的角度看const的用法
泛型编程:再现Min和Max
Tuples
运用设计模式设计MIME编码类
const传奇
使用namespace的正确方法
新加坡程序员考题一则及分析
在C++中实现属性
深入分析MFC中的CArray类

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 78 ::
收藏到网摘: 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