关于GDI+绘图问题,我把代码贴出来大家帮忙看下!

时间:2021-08-01 03:25:42
void CImageHandleView::OnDraw(CDC* pDC)
{
CImageHandleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
::SetWindowText(GetParent()->m_hWnd,"图像处理软件");
// TODO: add draw code for native data here

Graphics graph(pDC->GetSafeHdc());

graph.DrawImage(bitmap,Destrect,Srcrect.X,Srcrect.Y,Srcrect.Width,Srcrect.Height,UnitPixel,&imageAttr);
ReleaseDC(pDC);
}
(其中Destrect是进行缩放,Srcrect是进行剪切时使用,imageAttr预留给设置透明度时使用)
我是想先显示一张图像,然后对该图像进行设置图明度,调用OnDraw进行重绘。

void CImageHandleView::OnColorhandle() 
{
// TODO: Add your command handler code here
ColorHandle color;     //ColorHandle定义了一个对话框,从中传透明度值过来
float f;
if(bitmap->GetLastStatus()!=Ok)
return;
if(color.DoModal()==IDOK)
{
m_Transparent=color.transparent;

if(m_Transparent!=0)
{
f=m_Transparent/100.0f;
ColorMatrix colormatrix=
{1,0,0,0,0,
 0,1,0,0,0,
 0,0,1,0,0,
 0,0,0,f,0,
 0,0,0,0,1};


                 imageAttr.SetColorMatrix(&colormatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);
Invalidate();
UpdateWindow();
}
}

但是这样之后图像只是闪一下,透明度并无变化。为什么?怎么解决?
高手给看哈,不胜感激!

9 个解决方案

#1


友情UP

#2


ReleaseDC(pDC); 
首先这句就应该去掉!

#3


引用 2 楼 fandh 的回复:
ReleaseDC(pDC);
首先这句就应该去掉!


为什么?

#4


你的DC是函数参数传给你的,不是你自己通过GetDC获得的!

#5


void CImageHandleView::OnDraw(CDC* pDC) 

CImageHandleDoc* pDoc = GetDocument(); 
ASSERT_VALID(pDoc); 
::SetWindowText(GetParent()->m_hWnd,"图像处理软件"); 
// TODO: add draw code for native data here 

Graphics graph(pDC->GetSafeHdc()); 
ImageAttributes imageAtt;

 imageAttr.SetColorMatrix(&colormatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap); 

graph.DrawImage(bitmap,Destrect,Srcrect.X,Srcrect.Y,Srcrect.Width,Srcrect.Height,UnitPixel,&imageAttr); 




改成这样,把 colormatrix作为成员变量,试试!

#6


另外楼主看看这个,看看是否有帮助:
http://tech.ddvip.com/2008-11/122587489289349.html

#7


我觉得是没有把原先的图片(alpha为255,也就是不透明的时候)擦除就直接在上面绘制了。这样的话当然看不出透明度。你改成这样试下:

void CImageHandleView::OnDraw(CDC* pDC) 

CImageHandleDoc* pDoc = GetDocument(); 
ASSERT_VALID(pDoc); 
::SetWindowText(GetParent()->m_hWnd,"图像处理软件"); 

Graphics graph(pDC->GetSafeHdc()); 
graph.Clear(Color::White); // 先把背景清空为白色,再绘制
graph.DrawImage(bitmap,Destrect,Srcrect.X,Srcrect.Y,Srcrect.Width,Srcrect.Height,UnitPixel,&imageAttr); 
ReleaseDC(pDC); 
}

#8


按照楼上的说法做了,但是还是不行啊

#9


imageAttr.SetColorMatrix()这个函数设置透明度后更改了bitmap对应的数据没有? 你自己单步调试下

#1


友情UP

#2


ReleaseDC(pDC); 
首先这句就应该去掉!

#3


引用 2 楼 fandh 的回复:
ReleaseDC(pDC);
首先这句就应该去掉!


为什么?

#4


你的DC是函数参数传给你的,不是你自己通过GetDC获得的!

#5


void CImageHandleView::OnDraw(CDC* pDC) 

CImageHandleDoc* pDoc = GetDocument(); 
ASSERT_VALID(pDoc); 
::SetWindowText(GetParent()->m_hWnd,"图像处理软件"); 
// TODO: add draw code for native data here 

Graphics graph(pDC->GetSafeHdc()); 
ImageAttributes imageAtt;

 imageAttr.SetColorMatrix(&colormatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap); 

graph.DrawImage(bitmap,Destrect,Srcrect.X,Srcrect.Y,Srcrect.Width,Srcrect.Height,UnitPixel,&imageAttr); 




改成这样,把 colormatrix作为成员变量,试试!

#6


另外楼主看看这个,看看是否有帮助:
http://tech.ddvip.com/2008-11/122587489289349.html

#7


我觉得是没有把原先的图片(alpha为255,也就是不透明的时候)擦除就直接在上面绘制了。这样的话当然看不出透明度。你改成这样试下:

void CImageHandleView::OnDraw(CDC* pDC) 

CImageHandleDoc* pDoc = GetDocument(); 
ASSERT_VALID(pDoc); 
::SetWindowText(GetParent()->m_hWnd,"图像处理软件"); 

Graphics graph(pDC->GetSafeHdc()); 
graph.Clear(Color::White); // 先把背景清空为白色,再绘制
graph.DrawImage(bitmap,Destrect,Srcrect.X,Srcrect.Y,Srcrect.Width,Srcrect.Height,UnitPixel,&imageAttr); 
ReleaseDC(pDC); 
}

#8


按照楼上的说法做了,但是还是不行啊

#9


imageAttr.SetColorMatrix()这个函数设置透明度后更改了bitmap对应的数据没有? 你自己单步调试下