mfc单文档框架剖析

要看具体的代码实例请跳转点击打开链接

通过一些宏定义实现:

IMPLEMENT_DYNCREATE
BEGIN_MESSAGE_MAP

IMPLEMENT_DYNCREATE(class_name,base_class_name)说明:

通过DECLARE_DYNCREATE宏来使用IMPLEMENT_DYNCREATE宏,以允许CObject派生类对象在运行时自动建立。主机使用此功能自动建立对象,例如,当它在串行化过程中从磁盘读取一个对象时,它在类工具里加入IMPLEMENT_DYNCREATE宏。若用户使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏,那么接着使用RUNTIME_CLASS宏和CObject::IsKindOf成员函数以在运行时确定对象类。若declare_dyncreate包含在定义中,那么IMPLEMENT_DYNCREATE必须包含在类工具中。

CMainFrame类!!!为框架窗口对象,对应应用程序的主窗口。

1 在MainFrm.h头文件中声明派生自CFrameWnd类的CMainFrame类定义。
class CMainFrame : public CFrameWndEx
{
    //内容
    // 控件条嵌入成员

// 生成的消息映射函数
protected:
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnViewCustomize();
	afx_msg LRESULT OnToolbarCreateNew(WPARAM wp, LPARAM lp);
	DECLARE_MESSAGE_MAP()
}
2 在MainFrm.cpp源文件中实现动态创建及消息映射等类方法的重写工作。
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWndEx)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
	ON_WM_CREATE()
	ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize)
	ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew)
	ON_WM_GETMINMAXINFO()
END_MESSAGE_MAP()

// 状态行指示器
static UINT indicators[] =
{    // 状态行指示器
	ID_SEPARATOR,           //分离器
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};
 CMainFrame 构造/析构
CMainFrame::CMainFrame()
{
}

CMainFrame::~CMainFrame()
{
}

CxxxApp类!!!为应用程序对象,负责应用程序的初始化和退出的清理工作

1 在 DllUseDemo.h头文件 中声明CDllUseDemoApp类。
class CDllUseDemoApp : public CWinAppEx
{

}
//在头文件中定义外部变量(App的对象)
extern CDllUseDemoApp theApp;

2 在 DllUseDemo.cpp源文件 中定义CDllUseDemoApp类。

BEGIN_MESSAGE_MAP(CDllUseDemoApp, CWinAppEx)
	ON_COMMAND(ID_APP_ABOUT, &CDllUseDemoApp::OnAppAbout)
	// 基于文件的标准文档命令
	ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew)
	ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen)
END_MESSAGE_MAP()

//CDllUseDemoApp构造
CDllUseDemoApp::CDllUseDemoApp()
{
	m_bHiColorIcons = TRUE;

	// TODO: 将以下应用程序 ID 字符串替换为唯一的 ID 字符串;建议的字符串格式
	SetAppID(_T("DllUseDemo.AppID.NoVersion"));
        // 将所有重要的初始化放置在 InitInstance 中
}
// 唯一的一个 CDllUseDemoApp 对象
CDllUseDemoApp theApp;

// CDllUseDemoApp 初始化
BOOL CDllUseDemoApp::InitInstance()
{
        //所有重要的初始化
 	InitContextMenuManager();
	InitKeyboardManager();
	InitTooltipManager();

	// 唯一的一个窗口已初始化,因此显示它并对其进行更新
	m_pMainWnd->ShowWindow(SW_SHOW);
	m_pMainWnd->UpdateWindow();
}

CAboutDlg类!!!对话框框类,对应应用程序的“帮助”->“关于”菜单,弹出“关于”对话框。

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

protected:
	DECLARE_MESSAGE_MAP()
}

CxxxView类!!!为视图对象,对应应用程序的客户窗口,用来显示文档数据。
1 在CDllUseDemoView.h头文件中声明CDllUseDemoView类。
class CDllUseDemoView : public CScrollView
{
protected: // 仅从序列化创建
	CDllUseDemoView();
	DECLARE_DYNCREATE(CDllUseDemoView)
public:
	 HANDLE m_pdispThread;//显示线程
	 HANDLE m_pCapThread;//调用DLL线程
}

2 在CDllUseDemoView.cpp源文件中。
//实现动态创建
IMPLEMENT_DYNCREATE(CDllUseDemoView, CScrollView)

BEGIN_MESSAGE_MAP(CDllUseDemoView, CScrollView)
	ON_WM_CONTEXTMENU()
	ON_WM_RBUTTONUP()
	ON_WM_LBUTTONDBLCLK()
END_MESSAGE_MAP()

CDllUseDemoView::CDllUseDemoView()
{
}

CDllUseDemoView::~CDllUseDemoView()
{
}
BOOL CDllUseDemoView::PreCreateWindow(CREATESTRUCT& cs){}

// CDllUseDemoView 绘制
void CDllUseDemoView::OnDraw(CDC* /*pDC*/){}

//用于显示的线程
void CDllUseDemoView::OnInitialUpdate(){}

void CDllUseDemoView::OnRButtonUp(UINT /* nFlags */, CPoint point){}
void CDllUseDemoView::OnContextMenu(CWnd* /* pWnd */, CPoint point){}
void CDllUseDemoView::OnLButtonDblClk(UINT nFlags, CPoint point){}
CxxxDoc类!!!派生自CDocument文档类,为文档对象,储存于应用程序相关的数据。在应用中没有直观的对应关系。
class CDllUseDemoDoc : public CDocument
{
}
程序的执行过程可以简单的表示如下:
CWinApp 类创建的实例theApp , 整个程序有且只有一个,一切由它开始,最后以它结束。
Visual c++所产生的代码首先通过初始数据段来创建一个全局变量,以及建立一些MFC内使用的对象,然后指向CWinApp类的构造函数,一旦所有静态对象的构造函数都执行完毕,运行是艰苦就会调用WinMain函数,该函数初始化MFC应用,并调用CWinApp的InitInstance函数。完成了这些工作后,WinMian函数调用CWinApp类的Run函数,通常默认为CWinThread::Run() , 用来得到应用程序的消息循环,或者称为消息列队。
当应用程序接受到WM_QUIT消息,就意味着程序终止,这时,MFC就会调用CWinApp类的ExitInstance,然后是静态对象的析构函数,包括CWinApp对象,然后将控制权交还操作系统。



发布了81 篇原创文章 · 获赞 118 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/dlphay/article/details/79436685