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

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

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


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