button的drawitem中用gdi绘制带阴影的PNG,阴影会重叠。

时间:2022-03-11 18:16:15

Graphics graphics(pDC->m_hDC);
//graphics.Clear(0xffffffff);
graphics.DrawImage(m_pImgBk, Rect(0, 0, m_width, m_height), nsPos, 0, m_width, m_height, UnitPixel);


//使用clear会出现明显的闪烁情况
//不使用clear,图片的阴影部分会出现重叠,最后越来越黑。
:OnEraseBkgnd已经return TRUE。

求教解决方法

22 个解决方案

#1


建立内存DC,在内存DC中画好再BitBlt到窗口DC上,这样既解决了重叠问题,也解决了闪烁问题.


button的drawitem中用gdi绘制带阴影的PNG,阴影会重叠。

button的drawitem中用gdi绘制带阴影的PNG,阴影会重叠。

button的drawitem中用gdi绘制带阴影的PNG,阴影会重叠。

#2


引用楼主 believe_me 的回复:
C/C++ code


Graphics graphics(pDC->m_hDC);
//graphics.Clear(0xffffffff);
graphics.DrawImage(m_pImgBk, Rect(0, 0, m_width, m_height), nsPos, 0, m_width, m_height, UnitPixel);



//使用clear会出现明……

先绘制前,先用背景色刷一下呢?或者InvalidateRect()强制刷新一下;然后再绘制

#3


方法是将图片绘到一张内存Bitmap中,然后再drawimage出来,

#4



Bitmap bt1(L"12.jpg");
Bitmap bitmap(200,200);
Graphics* grph = Graphics::FromImage(&bitmap);
grph->画一下背景
grph ->DrawImage(&bt1, 0, 0);

Graphics graphics(hdc);
graphics->DrawImage(&bitmap,0 ,0);
delete grph;



这样不会闪的。

#5


关注,我最近也在写在button上绘制png图标的代码

#6


在DrawItem用Invalidate(),会狂闪的啊。
主要不是闪烁的问题,PNG图片的阴影会重叠的问题,不好解决。

#7


引用 1 楼 cometnet 的回复:
建立内存DC,在内存DC中画好再BitBlt到窗口DC上,这样既解决了重叠问题,也解决了闪烁问题.


大哥,能再详细说明么?

#8



CDC paintDC;
CBitmap bmp;

paintDC.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap(pDC, m_width, m_height);
paintDC.SetBkMode(TRANSPARENT);

CBitmap * pOldBmp = paintDC.SelectObject(&bmp);
Graphics graphics(paintDC.GetSafeHdc());
//graphics.Clear(0xffffffff);
graphics.DrawImage(m_pImgBk, Rect(0, 0, m_width, m_height), nsPos, 0, m_width, m_height, UnitPixel);
pDC->BitBlt(0,0,m_width, m_height, &paintDC, 0, 0, SRCCOPY);

paintDC.SelectObject(pOldBmp);
bmp.DeleteObject();
paintDC.DeleteDC();


这样绘制出来的图片,周围透明的部分全黑掉了。

#9


引用 6 楼 believe_me 的回复:
在DrawItem用Invalidate(),会狂闪的啊。
主要不是闪烁的问题,PNG图片的阴影会重叠的问题,不好解决。

重叠是因为没有刷掉之前的那些图片

#10


引用 9 楼 wozhengzai512 的回复:
引用 6 楼 believe_me 的回复:
在DrawItem用Invalidate(),会狂闪的啊。
主要不是闪烁的问题,PNG图片的阴影会重叠的问题,不好解决。

重叠是因为没有刷掉之前的那些图片

我知道是因为没有刷掉之前的图片。现在就是需要一个刷新不闪烁,又不重叠的方法。

#11


使用双缓存之后,PNG透明的部分全部变成黑色的了。


CDC paintDC;
CBitmap bmp;

paintDC.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap(pDC, m_width, m_height);
paintDC.SetBkMode(TRANSPARENT);

CBitmap * pOldBmp = paintDC.SelectObject(&bmp);
Graphics graphics(paintDC.GetSafeHdc());
//graphics.Clear(0xffffffff);
graphics.DrawImage(m_pImgBk, Rect(0, 0, m_width, m_height), nsPos, 0, m_width, m_height, UnitPixel);
pDC->BitBlt(0,0,m_width, m_height, &paintDC, 0, 0, SRCCOPY);

paintDC.SelectObject(pOldBmp);
bmp.DeleteObject();
paintDC.DeleteDC();

#12


在线等,没人关注啦

#13


该回复于2014-07-06 09:33:19被管理员删除

#14


我用的是PNG图片,是阴影和透明区域的。
用bitmap做双缓存的话,阴影和透明区域会丢失的吧。

#15


先获取父窗口的DC 得到按钮所在地方的背景,接着在画按钮就不会出现透明是黑的了

#16


你试我的代码撒。

#17


引用 16 楼 hnzlk 的回复:
你试我的代码撒。

grph->画一下背景
这个怎么画

#18


如果背景是纯色,则画png图片之前以该颜色clear一下

,如果背景也是张图片,比较麻烦, 也没找到什么好办法, 那就在画png之前, 让父窗口把背景图的那块区域先画到内存dc,然后从内存dc创建graphics,在绘制png,最后内存dc在bitblt回去.

#19


背景是透明的,啥玩意都没有。这样才能看的出png图片的透明部分。

#20


您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法

#21


该回复于2011-08-16 12:26:30被版主删除

#22


[align=left]
CRect rcClient;
GetClientRect(&rcClient);
ClientToScreen(&rcClient);
GetParent()->ScreenToClient(&rcClient);
GetParent()->InvalidateRect(rcClient,true);//每次绘制透明图片前,更新按钮所在新父窗口区域,按钮的背景也会更新
GetParent()->UpdateWindow();
CClientDC dc(this);
DrawButton(&dc);
ReleaseDC(&dc);
[/align]

#1


建立内存DC,在内存DC中画好再BitBlt到窗口DC上,这样既解决了重叠问题,也解决了闪烁问题.


button的drawitem中用gdi绘制带阴影的PNG,阴影会重叠。

button的drawitem中用gdi绘制带阴影的PNG,阴影会重叠。

button的drawitem中用gdi绘制带阴影的PNG,阴影会重叠。

#2


引用楼主 believe_me 的回复:
C/C++ code


Graphics graphics(pDC->m_hDC);
//graphics.Clear(0xffffffff);
graphics.DrawImage(m_pImgBk, Rect(0, 0, m_width, m_height), nsPos, 0, m_width, m_height, UnitPixel);



//使用clear会出现明……

先绘制前,先用背景色刷一下呢?或者InvalidateRect()强制刷新一下;然后再绘制

#3


方法是将图片绘到一张内存Bitmap中,然后再drawimage出来,

#4



Bitmap bt1(L"12.jpg");
Bitmap bitmap(200,200);
Graphics* grph = Graphics::FromImage(&bitmap);
grph->画一下背景
grph ->DrawImage(&bt1, 0, 0);

Graphics graphics(hdc);
graphics->DrawImage(&bitmap,0 ,0);
delete grph;



这样不会闪的。

#5


关注,我最近也在写在button上绘制png图标的代码

#6


在DrawItem用Invalidate(),会狂闪的啊。
主要不是闪烁的问题,PNG图片的阴影会重叠的问题,不好解决。

#7


引用 1 楼 cometnet 的回复:
建立内存DC,在内存DC中画好再BitBlt到窗口DC上,这样既解决了重叠问题,也解决了闪烁问题.


大哥,能再详细说明么?

#8



CDC paintDC;
CBitmap bmp;

paintDC.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap(pDC, m_width, m_height);
paintDC.SetBkMode(TRANSPARENT);

CBitmap * pOldBmp = paintDC.SelectObject(&bmp);
Graphics graphics(paintDC.GetSafeHdc());
//graphics.Clear(0xffffffff);
graphics.DrawImage(m_pImgBk, Rect(0, 0, m_width, m_height), nsPos, 0, m_width, m_height, UnitPixel);
pDC->BitBlt(0,0,m_width, m_height, &paintDC, 0, 0, SRCCOPY);

paintDC.SelectObject(pOldBmp);
bmp.DeleteObject();
paintDC.DeleteDC();


这样绘制出来的图片,周围透明的部分全黑掉了。

#9


引用 6 楼 believe_me 的回复:
在DrawItem用Invalidate(),会狂闪的啊。
主要不是闪烁的问题,PNG图片的阴影会重叠的问题,不好解决。

重叠是因为没有刷掉之前的那些图片

#10


引用 9 楼 wozhengzai512 的回复:
引用 6 楼 believe_me 的回复:
在DrawItem用Invalidate(),会狂闪的啊。
主要不是闪烁的问题,PNG图片的阴影会重叠的问题,不好解决。

重叠是因为没有刷掉之前的那些图片

我知道是因为没有刷掉之前的图片。现在就是需要一个刷新不闪烁,又不重叠的方法。

#11


使用双缓存之后,PNG透明的部分全部变成黑色的了。


CDC paintDC;
CBitmap bmp;

paintDC.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap(pDC, m_width, m_height);
paintDC.SetBkMode(TRANSPARENT);

CBitmap * pOldBmp = paintDC.SelectObject(&bmp);
Graphics graphics(paintDC.GetSafeHdc());
//graphics.Clear(0xffffffff);
graphics.DrawImage(m_pImgBk, Rect(0, 0, m_width, m_height), nsPos, 0, m_width, m_height, UnitPixel);
pDC->BitBlt(0,0,m_width, m_height, &paintDC, 0, 0, SRCCOPY);

paintDC.SelectObject(pOldBmp);
bmp.DeleteObject();
paintDC.DeleteDC();

#12


在线等,没人关注啦

#13


该回复于2014-07-06 09:33:19被管理员删除

#14


我用的是PNG图片,是阴影和透明区域的。
用bitmap做双缓存的话,阴影和透明区域会丢失的吧。

#15


先获取父窗口的DC 得到按钮所在地方的背景,接着在画按钮就不会出现透明是黑的了

#16


你试我的代码撒。

#17


引用 16 楼 hnzlk 的回复:
你试我的代码撒。

grph->画一下背景
这个怎么画

#18


如果背景是纯色,则画png图片之前以该颜色clear一下

,如果背景也是张图片,比较麻烦, 也没找到什么好办法, 那就在画png之前, 让父窗口把背景图的那块区域先画到内存dc,然后从内存dc创建graphics,在绘制png,最后内存dc在bitblt回去.

#19


背景是透明的,啥玩意都没有。这样才能看的出png图片的透明部分。

#20


您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法

#21


该回复于2011-08-16 12:26:30被版主删除

#22


[align=left]
CRect rcClient;
GetClientRect(&rcClient);
ClientToScreen(&rcClient);
GetParent()->ScreenToClient(&rcClient);
GetParent()->InvalidateRect(rcClient,true);//每次绘制透明图片前,更新按钮所在新父窗口区域,按钮的背景也会更新
GetParent()->UpdateWindow();
CClientDC dc(this);
DrawButton(&dc);
ReleaseDC(&dc);
[/align]