19,468
社区成员
发帖
与我相关
我的任务
分享
void welcomestart(const float &secondsTimeout = 1)
{
//float secondsTimeout:每周图片显示的时长。单位:s
CWindowDC dc(CWnd::GetDesktopWindow());
//得到屏幕的尺寸,
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
// //资源句柄
HRSRC hRsrc = NULL;
//显示的图片数量,每次要显示3张图片
int cout_show = 0;
while (cout_show < 3)
{
//计数加1
cout_show++;
int temp_i = 0;
temp_i = cout_show %2;
//根据得到随机数,加载不同的图片资源
BOOL res1 = FALSE;
switch (temp_i)
{
case 0:
{
//加载第1张图片
hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_PNG1), _T("PNG"));
break;
}
case 1:
{
//加载第2张图片
hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_PNG2), _T("PNG"));
break;
}
case 2:
{
//加载第3张图片
hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_PNG1), _T("PNG"));
break;
}
}
// 查找资源
if (hRsrc == NULL)
return;
// 加载资源
HGLOBAL hImgData = ::LoadResource(AfxGetResourceHandle(), hRsrc);
if (hImgData == NULL)
{
::FreeResource(hImgData);
return;
}
// 锁定内存中的指定资源
LPVOID lpVoid = ::LockResource(hImgData);
DWORD dwSize = ::SizeofResource(AfxGetResourceHandle(), hRsrc);
HGLOBAL hNew = ::GlobalAlloc(GHND, dwSize);
LPBYTE lpByte = (LPBYTE)::GlobalLock(hNew);
::memcpy(lpByte, lpVoid, dwSize);
// 解除内存中的指定资源
::GlobalUnlock(hNew);
LPSTREAM pStream = nullptr;
CImage image2Display;
// 从指定内存创建流对象
HRESULT ht = ::CreateStreamOnHGlobal(hNew, TRUE, &pStream);
if (ht != S_OK)
{
GlobalFree(hNew);
}
else
{
// 加载图片
image2Display.Load(pStream);
GlobalFree(hNew);
}
// 释放资源
::FreeResource(hImgData);
//////////////////////////////////////////////////////
if (image2Display.GetBPP() == 32) //确认该图像包含Alpha通道
{
int i;
int j;
for (i = 0; i < image2Display.GetWidth(); i++)
{
for (j = 0; j < image2Display.GetHeight(); j++)
{
byte *pByte = (byte *)image2Display.GetPixelAddress(i, j);
pByte[0] = pByte[0] * pByte[3] / 255;
pByte[1] = pByte[1] * pByte[3] / 255;
pByte[2] = pByte[2] * pByte[3] / 255;
pByte = nullptr;
}
}
}
if (!image2Display.IsNull())
{
//得到图片尺寸,以便居中显示
int image_width = image2Display.GetWidth();
int image_height = image2Display.GetHeight();
//透明显示图片
image2Display.AlphaBlend(dc.m_hDC, (cx - image_width) / 2, (cy - image_height) / 2);
int nElapse = secondsTimeout * 1000;
//图片显示时长:单位:ms
Sleep(nElapse);
CRect rectPic((cx - image_width) / 2, (cy - image_height) / 2, (cx + image_width) / 2, (cy + image_height) / 2);
//################################################################################
//$$$$$$$$$$$$$下面的这3行代码,都不能使已经显示的图片消失$$$$$$$$$$$$$$$$$$$$$$$
//::InvalidateRect(GetDesktopWindow(), rectPic, TRUE);
//::RedrawWindow(GetDesktopWindow(), &rectPic, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_NOCHILDREN);
//::UpdateWindow(GetDesktopWindow());
//###################################################################################
}
//销毁图片
image2Display.Destroy();
hRsrc = NULL;
hImgData = NULL;
lpVoid = nullptr;
hNew = NULL;
lpByte = nullptr;
pStream = nullptr;
}
}