我正在尝试编写一个简单的MFC应用程序,它使用基于CFrameWnd的代码在可滚动窗口中绘制。下面的代码改编自Prosise的《使用MFC编程Windows》第二版89页及以下内容。
当我在调试器中运行此代码时,我会收到两个“一次性异常”。如果我忽略这些异常,窗口将按预期显示,并且我可以在其中绘图。如果我启用“C ++异常”断点,则会得到一个仅包含“内部”代码的堆栈,我没有该源代码。通过逐步执行代码,我发现异常发生在CWnd :: CreateEx中,在调用CreateWindowEx时。
这段代码有什么问题?64位Windows 7,Visual Studio 2013更新4。这是一个调试版本,x64,在静态库中使用MFC,在多字节字符集中使用多线程调试运行时(/ MTd)。
当我在调试器中运行此代码时,我会收到两个“一次性异常”。如果我忽略这些异常,窗口将按预期显示,并且我可以在其中绘图。如果我启用“C ++异常”断点,则会得到一个仅包含“内部”代码的堆栈,我没有该源代码。通过逐步执行代码,我发现异常发生在CWnd :: CreateEx中,在调用CreateWindowEx时。
这段代码有什么问题?64位Windows 7,Visual Studio 2013更新4。这是一个调试版本,x64,在静态库中使用MFC,在多字节字符集中使用多线程调试运行时(/ MTd)。
// Viewer.h
#include <afxwin.h>
// Adapted from Prosise "Programming Windows with MFC", 2nd ed, pp 89ff.
class CViewerApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
class CMainWindow : public CFrameWnd
{
public:
CMainWindow();
protected:
afx_msg void OnPaint();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnHScroll(UINT nCode, UINT nPos, CScrollBar *pScrollBar);
afx_msg void OnVScroll(UINT nCode, UINT nPos, CScrollBar *pScrollBar);
public:
DECLARE_MESSAGE_MAP()
};
// Viewer.cpp: Display
#include <afxwin.h>
#include "Viewer.h"
CViewerApp myApp;
BOOL CViewerApp::InitInstance()
{
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_PAINT()
ON_WM_HSCROLL()
ON_WM_VSCROLL()
END_MESSAGE_MAP()
CMainWindow::CMainWindow()
{
Create(NULL, "Viewer", WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL | WS_MAXIMIZE);
}
int CMainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
void CMainWindow::OnPaint()
{
}
void CMainWindow::OnSize(UINT nType, int cx, int cy)
{
//TO DO
}
void CMainWindow::OnHScroll(UINT nCode, UINT nPos, CScrollBar *pScrollBar)
{
}
void CMainWindow::OnVScroll(UINT nCode, UINT nPos, CScrollBar *pScrollBar)
{
}