CxImage g_imgWarning;
g_imgWarning.LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG_WARNING),"PNG"),CXIMAGE_FORMAT_PNG);
//在OnPaint中进行如下操作
//贴背景图片
//
//贴警告图标
CRect rcWarning;
rcWarning.left = 70;
rcWarning.right = rcWarning.left + g_imgWarning.GetWidth();
rcWarning.top = 190;
rcWarning.bottom = rcWarning.top + g_imgWarning.GetHeight();
g_imgWarning.Draw(GetDC()->GetSafeHdc(), rcWarning);第一次绘制是没有问题的,但是当其他窗口在我的窗口上滑动的时候,PNG图片的阴影处越来越深,应该是重叠起来了。
我的PNG图片是在onpaint的最后绘制的,出现重叠,没道理啊。
{
CDialog::OnInitDialog(); // TODO: 在此添加额外的初始化
HRSRC hRsrc=::FindResource(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDB_PNG1),
_T("PNG"));
if(hRsrc!=NULL)
{
HGLOBAL hImgData=::LoadResource(AfxGetResourceHandle(),hRsrc);
if(hImgData==NULL)
{
::FreeResource(hImgData);
}
else
{
LPVOID lpVoid = ::LockResource(hImgData);
LPSTREAM pStream=NULL;
DWORD dwSize = ::SizeofResource(AfxGetResourceHandle(), hRsrc);
HGLOBAL hNew = ::GlobalAlloc(GHND, dwSize);
LPBYTE lpByte = (LPBYTE)::GlobalLock(hNew);
::memcpy(lpByte, lpVoid, dwSize);
GlobalUnlock(hNew);
HRESULT ht = CreateStreamOnHGlobal(hNew, TRUE, &pStream);
if( ht != S_OK )
{
//ASSERT( FALSE );
GlobalFree(hNew);
}
else
{
m_ImgBk.Load(pStream);
GlobalFree(hNew);
}
::FreeResource(hImgData);
}
} //------------------------------透明背景----------------------------------//
for(int i = 0; i < m_ImgBk.GetWidth(); ++i)
{
for(int j = 0; j < m_ImgBk.GetHeight(); ++j)
{
unsigned char* pucColor = reinterpret_cast<unsigned char *>(m_ImgBk.GetPixelAddress(i , j));
pucColor[0] = pucColor[0] * pucColor[3] / 255;
pucColor[1] = pucColor[1] * pucColor[3] / 255;
pucColor[2] = pucColor[2] * pucColor[3] / 255;
}
} return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}BOOL CSplashDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_ImgBk.Draw(pDC->GetSafeHdc(),0,0,m_ImgBk.GetWidth(),m_ImgBk.GetHeight(),
0,0,m_ImgBk.GetWidth(),m_ImgBk.GetHeight()); return TRUE; //return CDialog::OnEraseBkgnd(pDC);
}
还有个GdiPlus的问题,Image定义的时候,好像只能从文件路径或者流中获取资源,如何从VS2008导入的资源文件(资源的ID)初始化Image呢?