Chinaunix首页 | 论坛 | 博客
  • 博客访问: 578254
  • 博文数量: 752
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(752)

文章存档

2011年(1)

2008年(751)

我的朋友

分类:

2008-10-13 16:42:30

XP风格复活节彩蛋的实现
作者:



如果您用过微软Office系列产品的话,一定会知道它们中很多在"关于"对话框中都隐藏了一些小功能,只有当用户点击某些特殊的键盘或鼠标按键时,这些功能才会显示出来(就象复活节彩蛋似的变出来)。您象知道类似的功能是怎么实现的么?下面,我做了个示例程序,可以告诉您它们实现的基本原理(示例中采用了整套XP风格化的界面设计)。如下图:其中图一为XP风格界面,图二为类似复活节彩蛋的实现界面。


图一


图二

基本构成思想:
实现原理很简单,初始时将隐藏的部分不显示出来(既限制对话框的高度,默认高度=总高度 -- 隐藏部分高度),再设定特殊的键盘或鼠标按鍵来激活它既可。本示例程序采用二种方式,键盘热键和鼠标热键,其中键盘热键为"关于"对话框中同时按下Ctrl+Alt+F3键可激活隐藏信息,鼠标热键则为,在"关于"对话框中同时按下Ctrl键,在Logo动态图像中双击鼠标右键既可激活隐藏信息。下面让我们来看看它的具体实现情况吧!

关键代码实现
1、 默认将隐藏部分不显示出来

#define WM_SHOWHOTKEY WM_USER + 101		//自定义系统热键消息
BOOL CAboutDlg::OnInitDialog() 
{

	//"关于"对话框中对话框可收缩效果
	CRect Rect1,Rect2; 		//对话框收缩时大小		
	
	GetDlgItem(IDC_DYCREDITS)->GetWindowRect(Rect1); 
	GetDlgItem(IDC_COPYRIGHT)->GetWindowRect(Rect2); 
	m_nReducedHeight = Rect1.Height()+(Rect1.top -Rect2.bottom)/2; //收缩后窗体高度
	dlgRect.bottom -= (Rect1.Height()+(Rect1.top -Rect2.bottom)/2); 
	MoveWindow(&dlgRect);	//如果要显示对话框起始动态效果的话,不能使用该句

	m_bVertical=false;		    //默认收缩对话框

		
	//注册系统热键,用来显示隐藏信息
	RegisterHotKey(GetSafeHwnd(),WM_SHOWHOTKEY,MOD_ALT|MOD_CONTROL,VK_F3);
		
	return TRUE; 
}
2、隐藏信息的激活或隐藏的函数
//功能: 是否荣誉显示
void CAboutDlg::OnMore() 
{
	m_bVertical = !m_bVertical; 
	
	if(m_bVertical == FALSE)	//不显示
	{ 
		SetDlgItemText(ID_MORE,_T("更多>>"));

		SizeWindow(m_nReducedHeight,true);
	} 
	else						//显示
	{ 
		SetDlgItemText(ID_MORE,_T("<<隐藏"));

		SizeWindow(m_nReducedHeight,false);
	} 
	
	UpdateWindow(); 
}

//功能: 伸展或收缩对话框    
void CAboutDlg::SizeWindow(int ReduceHeight, bool bExtend)
{
	CRect rc;
	GetWindowRect(&rc);
	if(bExtend)
	{
		for (int i= 0; i < ReduceHeight; i++)
		{
			rc.bottom--;
			MoveWindow(&rc);
		}
	}
	else
	{
		for (int i= 0; i < ReduceHeight; i++)
		{
			rc.bottom++;
			MoveWindow(&rc);
		}
	}
}

3、在特殊的键盘及鼠标热键下激隐藏信息显示
//功能: 鼠标热键,在图片框按住Ctrl键,双击鼠标右键可显示,显示隐藏的信息。  
void CAboutDlg::OnRButtonDblClk(UINT nFlags, CPoint point) 
{
	if(nFlags==(MK_CONTROL|MK_RBUTTON ))
	{
		CPictureEx *pAbout =(CPictureEx *)GetDlgItem(IDC_FLAG);
		CRect rcAbout; 
		pAbout->GetWindowRect(&rcAbout);
		
		CPoint pt;
		GetCursorPos(&pt);
		if(rcAbout.PtInRect(pt))
			OnMore();
	}

	CDialog::OnLButtonDblClk(nFlags, point);			
}

//*功能:键盘热键显示隐藏的信息
LRESULT CAboutDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
	if(wParam==WM_SHOWHOTKEY)
	{
		OnMore();
	}
	
	return 0;
}
4、别忘了收尾工作,销毁已注册的系统热键
//* 功能:程序关闭时的处理工作
BOOL CAboutDlg::DestroyWindow() 
{
	//注销已注册的系统热键
	UnregisterHotKey(GetSafeHwnd(),WM_SHOWHOTKEY);	

	return CDialog::DestroyWindow();					
}
以上部分代码具体实现的细节问题,可在下载实例代码后,仔细查看源码既可(内有详细注释)。


联系方式:
地址:陕西省西安市劳动路2号院六单元
邮编:710082
作者EMAIL:jingzhou_xu@163.net
未来工作室(Future Studio)


--------------------next---------------------

如果我想改变菜单和工具栏非客户区的背景如何实现呢?望指教,谢谢!! ( lwh 发表于 2005-7-31 11:35:00)
 
内存泄漏?解决了吗?谢谢 ( zouchq 发表于 2003-7-15 16:27:00)
 
任务栏上无图标。 ( Tom_lyd 发表于 2002-12-2 15:15:00)
 
有内存泄漏,时间长了,会导致主程序终止!可有解决的办法?我的e-mail:tyj2008@hotmail.com!希望能解决,谢谢! ( tyj2008 发表于 2002-11-18 22:52:00)
 
需要自己改很多东西,希望这个东西下一个版本尽快出现! ( hww02 发表于 2002-11-9 22:07:00)
 
对,有极严重的内存泄漏 ( huang 发表于 2002-10-27 21:09:00)
 
谢谢,我看不懂.
我要仔细看看 ( 菜鸟之才鸟 发表于 2002-10-5 16:44:00)
 
好像有资源泄漏 !
( CKing 发表于 2002-8-28 15:26:00)
 
这个程序在编译过程中出现错误. 
Compiling...
download.cpp
e:\word1\download.cpp(2) : error C2653: 'CAboutDlg' : is not a class or namespace name
e:\word1\download.cpp(2) : error C2146: syntax   error : missing ';' before identifier 'OnInitDialog'
e:\word1\download.cpp(2) : error C2501: 'BOOL' : missing storage-class or type specifiers
e:\word1\download.cpp(2) : fatal error C1004: unexpected end of file found
Error executing cl.exe.

download.obj - 4 error(s), 0 warning(s)
( 编程新手 发表于 2002-8-25 23:16:00)
 
重载下述函数并添加相应代码可消除闪烁

BOOL CXPEasterEggView::OnEraseBkgnd(CDC* pDC) 
{
// TODO: Add your message handler code here and/or call default

CRect rect; 
CBrush brush; 
brush.CreateSolidBrush(0x808080); 
pDC->GetClipBox(rect); 
pDC->FillRect(rect,&brush); 
return true; 

// return CView::OnEraseBkgnd(pDC);
} ( 中国赢 发表于 2002-8-25 18:48:00)
 
.......................................................

--------------------next---------------------

阅读(273) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~