GDI+画图怎么去掉原来的背景?

lxw_it 2013-03-06 01:57:54
Image m_pImageClock(m_strImageName);
HDC hDC = ::GetDC(m_hWnd);
int length = m_pImageClock.GetWidth();
int heigth = m_pImageClock.GetHeight();
Point points[] = { Point(0, 0), Point(length, 0), Point(0, heigth)};
Graphics graph(hDC);
graph.DrawImage(&m_pImageClock,points, 3);

帖上去的是透明的PNG图片。
在OnmouseMove中画图,可是每次都会画一遍,没有清除原来画过的图片,导致画同一张图的时候颜色越来越深,如果不是同一张图就会叠加在一起。
窗口最小化再还原后就好了。但是鼠标靠近的时候还是悲剧。

在控件自绘里调用Invalidate();想让其重绘,没效果。

怎么样才能在画图之前先清空原来的图片?
...全文
790 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
繁重的秋春 2014-08-25
  • 打赏
  • 举报
回复
引用 21 楼 gdstx 的回复:
在控件里Invalidate()是没有反应的, 你要刷新控件所在的父窗口区域, 这样肯定能行: void CXXX::InvalidateParent() { CRect rect; this->GetWindowRect(&rect); GetParent()->ScreenToClient(&rect); GetParent()->InvalidateRect(&rect); } 另外好像GDI+画透明PNG是有问题的, 具体你上网查一下, 有替代的源码。
高手啊
rootlife 2013-09-17
  • 打赏
  • 举报
回复
21楼的方法, 非正道, 你应该让控件自己处理自身的绘图, 如果是想控制控件的话. 前景, 背景, 自绘, 随便选择一个, 都可以正常工作. 楼主的基础知识太薄弱了.
yoyotiogo 2013-08-23
  • 打赏
  • 举报
回复
引用 22 楼 lxw_it 的回复:
21楼终结。 谢谢大家~
我靠,,这有效是没错,,遇到特殊情况闪死你~~sighshadow兄弟,,明白的人都为你感觉到亏··
higher9999 2013-07-23
  • 打赏
  • 举报
回复
21楼的方法果然有效,这个问题也困扰了我很久,谢谢!
lxw_it 2013-03-08
  • 打赏
  • 举报
回复
自定义图片。不知道会是什么的
引用 24 楼 sighshadow 的回复:
引用 20 楼 lxw_it 的回复:我大概明白了,你这样是骗人的。 要是换一张背景图,你这个效果就不行了。我是想要支持换背景的,你这种方式不合适。 引用 16 楼 sighshadow 的回复:不过我没有从按钮派生。不过道理都相似 你按钮在对话框上,按钮透明 那么对话框上的那部分就是按钮的背景。因为两个背景一样,也就是透明 或者说给别人一种透明的效果。你看上图中……
gdstx 2013-03-07
  • 打赏
  • 举报
回复
在控件里Invalidate()是没有反应的, 你要刷新控件所在的父窗口区域, 这样肯定能行: void CXXX::InvalidateParent() { CRect rect; this->GetWindowRect(&rect); GetParent()->ScreenToClient(&rect); GetParent()->InvalidateRect(&rect); } 另外好像GDI+画透明PNG是有问题的, 具体你上网查一下, 有替代的源码。
lxw_it 2013-03-07
  • 打赏
  • 举报
回复
我大概明白了,你这样是骗人的。 要是换一张背景图,你这个效果就不行了。我是想要支持换背景的,你这种方式不合适。
引用 16 楼 sighshadow 的回复:
不过我没有从按钮派生。不过道理都相似 你按钮在对话框上,按钮透明 那么对话框上的那部分就是按钮的背景。因为两个背景一样,也就是透明 或者说给别人一种透明的效果。你看上图中的 那两态图也是png 我每次都会先画那个粉红的部分,然后再画png。
lxw_it 2013-03-07
  • 打赏
  • 举报
回复
就是想实现你这种效果。 可是,如果你没派生,那是不是子控件给窗体发消息,让窗体来画?
引用 15 楼 sighshadow 的回复:
引用 14 楼 lxw_it 的回复: 其实我的思路就是,即然最小化后还原就可以。那我就模拟这种做法,调用WM_ERASEBKGND先擦除,可是竟然不起作用。 ::SendMessage(m_hWnd,WM_ERASEBKGND,0,0); 在OnMouseMove中又不会擦除背景。 另外,像360或扣扣的桌面应用,右上角的按钮效果是怎么实现的? 以上是我做的一个……
lxw_it 2013-03-07
  • 打赏
  • 举报
回复
思路我也很清楚,我本尝试用各种方法擦除背景,可是没成功。 现在想先画背景,可是我从哪里得到原来的背景?
引用 17 楼 allenhiman 的回复:
楼主没看懂我的说辞吗 你的问题我遇到过的 就得那样解决 先用背景色 或背景图案擦除clock所在的区域 再画clock。
allenhiman 2013-03-07
  • 打赏
  • 举报
回复
楼主没看懂我的说辞吗 你的问题我遇到过的 就得那样解决 先用背景色 或背景图案擦除clock所在的区域 再画clock。
sighshadow 2013-03-07
  • 打赏
  • 举报
回复
不过我没有从按钮派生。不过道理都相似 你按钮在对话框上,按钮透明 那么对话框上的那部分就是按钮的背景。因为两个背景一样,也就是透明 或者说给别人一种透明的效果。你看上图中的 那两态图也是png 我每次都会先画那个粉红的部分,然后再画png。
sighshadow 2013-03-07
  • 打赏
  • 举报
回复
引用 14 楼 lxw_it 的回复:
其实我的思路就是,即然最小化后还原就可以。那我就模拟这种做法,调用WM_ERASEBKGND先擦除,可是竟然不起作用。 ::SendMessage(m_hWnd,WM_ERASEBKGND,0,0); 在OnMouseMove中又不会擦除背景。 另外,像360或扣扣的桌面应用,右上角的按钮效果是怎么实现的?
以上是我做的一个小程序中的一部分,就是我说的那样,先刷一次背景。你可以手动在画png的时候先画一次背景 不需要调WM_ERASEBKGND
lxw_it 2013-03-07
  • 打赏
  • 举报
回复
其实我的思路就是,即然最小化后还原就可以。那我就模拟这种做法,调用WM_ERASEBKGND先擦除,可是竟然不起作用。 ::SendMessage(m_hWnd,WM_ERASEBKGND,0,0); 在OnMouseMove中又不会擦除背景。 另外,像360或扣扣的桌面应用,右上角的按钮效果是怎么实现的?
lxw_it 2013-03-07
  • 打赏
  • 举报
回复
如果按钮的背景真是对话框的前景的话我倒是理解。 只是这种情况,我如何保存对话框中该区域的图片信息?
引用 11 楼 sighshadow 的回复:
引用 5 楼 lxw_it 的回复: 没有背景。帖图前就是完全透明的一个控件,看不到的。 引用 3 楼 sighshadow 的回复:lz 你说的透明总有个相对图片吧。如果你没背景底层图片,直接在对话框上贴的。那每次换图之前 也倾城对话框原有的背景色不就行了么。如果有背景图,背景先贴背景图,再贴你的透明Png。简单的来说,就是你没图之前的状态为0 贴图1的时候,先画成0的状态== 具体需求……
lxw_it 2013-03-07
  • 打赏
  • 举报
回复
试过了,这样没效果。 主要是onMouseMove根本不会调用重绘。。。 我主动调用也没起作用。但是最小化后还原又可以...
引用 10 楼 flyingsailing_an 的回复:
引用 8 楼 lxw_it 的回复: 没有处理这个消息,控件本身也会调用这个消息清除吧。 只是在最小化的时候会清除,但是鼠标靠近时没有清除。 我在OnMouseMove中调用 ::SendMessage(m_hWnd,WM_ERASEBKGND,0,0);也没效果。。。 引用 6 楼 flyingsailing_an 的回复:在控件自绘里调用Invalidate();想让其重绘,没效果……
sighshadow 2013-03-07
  • 打赏
  • 举报
回复
引用 5 楼 lxw_it 的回复:
没有背景。帖图前就是完全透明的一个控件,看不到的。 引用 3 楼 sighshadow 的回复:lz 你说的透明总有个相对图片吧。如果你没背景底层图片,直接在对话框上贴的。那每次换图之前 也倾城对话框原有的背景色不就行了么。如果有背景图,背景先贴背景图,再贴你的透明Png。简单的来说,就是你没图之前的状态为0 贴图1的时候,先画成0的状态== 具体需求,不大请求 我……
其实还是有背景,假如说你的dialog上面的背景是一个萌妹子===然后dialog上面有一个按钮 按钮是完全透明的。那么其实相当于按钮的背景就是萌妹子..保存这个区域的位图就是按钮的背景了 以后画图先画这个萌妹子..然后就能实现绘制多长半透明png 这种情况,我做过 不知道我表述清楚木有。
  • 打赏
  • 举报
回复
引用 8 楼 lxw_it 的回复:
没有处理这个消息,控件本身也会调用这个消息清除吧。 只是在最小化的时候会清除,但是鼠标靠近时没有清除。 我在OnMouseMove中调用 ::SendMessage(m_hWnd,WM_ERASEBKGND,0,0);也没效果。。。 引用 6 楼 flyingsailing_an 的回复:在控件自绘里调用Invalidate();想让其重绘,没效果。??? 处……
我在之前的开发中也处理过类似问题,但做的不是自绘控件,可能自绘的时候有不同之处。不妨试一下,在WM_ERASEBKGND画背景,看是否有效果
lxw_it 2013-03-07
  • 打赏
  • 举报
回复
我就是在Onpaint中GDI+、Image,graphics.DrawImage
引用 7 楼 sha_jinhao 的回复:
没有背景。帖图前就是完全透明的一个控件,看不到的。 完全透明的控件可以贴图 但是你画图画在什么上面呢?
lxw_it 2013-03-07
  • 打赏
  • 举报
回复
没有处理这个消息,控件本身也会调用这个消息清除吧。 只是在最小化的时候会清除,但是鼠标靠近时没有清除。 我在OnMouseMove中调用 ::SendMessage(m_hWnd,WM_ERASEBKGND,0,0);也没效果。。。
引用 6 楼 flyingsailing_an 的回复:
在控件自绘里调用Invalidate();想让其重绘,没效果。??? 处理过WM_ERASEBKGAND消息么?
jimette 2013-03-07
  • 打赏
  • 举报
回复
没有背景。帖图前就是完全透明的一个控件,看不到的。 完全透明的控件可以贴图 但是你画图画在什么上面呢?
加载更多回复(8)

15,980

社区成员

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

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