【问题标题】:Getting a debug assertion error when calling GetDC() (MFC)调用 GetDC() (MFC) 时出现调试断言错误
【发布时间】:2018-04-23 16:32:25
【问题描述】:

我正在使用带有 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);
}

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

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,它会崩溃。

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

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

【问题讨论】:

  • 您是否尝试过追踪GetDC 以查看其崩溃的确切位置?附言确切的错误是什么,您没有将其放入问题中?
  • 以前从未尝试过跟踪,所以我不知道该怎么做。我尝试进入它,但显然我错过了一个模块。

标签: mfc visual-studio-debugging


【解决方案1】:

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

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

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

但这通常是不需要的(事件可以在 Doc/View 类中处理),除非您想对所有(或部分)DocTemplate/Doc/View 实例(而不是表示您正在开发 MDI 应用程序)。

【讨论】:

  • 是的,我手动添加了它。我正在制作一个 SDI 应用程序。那么如何在不直接从 CWinApp 访问 CView 的情况下处理菜单选择呢?
  • 这真的很简单,转到“类视图”选项卡,选择 CDigitRecognizerView 类,然后在“属性”窗格中单击“事件”按钮,并在那里添加一个处理程序(COMMAND 和可能的 UPDATE_COMMAND_UI)。
  • 它仍然会出现问题,并且可能会在稍后崩溃。在选择旧刷子进入 DC 之前,您正在选择刷子进入 DC 并删除/销毁 DC。事实上,您并没有保存旧画笔以便能够将其选回 DC。
猜你喜欢
  • 1970-01-01
  • 2012-11-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 2012-03-06
相关资源
最近更新 更多