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 个解决方案
#2
先绘制前,先用背景色刷一下呢?或者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图片的阴影会重叠的问题,不好解决。
主要不是闪烁的问题,PNG图片的阴影会重叠的问题,不好解决。
#7
大哥,能再详细说明么?
#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
重叠是因为没有刷掉之前的那些图片
#10
我知道是因为没有刷掉之前的图片。现在就是需要一个刷新不闪烁,又不重叠的方法。
#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
#14
我用的是PNG图片,是阴影和透明区域的。
用bitmap做双缓存的话,阴影和透明区域会丢失的吧。
用bitmap做双缓存的话,阴影和透明区域会丢失的吧。
#15
先获取父窗口的DC 得到按钮所在地方的背景,接着在画按钮就不会出现透明是黑的了
#16
你试我的代码撒。
#17
grph->画一下背景
这个怎么画
#18
如果背景是纯色,则画png图片之前以该颜色clear一下
,如果背景也是张图片,比较麻烦, 也没找到什么好办法, 那就在画png之前, 让父窗口把背景图的那块区域先画到内存dc,然后从内存dc创建graphics,在绘制png,最后内存dc在bitblt回去.
,如果背景也是张图片,比较麻烦, 也没找到什么好办法, 那就在画png之前, 让父窗口把背景图的那块区域先画到内存dc,然后从内存dc创建graphics,在绘制png,最后内存dc在bitblt回去.
#19
背景是透明的,啥玩意都没有。这样才能看的出png图片的透明部分。
#20
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
#21
#22
[align=left]
CRect rcClient;[/align]
GetClientRect(&rcClient);
ClientToScreen(&rcClient);
GetParent()->ScreenToClient(&rcClient);
GetParent()->InvalidateRect(rcClient,true);//每次绘制透明图片前,更新按钮所在新父窗口区域,按钮的背景也会更新
GetParent()->UpdateWindow();
CClientDC dc(this);
DrawButton(&dc);
ReleaseDC(&dc);
#1
#2
先绘制前,先用背景色刷一下呢?或者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图片的阴影会重叠的问题,不好解决。
主要不是闪烁的问题,PNG图片的阴影会重叠的问题,不好解决。
#7
大哥,能再详细说明么?
#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
重叠是因为没有刷掉之前的那些图片
#10
我知道是因为没有刷掉之前的图片。现在就是需要一个刷新不闪烁,又不重叠的方法。
#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
#14
我用的是PNG图片,是阴影和透明区域的。
用bitmap做双缓存的话,阴影和透明区域会丢失的吧。
用bitmap做双缓存的话,阴影和透明区域会丢失的吧。
#15
先获取父窗口的DC 得到按钮所在地方的背景,接着在画按钮就不会出现透明是黑的了
#16
你试我的代码撒。
#17
grph->画一下背景
这个怎么画
#18
如果背景是纯色,则画png图片之前以该颜色clear一下
,如果背景也是张图片,比较麻烦, 也没找到什么好办法, 那就在画png之前, 让父窗口把背景图的那块区域先画到内存dc,然后从内存dc创建graphics,在绘制png,最后内存dc在bitblt回去.
,如果背景也是张图片,比较麻烦, 也没找到什么好办法, 那就在画png之前, 让父窗口把背景图的那块区域先画到内存dc,然后从内存dc创建graphics,在绘制png,最后内存dc在bitblt回去.
#19
背景是透明的,啥玩意都没有。这样才能看的出png图片的透明部分。
#20
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
#21
#22
[align=left]
CRect rcClient;[/align]
GetClientRect(&rcClient);
ClientToScreen(&rcClient);
GetParent()->ScreenToClient(&rcClient);
GetParent()->InvalidateRect(rcClient,true);//每次绘制透明图片前,更新按钮所在新父窗口区域,按钮的背景也会更新
GetParent()->UpdateWindow();
CClientDC dc(this);
DrawButton(&dc);
ReleaseDC(&dc);