在程序实际开发中,闪屏是我们经常用到的。如果程序初始化要一些时间,设计闪屏更加有必要,不但使你的程序也漂亮,还能在上面写上你的版本信息。好处是多多的。在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
}