调用GetDC()(MFC)时出现调试断言错误

时间:2018-04-23 16:32:26

标签: 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);
    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()

每当我选择"清除屏幕"应用菜单中的选项,ClearScreen()被调用,但我无法获得视图的DC,它崩溃。

我查看了调试器中的变量,窗口​​句柄似乎没问题,所以我真的不知道。

enter image description here

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

1 个答案:

答案 0 :(得分:0)

你是如何得到指向CWinApp函数的CDigitRecognizerView消息地图的?我认为"向导"不会这样做。您是否手动添加了处理程序?

至于从CWinApp类访问Doc / View实例,有一些可用的功能:

  • GetFirstDocTemplatePosition() / GetNextDocTemplate()CWinApp班的成员。或者,您只需存储在pDocTemplate函数中创建的InitInstance()实例。然后致电:
  • GetFirstDocPosition() / GetNextDoc()CDocTemplate班的成员,最后:
  • GetFirstViewPosition() / GenNextView()CDocument
  • 的成员

但通常不需要(事件可以在Doc / View类中处理),除非您想对所有(或某些)DocTemplate / Doc / View实例执行某些操作(相反暗示您正在开发MDI应用程序。)