Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2086959
  • 博文数量: 909
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 12260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 20:50
文章分类

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 22:04:06

一起学习
模拟 Windows 开机动态色带条


作者:华志良


下载源代码

一、首先使用 ResHacker 将 NTOSKRNL.EXE 中的资源 HACK 出来,安装过 ResHacker 后,
找到系统目录下的 NTOSKRNL.EXE, 然后打开文件,在位图资源处找到我们需要的 Windows 开机画面,
然后用保存资源成BMP的方式将资源导出到一个BMP文件,通过简单的处理就可以得到静态的色带的BMP文件 dynaline.bmp 了!:->:


图一 使用 ResHacker 得到开机画面

二、程序设计
接下来我们需要在 VC 中创建一个简单的对话框工程 DemoLine
导入我们获得的静态位图 dynaline.bmp,在工程中加入一个bitmap 资源 IDB_DYNLINE
在的对话框中加入静态的 Picture 控件,将 CStatic 属性设成 bitmap,
然后创建一个派生于 CStatic 的 MFC 新类 CDynLine,我们让这个类来完成动画显示!
在类 CDynLine 的实现代码中加入工作线程,它负责将静态的画面显示成动态的色带条,代码如下:

UINT	DispThread(LPVOID lpParam)

{

	CDynLine* pWnd = (CDynLine*)lpParam;

	CClientDC dcClient(pWnd);

	CDC		dcMem;

	dcMem.CreateCompatibleDC(&dcClient);

	BITMAP	bits;

	pWnd->m_bmp.GetBitmap(&bits);

	CBitmap *pBmp = (CBitmap*)dcMem.SelectObject( pWnd->m_bmp );



	CSize	size(0,0);



	while(g_lDisplay)

	{

		if( size.cx < bits.bmWidth )

			size.cx  =2;

		else

			size.cx = 0;

		dcClient.BitBlt( 0,0,size.cx,bits.bmHeight,&dcMem,(bits.bmWidth-size.cx),0,SRCCOPY);

		dcClient.BitBlt( size.cx,0,(bits.bmWidth-size.cx),bits.bmHeight,&dcMem,0,0,SRCCOPY);



		Sleep( 20 );

	}

	return 1;

}
动态显示的算法很简单,就是不断移动填充图象的位置。

三、在 CDynLine 中加入控制图象移动的方法 Start() 和 Stop(),很轻松,改变全局变量g_lDisplay的值就OK了。
但是需要注意的是同步问题,使用InterlockedIncrement和InterlockedDecrement函数可以保证正确读写。
最后,在对话框程序中把静态图象控件的类 CStati c改 成CDynLine 就大功告成了!


图二 程序显示界面

四、使用这样的一个类用于其他的工程,通过动态的色带告诉用户程序正在处理状态,很直观,且简单明了。

下载本文示例代码


模拟 Windows 开机动态色带条模拟 Windows 开机动态色带条模拟 Windows 开机动态色带条模拟 Windows 开机动态色带条模拟 Windows 开机动态色带条模拟 Windows 开机动态色带条模拟 Windows 开机动态色带条模拟 Windows 开机动态色带条模拟 Windows 开机动态色带条模拟 Windows 开机动态色带条模拟 Windows 开机动态色带条模拟 Windows 开机动态色带条
阅读(201) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~