要看具体的代码实例请跳转:点击打开链接
通过一些宏定义实现:
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对象,然后将控制权交还操作系统。