Visual c++ MFC:窗口响应太慢
我的框架窗口类中有以下代码Visual c++ MFC:窗口响应太慢,visual-c++,mfc,Visual C++,Mfc,我的框架窗口类中有以下代码 void CMainFrame::OnPaint() { CPaintDC dc(this); } 我有一个按钮式事件处理程序 void CMainFrame::OnLButtonUp(UINT nFlags, CPoint point) { CShapes shape; CFrameWnd::OnLButtonUp(nFlags, point); CPaintDC dc(this); CRect client; G
void CMainFrame::OnPaint()
{
CPaintDC dc(this);
}
我有一个按钮式事件处理程序
void CMainFrame::OnLButtonUp(UINT nFlags, CPoint point) {
CShapes shape;
CFrameWnd::OnLButtonUp(nFlags, point);
CPaintDC dc(this);
CRect client;
GetClientRect(&client);
shape.DrawRectangle(&dc, client, 10,10, 10,10);
shape.DrawRoundRectangle(&dc, client, 50, 50, 50, 50, 20, 20);
}
但按钮后不会绘制矩形。但是,当我删除CPaintDC(这个)代码>从voidCMainFrame::OnPaint()
开始工作,但随后窗口响应非常慢。它消耗了太多的内存
还尝试在CPaintDC()中使用AfxGetMainWnd()
而不是CPaintDC()中的this
,void CMainFrame::OnPaint()
但它不起作用。它起作用了。。
我添加了Invalidate()在CMainFrame::OnPaint()
方法的末尾,它成功了
void CMainFrame::OnPaint()
{
CPaintDC dc(this);
Invalidate();
}
不要在按钮处理程序中绘制代码。在调用CPaintDC dc(this)
之后,将代码从onbuttonup
移动到OnPaint
例程(但取出CFrameWnd::onbuttonup(nFlags,point);
code)
CPaintDC dc(this)
只能在OnPaint
例程中调用,而不能在按钮处理程序中调用。(-CPaintDC对象只能在响应WM_PAINT消息时使用,通常在OnPaint消息处理程序成员函数中使用。)
在绘制例程中调用Invalidate
,将导致无限循环 CPaintDC
是一个RAII对象,它在ctor
中包装BeingPaint()
,在dtor
中包装EndPaint()
(发生在函数末尾)。所以在这种情况下,你没有画任何东西<每当窗口需要绘制时,都会调用code>OnPaint
。它甚至不是由用户驱动的。它发生在相当多的事件上,如窗口激活、重叠等。单击按钮不会触发OnPaint
事件,除非它导致窗口重新绘制或强制无效
。另外,CPaintDC仅在OnPaint函数中使用。对于其他图形,必须使用CDC类。(调用GetDC()
执行绘制操作并ReleaseDC()
)
我建议在OnPaint
函数中编写绘图代码,以实现持久绘图。绘制矩形的数据可以存储在类中,并指示使用标志(尽管基于标志的编码不是一个好主意),并在OnPaint
函数中绘制。事件处理程序中的绘图(单击按钮)的问题是,当窗口刷新时,绘图将消失。像这样的怎么样
void CMainFrame::OnPaint()
{
CPaintDC dc(this);
if(draw_rect)
{
CShapes shape;
CRect client;
GetClientRect(&client);
shape.DrawRectangle(&dc, client, 10,10, 10,10);
shape.DrawRoundRectangle(&dc, client, 50, 50, 50, 50, 20, 20);
}
}
void CMainFrame::OnLButtonUp(UINT nFlags, CPoint point) {
CFrameWnd::OnLButtonUp(nFlags, point);
draw_rect = true;
}
它变得如此缓慢的原因是您正在创建一个无限的“不做任何事情”循环。您必须遵守两条绝对规则:
OnPaint处理程序必须具有CPaintDC(此)
所有其他消息处理程序不得包含CPaintDC
把你的画移到画板上 我不认为在绘制函数内部无效是个好主意。相信我,这是个坏主意。在BeginPaint
和EndPaint
之间调用invalidate
,没有意义。停止同时单击代码并阅读。我无法将其拉出我想要实现的目标。我需要在每次单击时生成一个新的矩形(形状)。我甚至不能给你看,它不起作用。。这是我的密码。void CMainFrame::OnLButtonUp(UINT nFlags,CPoint point){CFrameWnd::OnLButtonUp(nFlags,point);draw_rect=true;sendmages(WM_PAINT);}void CMainFrame::OnPaint(){CPaintDC dc(this);CRect client;GetClientRect(&client);if(draw_rect==true){shape.draw矩形(&dc,client,10,10,10)}