我在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,它崩溃。
我查看了调试器中的变量,窗口句柄似乎没问题,所以我真的不知道。
我也想知道每当我选择菜单选项时,我可以从App类调用View类的函数的其他方式,因为这似乎不起作用。
答案 0 :(得分:0)
你是如何得到指向CWinApp
函数的CDigitRecognizerView
消息地图的?我认为"向导"不会这样做。您是否手动添加了处理程序?
至于从CWinApp
类访问Doc / View实例,有一些可用的功能:
GetFirstDocTemplatePosition()
/ GetNextDocTemplate()
,CWinApp
班的成员。或者,您只需存储在pDocTemplate
函数中创建的InitInstance()
实例。然后致电:GetFirstDocPosition()
/ GetNextDoc()
,CDocTemplate
班的成员,最后:GetFirstViewPosition()
/ GenNextView()
,CDocument
类但通常不需要(事件可以在Doc / View类中处理),除非您想对所有(或某些)DocTemplate / Doc / View实例执行某些操作(相反暗示您正在开发MDI应用程序。)