png透明加载实现动画
第一次做png透明加载实现动画时,遇到几个问题,贴出来,以备下次查找。
定时器中代码如下:
void CttDlg::OnTimer(UINT_PTR nIDEvent)
{
//----------------------利用picture控件----------------------
static int imageCounter = 0;
CRect kjrect;
GetDlgItem(IDC_STATIC)->GetWindowRect(kjrect);
ScreenToClient(kjrect);
HWND hwnd = GetSafeHwnd(); //获取窗口的HWND
::InvalidateRect( hwnd, kjrect, true ); //或者 ::InvalidateRect( hwnd, NULL, false );
::UpdateWindow(hwnd);
CString path;
path.Format(_T("image/4e079535e5dde7115e3b672da7efce1b9f1661e100%02d.png"), imageCounter);
CImage image;
image.Load(path);
if (image.GetBPP() == 32) //确认该图像包含Alpha通道
{
for (int i=0; i
GetClientRect(&rect);
image.Draw(GetDlgItem(IDC_STATIC)->GetDC()->m_hDC,rect.left, rect.top, 100, 100, 0, 0, 100, 100 );
imageCounter++;
imageCounter = imageCounter % 30;
CDialogEx::OnTimer(nIDEvent);
//----------------------直接贴图----------------------
// static int imageCounter = 0;
// CRect kjrect(30, 60, 130, 160);
// HWND hwnd = GetSafeHwnd(); //获取窗口的HWND
// ::InvalidateRect( hwnd, kjrect, true ); //或者 ::InvalidateRect( hwnd, NULL, false );
// ::UpdateWindow(hwnd);
//
// CString path;
// path.Format(_T("image/4e079535e5dde7115e3b672da7efce1b9f1661e100%02d.png"), imageCounter);
// CImage image;
// image.Load(path);
// if (image.GetBPP() == 32) //确认该图像包含Alpha通道
// {
// for (int i=0; i
m_hDC*/GetDC()->GetSafeHdc(), 30, 60, 100, 100, 0, 0, 100, 100 );
// imageCounter++;
// imageCounter = imageCounter % 30;
// CDialogEx::OnTimer(nIDEvent);
}
整个逻辑比较简单,设定定时器,在定时器里面实现加载png图片,主要说明下遇到的几个问题。
首先,就是png的透明加载,经过查阅资料后,还是在加载png图片后,对数据进行了转换:
if (image.GetBPP() == 32) //确认该图像包含Alpha通道
{
for (int i=0; i<image.GetWidth(); i++)
{
for (int j=0; j<image.GetHeight(); j++)
{
byte *pByte = (byte *)image.GetPixelAddress(i, j);
pByte[0] = pByte[0] * pByte[3] / 255;
pByte[1] = pByte[1] * pByte[3] / 255;
pByte[2] = pByte[2] * pByte[3] / 255;
}
}
}
其次,图片已经透明加载了,不过动画效果存在问题,前面加载的图片没有消失,没那就刷新:
HWND hwnd = GetSafeHwnd(); //获取窗口的HWND
::InvalidateRect( hwnd, NULL, true ); //或者 ::InvalidateRect( hwnd, NULL, false );
::UpdateWindow(hwnd);
CRect kjrect;
GetDlgItem(IDC_STATIC)->GetWindowRect(kjrect);
ScreenToClient(kjrect);
HWND hwnd = GetSafeHwnd(); //获取窗口的HWND
::InvalidateRect( hwnd, kjrect, true ); //或者 ::InvalidateRect( hwnd, NULL, false );
::UpdateWindow(hwnd);
注意控件的位置转换:
GetDlgItem(IDC_STATIC)->GetWindowRect(kjrect);//获得子控件的屏幕坐标;
ScreenToClient(kjrect);//子控件屏幕坐标映射到控件客户区;