Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ MFC:窗口响应太慢_Visual C++_Mfc - Fatal编程技术网

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(这个)从void
CMainFrame::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)}