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

VC++
透明窗体的又一实现
橡皮区矩形 CRectTracker C# 实现
Visual Basic .NET 中多 Windows 窗体的同步
轻松实现类 MSDN 2002 界面(二)
轻松实现类 MSDN 2002 界面
数据库开发之窗体编程
一个打印报表的简单的类
SDK 程序使用SkinMagic工具包换皮肤
Windows SDK笔记(七):创建MDI窗口
Windows SDK笔记(六):使用对话框资源建立窗口
Windows SDK笔记(五):非模式对话框
Windows SDK笔记(四):模式对话框
也谈如何隐藏显示在任务栏中的对话框程序
一个托盘程序演示 -闹钟 Alert
think window procedure
再谈 CFileDialog 对话框的定制
获得 Win32 窗口句柄的更好的方法
个人考勤软件开发实例配套代码 2.1版(Update)
介绍一个操作DHTML表格的C++对象
Windows资源管理器Web视图界面

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


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