(1)新建一个基于对话框的MFC应用程序SplashScreenTest,删除对话框中原有控件。
(2)用画图程序做一个图片,白底黑字,然后加入工程中,资源名IDB_BITMAP1。
(3)添加一个对话框资源,并为其添加类CDlgWork。
(4)在BOOL CSplashScreenTestDlg::OnInitDialog()中的末尾添加代码如下:
CDC* pDC;
CDC memDC;
CBitmap bitmap;
CBitmap* bmp = NULL;
COLORREF col;
CRect rc;
int x, y;
CRgn rgn, tmp;
pDC = GetDC();
GetWindowRect(&rc);
bitmap.LoadBitmap(IDB_BITMAP1);//装载位图
memDC.CreateCompatibleDC(pDC);
bmp = memDC.SelectObject(&bitmap);
rgn.CreateRectRgn(0, 0, rc.Width(), rc.Height());
//计算得到区域
for(x=0; x<=rc.Width(); x++)
{
for(y=0; y<=rc.Height(); y++)
{
//将白色部分取掉
col = memDC.GetPixel(x, y);//得到像素颜色
if(col == RGB(255,255,255))
{
tmp.CreateRectRgn(x, y, x+1, y+1);
rgn.CombineRgn(&rgn, &tmp,RGN_DIFF);
tmp.DeleteObject();
}
}
}
if(bmp)
{
memDC.SelectObject(bmp);
}
CenterWindow();
SetWindowRgn((HRGN)rgn,TRUE);//设置窗体为区域的形状
ReleaseDC(pDC);
SetTimer(1,2000,NULL);
(5)为CSplashScreenTestDlg添加计时器函数,并添加代码如下:
void CSplashScreenTestDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
KillTimer(1);
CDialog::OnCancel();
CDlgWork dlg;
dlg.DoModal();
CDialogEx::OnTimer(nIDEvent);
}
引用类CDlgWork文件,代码如下:
#include "DlgWork.h"
(6)为CSplashScreenTestDlg添加显示窗口事件函数WM_SHOWWINDOW,并添加代码如下:
void CSplashScreenTestDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialogEx::OnShowWindow(bShow, nStatus);
// TODO: 在此处添加消息处理程序代码
CRect rc,rect;
GetClientRect(&rc);
GetWindowRect(&rect);
rc.left = rect.left;
rc.top = rect.top;
rc.right = rc.left + 414;//414是图片宽度
rc.bottom = rc.top + 100;//100是图片高度
MoveWindow(&rc,true);
}
(7)保存并运行工程,可以看到程序启动的时候会显示一个文字提示,然后再出现类为CDlgWork的对话框,运行结果如图所示: