HanDs
管理员

[Visual Studio文章] 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_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的巧妙?由于本人也在学习阶段,所以分析的也不是很到位,但也希望通过这次学习能有所提高,可以与本人联系: [email protected]

谢谢!


学习中请遵守法律法规,本网站内容均来自于互联网,本网站不负担法律责任
上一主题 下一主题
QQ 界面的模拟实现 ( )
#1楼