调用GetDC()时获取调试断言错误(MFC)
我正在使用Visual Studio 2017的Doc/View体系结构制作一个MFC应用程序,出于某种原因,每当我在这个函数中调用GetDC()时,我都会遇到这个错误:调用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);
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()
,CWinApp类的成员。或者,您可以简单地存储在GetNextDoctTemplate()
函数中创建的InitInstance()
实例。然后打电话:pDocTemplate
/GetFirstDocPosition()
,CDOctTemplate类的成员,最后:GetNextDoc()
/GetFirstViewPosition()
,属于GenNextView()
类的成员CDocument
但这通常是不需要的(事件可以在Doc/View类中处理),除非您希望对所有(或部分)DocTemplate/Doc/View实例执行某些操作(这意味着您正在开发MDI应用程序)。是的,我手动添加了它。我正在制作一个SDI应用程序。那么,在不直接从CWinApp访问CView的情况下,如何处理菜单选择呢?这非常简单,转到“类视图”选项卡,选择CDigitReconnerview类,然后在“属性”窗格中单击“事件”按钮,并在那里添加处理程序(命令,可能还有更新命令\u UI).它仍然会有问题,可能会在以后崩溃。在将旧笔刷选择到DC中之前,您正在将笔刷选择到DC中并删除/销毁DC。事实上,您保存旧笔刷并不是为了将其选择回DC。您是否尝试跟踪到
GetDC
以查看其崩溃的确切位置?另外,确切的错误是什么,你没有提出这个问题?以前从未尝试过追踪,所以我不知道如何准确地做到这一点。我试着进入它,但我显然错过了一个模块。