闪屏图形特技效果的实现之关键源代码

        在程序实际开发中,闪屏是我们经常用到的。如果程序初始化要一些时间,设计闪屏更加有必要,不但使你的程序也漂亮,还能在上面写上你的版本信息。好处是多多的。在VC++6.0组件库中有一个splash screen闪屏组件,可以添加到程序中。但是初学者打开源代码学习时,里面函数太多,一时之间也搞不明白。而且显示的闪屏很呆板。为了使初学者明白,我搞了一个很简单的类,里面只有二个函数,结构很清晰。一看就明白,还有详细的注释。功能并不比VC++6.0自带那个逊色。

        增加代码处:

       在App类的InitInstance()函数中添加如下代码:

 //增加的代码
	CLjxWnd *ljxljx=new CLjxWnd;  //建立一个新窗口对象
	ljxljx->CreatLjxWnd ();       //创建窗口
	ljxljx->CenterWindow ();      //在屏幕中央
	ljxljx->ShowWindow (SW_SHOW); //显示窗口
	ljxljx->UpdateWindow ();      //更新窗口,激活OnPait函数
	Sleep(2000);                 //等待函数指定秒钟
	if (ljxljx!=NULL) ljxljx->SendMessage (WM_CLOSE); //关闭窗口
//增加的代码结束

 

       其中CLjxWnd类的代码为:

     

// CLjxWnd window

class CLjxWnd : public CWnd
{
// Construction
public:
	CLjxWnd();

// Attributes
public:

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CLjxWnd)
	public:
	//}}AFX_VIRTUAL

// Implementation
public:
	CDC MemDC;  //创建内存DC
	BITMAP bm;  //创建位图结构变量
	CBitmap m_bitmap;  //创建位图对象
    CBitmap *old_bitmap;  //创建位图对象指针
	void CreatLjxWnd();
	virtual ~CLjxWnd();

	// Generated message map functions
protected:
	//{{AFX_MSG(CLjxWnd)
	afx_msg void OnPaint();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};


 

// CLjxWnd

CLjxWnd::CLjxWnd()
{
   	m_bitmap.LoadBitmap(IDB_BITMAP1);//拷贝资源位图
	
    m_bitmap.GetBitmap(&bm);//得到位图结构中的大小信息
}

CLjxWnd::~CLjxWnd()
{

}


BEGIN_MESSAGE_MAP(CLjxWnd, CWnd)
	//{{AFX_MSG_MAP(CLjxWnd)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/
// CLjxWnd message handlers

void CLjxWnd::CreatLjxWnd()
{
   //建立大小与位图大小相同的窗口
   CreateEx(0,
   AfxRegisterWndClass(0,AfxGetApp()->LoadStandardCursor(IDC_ARROW)),
						"animatesplash",
						WS_POPUP,
						0,0,bm.bmWidth,bm.bmHeight,
						NULL,
						NULL,
						NULL );
}



void CLjxWnd::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	MemDC.CreateCompatibleDC(NULL);//建立一个和dc兼容的内存DC放置位图
   old_bitmap=MemDC.SelectObject(&m_bitmap);//将创建的位图选入内存DC

int i,j,stepx,stepy,dispnum,x,y; 
int ljx[20][20];      //数组记录已显示过的数据组 

for ( i=0; i<20; i++ ) 

for ( j=0; j<20; j++ ) 

ljx[i][j]=0; 

stepx=bm.bmWidth/20; 

stepy=bm.bmHeight/20; 

srand( (unsigned)time( NULL ) ); 

dispnum=0; 

//记录已显示过的数据组的个数 

while(1) 

{ x=rand() % 20; 

y=rand() % 20; 

if ( ljx[x][y] ) //如果为1,则已经显示了,跳出循环。

continue; 

ljx[x][y]=1; //显示,设置为1


dc.StretchBlt( 

x*stepx, y*stepy, 

//目标设备逻辑横、纵坐标 

stepx,stepy, 

//显示位图的像素宽、高度 

&MemDC, 

//位图内存设备对象 

x*stepx, y*stepy, 

//位图的起始横、纵坐标 

stepx,stepy, 

//位图的像素宽、高度 

SRCCOPY); 

dispnum++; 

if ( dispnum >=400 ) 

break; 

Sleep(10); 

}

MemDC.SelectObject(old_bitmap);
	// Do not call CWnd::OnPaint() for painting messages
}



 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值