CxImage绘制带阴影的PNG图片,阴影会重叠,请教解决方案。

believe_me 2011-06-30 04:17:38

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的最后绘制的,出现重叠,没道理啊。
...全文
407 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
believe_me 2011-07-05
  • 打赏
  • 举报
回复
改用GdiPlus之后阴影重叠的现象就显示了。
还有个GdiPlus的问题,Image定义的时候,好像只能从文件路径或者流中获取资源,如何从VS2008导入的资源文件(资源的ID)初始化Image呢?
believe_me 2011-07-01
  • 打赏
  • 举报
回复
有了解的么
shiyunqiang 2011-07-01
  • 打赏
  • 举报
回复
我做过一个对话框上贴png图的程序,也能实现透明背景,你看看能不能帮助你?

BOOL CSplashDlg::OnInitDialog()
{
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);
}

jdzfjfhnui 2011-07-01
  • 打赏
  • 举报
回复
看了下CxImgae的Draw实现,如果图片中存在透明度, 则他首先把那个DC的内容拷贝出来,然后在和原始图片做blend, 这结果就是越画越黑了.

解决方法:

用GDI+画
believe_me 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sml070107 的回复:]

我前几天刚解决了一个半透明的问题,跟你的差不多,我的方法是把第一次绘制图形的保存到一个CBitmap中,下次需要显示的时候,加载bitmap就可以了
[/Quote]
那图片的阴影应该都丢失了吧?
believe_me 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 shenyi0106 的回复:]

invalidate/invalidaterect
[/Quote]
我本身就是在OnPaint中进行绘制的啊
SML070107 2011-06-30
  • 打赏
  • 举报
回复
我前几天刚解决了一个半透明的问题,跟你的差不多,我的方法是把第一次绘制图形的保存到一个CBitmap中,下次需要显示的时候,加载bitmap就可以了
shenyi0106 2011-06-30
  • 打赏
  • 举报
回复
invalidate/invalidaterect
believe_me 2011-06-30
  • 打赏
  • 举报
回复
请问如何刷?
shenyi0106 2011-06-30
  • 打赏
  • 举报
回复
你的肯定是实用了透明通道了,所以会出现叠影,如果能承受一定程度的闪烁的话,还是刷新一下好了
「已注销」 2011-06-30
  • 打赏
  • 举报
回复


那就用GDI+ CImage吧


15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧