https://github.com/wineee/mfcplot/blob/master/MainFrm.cpp 详细地一步步解释代码
时间: 2023-10-03 15:10:51 浏览: 148
MainFrm.cpp
好的,我们来一步步解释这段代码。
首先是头文件的引入:
```cpp
#include "stdafx.h"
#include "MainFrm.h"
#include "ChildFrm.h"
#include "mfcplotdoc.h"
#include "mfcplotview.h"
```
其中 `stdafx.h` 是预编译头文件,包含了常用的系统头文件和项目特定的头文件。`MainFrm.h` 是主窗口的头文件,`ChildFrm.h` 是子窗口的头文件,`mfcplotdoc.h` 是文档类的头文件,`mfcplotview.h` 是视图类的头文件。
然后是主窗口类的实现:
```cpp
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWndEx)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
ON_WM_CREATE()
ON_COMMAND(ID_WINDOW_MANAGER, &CMainFrame::OnWindowManager)
ON_COMMAND(ID_VIEW_APPLOOK_WIN_2000, &CMainFrame::OnViewAppLookWin2000)
ON_COMMAND(ID_VIEW_APPLOOK_OFF_XP, &CMainFrame::OnViewAppLookOffXP)
ON_COMMAND(ID_VIEW_APPLOOK_WIN_XP, &CMainFrame::OnViewAppLookWinXP)
ON_COMMAND(ID_VIEW_APPLOOK_OFF_2003, &CMainFrame::OnViewAppLookOff2003)
ON_COMMAND(ID_VIEW_APPLOOK_VS_2005, &CMainFrame::OnViewAppLookVS2005)
ON_COMMAND(ID_VIEW_APPLOOK_VS_2008, &CMainFrame::OnViewAppLookVS2008)
ON_COMMAND(ID_VIEW_APPLOOK_OFF_2007_BLUE, &CMainFrame::OnViewAppLookOff2007Blue)
ON_COMMAND(ID_VIEW_APPLOOK_OFF_2007_BLACK, &CMainFrame::OnViewAppLookOff2007Black)
ON_COMMAND(ID_VIEW_APPLOOK_OFF_2007_SILVER, &CMainFrame::OnViewAppLookOff2007Silver)
ON_COMMAND(ID_VIEW_APPLOOK_OFF_2007_AQUA, &CMainFrame::OnViewAppLookOff2007Aqua)
ON_COMMAND(ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnViewAppLookWindows7)
ON_UPDATE_COMMAND_UI(ID_VIEW_APPLOOK_WIN_2000, &CMainFrame::OnUpdateViewAppLookWin2000)
ON_UPDATE_COMMAND_UI(ID_VIEW_APPLOOK_OFF_XP, &CMainFrame::OnUpdateViewAppLookOffXP)
ON_UPDATE_COMMAND_UI(ID_VIEW_APPLOOK_WIN_XP, &CMainFrame::OnUpdateViewAppLookWinXP)
ON_UPDATE_COMMAND_UI(ID_VIEW_APPLOOK_OFF_2003, &CMainFrame::OnUpdateViewAppLookOff2003)
ON_UPDATE_COMMAND_UI(ID_VIEW_APPLOOK_VS_2005, &CMainFrame::OnUpdateViewAppLookVS2005)
ON_UPDATE_COMMAND_UI(ID_VIEW_APPLOOK_VS_2008, &CMainFrame::OnUpdateViewAppLookVS2008)
ON_UPDATE_COMMAND_UI(ID_VIEW_APPLOOK_OFF_2007_BLUE, &CMainFrame::OnUpdateViewAppLookOff2007Blue)
ON_UPDATE_COMMAND_UI(ID_VIEW_APPLOOK_OFF_2007_BLACK, &CMainFrame::OnUpdateViewAppLookOff2007Black)
ON_UPDATE_COMMAND_UI(ID_VIEW_APPLOOK_OFF_2007_SILVER, &CMainFrame::OnUpdateViewAppLookOff2007Silver)
ON_UPDATE_COMMAND_UI(ID_VIEW_APPLOOK_OFF_2007_AQUA, &CMainFrame::OnUpdateViewAppLookOff2007Aqua)
ON_UPDATE_COMMAND_UI(ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateViewAppLookWindows7)
END_MESSAGE_MAP()
```
这里使用了 `IMPLEMENT_DYNAMIC` 宏定义来实现动态创建主窗口类,同时定义了消息响应函数的映射表。
接下来是 `OnCreate` 函数的实现:
```cpp
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1;
// 加载菜单栏和工具栏资源
if (!m_wndMenuBar.Create(this))
{
TRACE0("未能创建菜单栏\n");
return -1;
}
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("未能创建工具栏\n");
return -1;
}
CString strToolBarName;
strToolBarName.LoadString(IDS_TOOLBAR_STANDARD);
m_wndToolBar.SetWindowText(strToolBarName);
CString strCustomize;
strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);
m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);
// 隐藏工具栏上的下拉菜单
m_wndToolBar.SetShowDropDownArrow(FALSE);
// 创建状态栏
if (!m_wndStatusBar.Create(this))
{
TRACE0("未能创建状态栏\n");
return -1;
}
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators) / sizeof(UINT));
// 设置窗口标题
SetWindowText(_T("MFCPlot"));
// 启用 MDI 文件菜单
EnableMDITabbedGroups(TRUE, NULL);
EnableTearOffMDIChildren(TRUE);
SetDockingWindowIcons(theApp.m_bHiColorIcons);
// 创建视图
if (!CreateView())
{
TRACE0("未能创建视图\n");
return -1;
}
// 自动显示工具栏和状态栏
m_wndToolBar.ShowWindow(SW_SHOW);
m_wndStatusBar.ShowWindow(SW_SHOW);
// 更新菜单和工具栏状态
OnUpdateFrameMenu(NULL);
return 0;
}
```
这个函数会在主窗口创建时被调用。其中,首先调用了 `CMDIFrameWndEx::OnCreate` 函数来创建主窗口。然后加载菜单栏和工具栏资源,创建并显示状态栏,设置窗口标题,启用 MDI 文件菜单,创建视图,自动显示工具栏和状态栏,并更新菜单和工具栏状态。
接下来是 `CreateView` 函数的实现:
```cpp
BOOL CMainFrame::CreateView()
{
// 创建子窗口
if (!m_wndSplitter.CreateStatic(this, 1, 2))
{
TRACE0("未能创建分隔窗口\n");
return FALSE;
}
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMFCPlotView), CSize(0, 0), NULL) ||
!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMFCPlotView), CSize(0, 0), NULL))
{
TRACE0("未能创建视图窗口\n");
m_wndSplitter.DestroyWindow();
return FALSE;
}
// 设置子窗口的标题
CString strPaneName;
BOOL bNameValid;
// 如果视图已经有了标题,则使用该标题
CMFCPlotView* pActiveView = GetActiveView();
if (pActiveView != NULL)
{
bNameValid = strPaneName.LoadString(pActiveView->GetID());
if (bNameValid)
{
m_wndSplitter.SetPaneTitle(0, strPaneName);
}
}
// 如果视图没有标题,则使用默认标题
if (!bNameValid)
{
m_wndSplitter.SetPaneTitle(0, _T("视图窗口 1"));
}
// 返回创建视图的结果
return TRUE;
}
```
这个函数创建了一个分隔窗口,并在其中创建了两个视图窗口。同时,设置了子窗口的标题,并返回创建视图的结果。
最后是 `OnWindowManager` 函数的实现:
```cpp
void CMainFrame::OnWindowManager()
{
ShowWindowsDialog();
}
```
这个函数用来显示 MDI 窗口管理器的对话框。
以上就是这段代码的解释,希望能对你有所帮助!
阅读全文