MFC消息处理

我建立了一个基于对话框的程序,对话框上有静态文本区(IDC_STATIC2),并能在静态文本区画图,部分代码CRectrect;CWnd*pWnd=GetDlgItem(... 我建立了一个基于对话框的程序,对话框上有静态文本区(IDC_STATIC2),并能在静态文本区画图,部分代码CRect rect;
CWnd* pWnd = GetDlgItem(IDC_STATIC2);
pWnd->GetClientRect(&rect);
CDC* pDC = pWnd->GetDC();
CPen *pGreenPen=new CPen(PS_SOLID,m_width,RGB(0,0,255));
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
pDC->SelectObject(pBrush);
CPen* pOldPen=pDC->SelectObject(pGreenPen);以后就是绘画的语句,但每当窗口被其他窗口覆盖后,窗口的内容全都不见了,我在onpaint来加了MessageBox();测试,发现任何时候都没有调用onpaint(),然后我在PreTranslateMessage()里截获WM_PAINT消息,发现被覆盖时有WM_PAINT消息发送,这到底是什么个情况,被其他窗口覆盖了,窗口的内容如何能不消失呢?
我想要的解决方法是,设置一个全局变量,让静态文本框判断变量的值来选择是否刷新,如变量为F,不刷新,按下清空按钮把变量设为T,然后刷新,我是思路是这样的,可以实现吗?
展开
 我来答
百度网友a2c7f1d
2011-08-06 · TA获得超过276个赞
知道小有建树答主
回答量:291
采纳率:0%
帮助的人:248万
展开全部
重写OnEraseBkgnd(),在这里面再画一次,一般都使用双缓存技术,在内存中画好,在OnEraseBkgnd中直接copy出来,可以看看CDC的BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );
追问
这位仁兄,你的BitBlt()貌似有用,我是在静态文本框上画图的,请问怎么将我画好的图保存起来,并通过BitBlt()在onpaint()里重绘出来呢?(我的onpaint有响应了,原来我在消息队列里忘记吧Onpain消息添加上去了),谢谢了,告诉我吧
追答
先创建兼容内存dc,创建兼容位图,将位图选进内存dc,在内存dc中画图然后刷新背景的时候使用bitblt从内存dc中拷贝到屏幕dc。是在OnEraseBkgnd中处理,别在OnPaint中,OnPaint中处理这些东西是很耗资源的。那些书上说在OnPaint中画图都是简单的初级的东西。具体函数你看下CDC类和CBitmap类,很容易就能找到的。
知识海洋的小学徒
2011-08-06 · TA获得超过889个赞
知道小有建树答主
回答量:278
采纳率:0%
帮助的人:430万
展开全部
添加WM_DRAWITEM消息,然后在该消息的响应函数里面添加绘制代码。
void CTestDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your message handler code here and/or call default
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
if(nIDCtl==IDC_STATIC2)
{
CWnd* pWnd = GetDlgItem(IDC_STATIC2);
pWnd->GetClientRect(&rect);
CPen *pGreenPen=new CPen(PS_SOLID,m_width,RGB(0,0,255));
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
dc.SelectObject(pBrush);
CPen* pOldPen=dc.SelectObject(pGreenPen);
}
dc.Detach();

CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
faketamendie
2011-08-06 · 超过55用户采纳过TA的回答
知道小有建树答主
回答量:164
采纳率:0%
帮助的人:140万
展开全部
没有释放DC
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shengleiliyu
2011-08-07 · TA获得超过418个赞
知道答主
回答量:185
采纳率:0%
帮助的人:84.4万
展开全部
有一个叫窗口重绘,你知道吧。再你的窗口改变了大小或者被其他窗口覆盖又恢复就会发生窗口重绘。重绘了以后。你花的东西当然就没有了啊 。重绘要交给WM_PAINT。消息。所以我们要再程序中保存你要画的内容。然后再WM_PAINT中重新绘制出来就好了。如果你是用的MFC的话。就在ON_DRAW中实现。
更多追问追答
追问
这个是自然的,不过我的画图代码是在多哥位置的,而且里面有关于vector的添加,所以当放到消息处理里面时,就会对vector不断的添加数据,这不是我期望的结果,而且要把全部的画图代码放到消息处理中,很多,也很繁琐,我只想把原来画好的图保存,在重绘时就把它复制到当前的区域就OK了,这样更加方便,但是我做不到啊···所以求救
追答
申请一个存储体,用来存储不断增加的数据,然后把存储体重绘出来就好了。,、
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式