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

Getting a debug assertion error when calling GetDC() (MFC)

我正在使用 Doc/View 架构和 Visual Studio 2017 制作 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);
}

这是应用中定义的消息映射宏class:

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()

因此,每当我 select 应用程序菜单中的 "Clear Screen" 选项时,会调用 ClearScreen() 但我无法获取视图的 DC,它会崩溃。

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

我也想知道每当我 select 一个菜单选项时,还有什么其他方法可以从 App class 调用视图 class 的函数,因为这似乎没有工作。

您如何获得指向 CDigitRecognizerView 函数的 CWinApp 消息映射?我认为 "wizard" 不会这样做。您是否手动添加了处理程序?

至于从 CWinApp class 访问 Doc/View 个实例,有一些函数可用:

  • GetFirstDocTemplatePosition()/GetNextDocTemplate()CWinAppclass的成员。或者,您可以简单地存储在 InitInstance() 函数中创建的 pDocTemplate 实例。然后调用:
  • GetFirstDocPosition()/GetNextDoc(),成员CDocTemplateclass,最后:
  • GetFirstViewPosition() / GenNextView(),成员 CDocument class

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