Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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
C++ WinCE/WinMo上的异常行为无效_C++_Windows_Mfc_Windows Ce_Gdi - Fatal编程技术网

C++ WinCE/WinMo上的异常行为无效

C++ WinCE/WinMo上的异常行为无效,c++,windows,mfc,windows-ce,gdi,C++,Windows,Mfc,Windows Ce,Gdi,在一个早已被遗忘的应用程序中改进绘图程序时,我遇到了一些无法解释且令人兴奋的行为 简而言之。该应用程序是在WindowsNT(及以上)和WindowsCE(及移动)上运行的跨平台(强word)程序 现在,在我展示一些代码之前(我认为没有必要),我将尝试解释问题所在。应用程序在对话框上显示许多对象。为了避免重画我想的所有东西,为什么不使用旧的解决方案呢。所以我想出了这样的办法: void CProblemDialog::OnPaint() { CRect rect; if (!G

在一个早已被遗忘的应用程序中改进绘图程序时,我遇到了一些无法解释且令人兴奋的行为

简而言之。该应用程序是在WindowsNT(及以上)和WindowsCE(及移动)上运行的跨平台(强word)程序

现在,在我展示一些代码之前(我认为没有必要),我将尝试解释问题所在。应用程序在对话框上显示许多对象。为了避免重画我想的所有东西,为什么不使用旧的解决方案呢。所以我想出了这样的办法:

void CProblemDialog::OnPaint() 
{
    CRect rect;
    if (!GetUpdateRect(&rect))
        return;

    CPaintDC dc(this);
    CMemDC memDC(&dc); 

    CRgn rgn;
    rgn.CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom);
    _drawer._theClip = &rgn;
    _drawer.PaintOnDC(&memDC);
}

void CDrawer::PaintOnDC(CDC *pDC) 
{
    for (int i = 0; i < _arrElems.GetSize(); i++) {
        CElement *e = (CElement*)_arrCtl.GetAt(i);
        if (e->IsVisible() && _theClip->RectInRegion(e->_rect))
            e->PaintOnDC(pDC);
    }
}
消息来自网络并排队。当有东西进入队列时,windows消息被发送到windows以处理队列(通常在一个元素进入队列之后),但当主对话框代码开始处理队列时,它必须将其保留为空,因此当新的东西到达时,它将在同一个windows消息处理程序中处理(不用担心,会有一个killswitch来避免泛洪)。因此,两个或两个以上的元素可能会“同时”失效(通常是这样)

所以我们遇到了一个问题。当在一个循环中应用程序多次调用时,在移动平台上它将只重新绘制第一个区域,其余区域不变。这种情况不会发生在“大”窗口上

还有一个陷阱。当使用调试器时,我在OnPaint处中断,然后所有内容都正确绘制

另一件奇怪的事情是,当我使用BeginPaint/EndPaint方法时,在“大”窗口上没有绘制任何东西,但是上面的错误仍然存在于移动设备上

抱歉这么长的文字,但我想让你知道应用程序中发生了什么

InvalidateRect(this->_rect);