想做一個軟體啟影片,就是在程式視窗顯示之前,先顯示幾張(比如3張)圖片。使用CImage類,顯示的圖片格式為PNG。
希望得到的效果是:第一張顯示,延時,消失;顯示第二張,延時,再消失。顯示第3張,延時,再消失。
可實際效果是:前面顯示的圖片總是存在,不消失。
第一張顯示正常,后面的圖片顯示時,之前顯示的圖片卻依然存在,不消失。所以,最終顯示到第3張的時候,就相當在桌面上同時顯示了3張圖片重疊在一起。
望有高手能夠指點一下,問題出在了哪里。非常感謝!
主要的代碼如下:
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;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/258243.html
標籤:圖形處理/算法
下一篇:Hi3559AV100-自己編譯了u-boot、kernel及rootfs后,出現燒寫錯誤或者燒寫后板載無法啟動的解決思路
