Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/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
调用GetDC()时获取调试断言错误(MFC)_Mfc_Visual Studio Debugging - Fatal编程技术网

调用GetDC()时获取调试断言错误(MFC)

调用GetDC()时获取调试断言错误(MFC),mfc,visual-studio-debugging,Mfc,Visual Studio Debugging,我正在使用Visual Studio 2017的Doc/View体系结构制作一个MFC应用程序,出于某种原因,每当我在这个函数中调用GetDC()时,我都会遇到这个错误: void CDigitRecognizerView::ClearScreen(void) { CDC* dc; dc = GetDC(); // debug assertion error here CBrush brush; brush.CreateSolidBrush(0xFFFFFF);

我正在使用Visual Studio 2017的Doc/View体系结构制作一个MFC应用程序,出于某种原因,每当我在这个函数中调用GetDC()时,我都会遇到这个错误:

void CDigitRecognizerView::ClearScreen(void)
{
    CDC* dc;
    dc = GetDC(); // debug assertion error here
    CBrush brush;
    brush.CreateSolidBrush(0xFFFFFF);
    dc->SelectObject(&brush);

    CRect rect;
    GetWindowRect(&rect);

    dc->FillRect(&rect, &brush);
    CDigitRecognizerDoc* pDocument = GetDocument();

    ReleaseDC(dc);
}
这是在app类中定义的消息映射宏:

BEGIN_MESSAGE_MAP(CDigitRecognizerApp, CWinApp)
    ON_COMMAND(ID_APP_ABOUT, &CDigitRecognizerApp::OnAppAbout)
    ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew)
    ON_COMMAND(ID_FILE_OPEN, &CWinApp::OnFileOpen)
    ON_COMMAND(ID_EDIT_CLEARSCREEN, CDigitRecognizerView::ClearScreen)
END_MESSAGE_MAP()
因此,每当我从应用程序的菜单中选择“Clear Screen”选项时,就会调用ClearScreen(),但我无法获取视图的DC,它就会崩溃

我已经查看了调试器中的变量,窗口句柄似乎还可以,所以我真的不知道


我还想知道,每当我选择一个菜单选项时,还有什么其他方法可以从App类调用View类的函数,因为这似乎不起作用。

您是如何获得指向
cdigitrecogniverView
函数的
CWinApp
消息映射的?我想“巫师”不会这么做的。您是否手动添加了处理程序

对于从
CWinApp
类访问Doc/View实例,可以使用以下功能:

  • GetFirstDoctTemplatePosition()
    /
    GetNextDoctTemplate()
    ,CWinApp类的成员。或者,您可以简单地存储在
    InitInstance()
    函数中创建的
    pDocTemplate
    实例。然后打电话:
  • GetFirstDocPosition()
    /
    GetNextDoc()
    ,CDOctTemplate类的成员,最后:
  • GetFirstViewPosition()
    /
    GenNextView()
    ,属于
    CDocument
    类的成员

但这通常是不需要的(事件可以在Doc/View类中处理),除非您希望对所有(或部分)DocTemplate/Doc/View实例执行某些操作(这意味着您正在开发MDI应用程序)。

是的,我手动添加了它。我正在制作一个SDI应用程序。那么,在不直接从CWinApp访问CView的情况下,如何处理菜单选择呢?这非常简单,转到“类视图”选项卡,选择CDigitReconnerview类,然后在“属性”窗格中单击“事件”按钮,并在那里添加处理程序(命令,可能还有更新命令\u UI).它仍然会有问题,可能会在以后崩溃。在将旧笔刷选择到DC中之前,您正在将笔刷选择到DC中并删除/销毁DC。事实上,您保存旧笔刷并不是为了将其选择回DC。您是否尝试跟踪到
GetDC
以查看其崩溃的确切位置?另外,确切的错误是什么,你没有提出这个问题?以前从未尝试过追踪,所以我不知道如何准确地做到这一点。我试着进入它,但我显然错过了一个模块。