MFC释放位图的问题!
我的画图函数是这样的voidcreate(intm,intn){CClientDCdc(((CFrameWnd*)AfxGetMainWnd())->GetActiveV...
我的画图函数是这样的
void create(int m,int n) {
CClientDC dc(((CFrameWnd *)AfxGetMainWnd())->GetActiveView());
CDC *mdc=new CDC;
mdc->CreateCompatibleDC(&dc);
mdc->SelectObject(&avatar);
// TransparentBlt(NULL,m,n-23,32,55,mdc,0,0,32,55,RGB(0,0,0xff));
dc.BitBlt(m,n-23,32,55,mdc,0,0,SRCCOPY);
delete mdc;
ReleaseDC(m_hWnd,dc);
avatar.DeleteObject();
// InvalidateRect(m_hWnd,CRect(m,n-32,m+32,n+32),false);
}
问题出在注释掉的那两句。
1.InvalidateRect就是撤销位图用的吧,但是我这个撤销的是整个窗口,而不是我定好的那个区域CRect(m,n-32,m+32,n+32)。是不是句柄的问题?我句柄是这样得到的m_hWnd=GetActiveWindow();
2.TransparentBlt这个。我的位图是中间一个人物,剩下的都是空白。显示的把空白也加上了,我想去掉空白。度娘表示貌似可以用这个函数。但是具体怎么用?如果不用这个函数的话应该怎么把空白部分透明化? 展开
void create(int m,int n) {
CClientDC dc(((CFrameWnd *)AfxGetMainWnd())->GetActiveView());
CDC *mdc=new CDC;
mdc->CreateCompatibleDC(&dc);
mdc->SelectObject(&avatar);
// TransparentBlt(NULL,m,n-23,32,55,mdc,0,0,32,55,RGB(0,0,0xff));
dc.BitBlt(m,n-23,32,55,mdc,0,0,SRCCOPY);
delete mdc;
ReleaseDC(m_hWnd,dc);
avatar.DeleteObject();
// InvalidateRect(m_hWnd,CRect(m,n-32,m+32,n+32),false);
}
问题出在注释掉的那两句。
1.InvalidateRect就是撤销位图用的吧,但是我这个撤销的是整个窗口,而不是我定好的那个区域CRect(m,n-32,m+32,n+32)。是不是句柄的问题?我句柄是这样得到的m_hWnd=GetActiveWindow();
2.TransparentBlt这个。我的位图是中间一个人物,剩下的都是空白。显示的把空白也加上了,我想去掉空白。度娘表示貌似可以用这个函数。但是具体怎么用?如果不用这个函数的话应该怎么把空白部分透明化? 展开
2个回答
展开全部
画图是个很复杂的问题,不是按字面意义理解就可以完成你要的功能的
InvalidateRect是让指定的矩形区域无效化, 而不是“撤销位图” 。 无效化之后系统会自动调用窗口的OnPaint或者OnDraw , “至少”会把你指定的这块地方重画一遍。 如果重画的内容你不满意, 问题出现在OnPaint或者OnDraw函数里, 而不是说你可以有一个“画图函数”来决定显示什么东西,在这个架构下面你显示出来的东西都必须有OnPaint或者OnDraw函数的配合
InvalidateRect是让指定的矩形区域无效化, 而不是“撤销位图” 。 无效化之后系统会自动调用窗口的OnPaint或者OnDraw , “至少”会把你指定的这块地方重画一遍。 如果重画的内容你不满意, 问题出现在OnPaint或者OnDraw函数里, 而不是说你可以有一个“画图函数”来决定显示什么东西,在这个架构下面你显示出来的东西都必须有OnPaint或者OnDraw函数的配合
追问
那请问我应该怎么写?我在CView的OnPaint里画的背景图,在自定义的无基类的CPlayer类里建了这个create()来画人物图。目的就是希望人物在背景上移动,每动一个坐标就撤掉前一个图。现在做出来的效果是每一个坐标上创建的图都叠在一起,一拖拖老长。
我只自学了MFC一个周,很多东西不懂,有白痴问题请多包涵。
追答
一般来说,Dialog类在OnPaint里面写绘图代码,而View类在OnDraw里面写。
像我上面所说的,要点就在于, 任何(正常的)绘图行为应该在OnDraw里进行, 因为重画屏幕调用这个函数,它不配合的话一出现重画内容就没了。 一般的办法是, 比如你想在某个坐标画个小人,就在一个包含所有绘图信息的数据结构里记录这个坐标, 然后InvalidateRect。在OnDraw里面根据这个“包含所有绘图信息的数据结构”的内容来整个画一遍屏幕
大雅新科技有限公司
2024-11-19 广告
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,...
点击进入详情页
本回答由大雅新科技有限公司提供
2011-09-05
展开全部
InvalidateRect 就是撤销位图用的吧?? 不是吧
TransparentBlt(NULL,m,n-23,32,55,mdc,0,0,32,55,RGB(0,0,0xff));
第一个参数为什么是NULL?
TransparentBlt(NULL,m,n-23,32,55,mdc,0,0,32,55,RGB(0,0,0xff));
第一个参数为什么是NULL?
追问
我填句柄它不鸟我。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询