目录

  • vc++概述
    • 特点
    • 概述
  • MFC 框架
    • 概述
    • MFC 框架
    • SDI 和 MDI
    • 文档、视图和框架
    • 窗口对象
    • 文档/视图体系结构
  • 第一个应用
  • 自动生成的主框架类源码

vc++概述

Microsoft Visual c++,通常简称为Visual c++或MSVC,是在Windows上作为Visual Studio一部分可用的c++、C和汇编语言开发工具和库的名称。这些工具和库允许您创建通用的Windows平台(UWP)应用程序、本机Windows桌面和服务器应用程序、跨平台库和运行在Windows、Linux、Android和iOS上的应用程序,以及使用. net框架的托管应用程序和库。您可以使用Visual c++编写任何东西,从简单的控制台应用程序最复杂的和复杂的Windows桌面应用,从设备驱动程序和操作系统组件为移动设备跨平台游戏,从最小的物联网设备和多服务器高性能计算在Azure云。

特点

增强了对c++ 17特性和正确性修正的支持,以及对c++ 20特性(如模块和协程)的实验支持。有关详细信息,请参见Visual Studio 2019中的c++一致性改进。
std:c++的最新选项现在包含了c++ 20的一些不一定完整的特性,包括对c++ 20操作符<=>(“太空船”)的初始支持,以便进行三方面的比较。
现在不推荐使用c++编译器开关/Gm。考虑在构建脚本中禁用/Gm开关(如果它是显式定义的)。但是,您也可以安全地忽略/Gm的弃用警告,因为在使用“将警告视为错误”(/WX)时,它不会被视为错误。
当MSVC开始在/std:c++最新标志下实现c++ 20标准草案中的特性时,/std:c++最新与/clr(所有风格)、/ZW和/Gm不兼容。在Visual Studio 2019中,使用/std:c++17或/std:c++14模式编译/clr、/ZW或/Gm(参见前面的项目符号)。
对于c++控制台和桌面应用程序,默认情况下不再生成预编译头文件

概述

Microsoft Visual C++(简称Visual C++、MSVC、VS或VC)是微软公司的免费C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++集成了便利的除错工具,特别是集成了微软Windows视窗操作系统应用程序接口(Windows API)、三维动画DirectX API,Microsoft .NET框架。
它以拥有“语法高亮”,IntelliSense(自动完成功能)以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及建置系统以预编译头文件、最小重建功能及累加连结著称。这些特征明显缩短程式编辑、编译及连结花费的时间,在大型软件计划上尤其显著。
我们可以使用vs2022社区版,这个对个人是免费使用的
https://visualstudio.microsoft.com/zh-hans/vs/community/
Microsoft 基础类库是用于在 Microsoft Windows 中编程的应用程序框架。 MFC 采用 C++ 编写,它提供了执行以下操作所需的很多代码:管理窗口、菜单和对话框;执行基本输入/输出;存储数据对象的集合等。 你只需将特定于应用程序的代码添加到此框架中。 鉴于 C++ 类编程的特性,很容易扩展和重写 MFC 框架提供的基本功能。

MFC 框架

概述

MFC 框架是一种让您基于 Windows 专家程序员的工作来进行开发的有力方法。 MFC 具有以下优点:缩短开发时间;提高代码的可移植性;提供强有力的支持而不会降低编程的自由性和灵活性;降低接触“难以编程”的用户界面元素和技术(如 Active 技术、OLE 和 Internet 编程)的难度。 此外,MFC 还通过数据访问对象 (DAO) 和开放式数据库连接 (ODBC)(已过时)简化了数据库编程,并通过 Windows 套接字简化了网络编程。 MFC 使用户可以轻松对属性表(“通过 Tab 切换对话框”)、打印预览和浮动的自定义工具栏等功能进行编程。
Microsoft 基础类 (MFC) 库组成了一个“应用程序框架”,用于为 Windows 操作系统构建应用程序。 一般而言,框架定义应用程序的框架,并提供可以放置在框架上的标准用户界面实现。 程序员的工作是填写其余的框架,即特定于应用程序的内容。 可以通过使用 MFC 应用程序向导为非常彻底的初学者应用程序创建文件来入门。 可以使用 Microsoft Visual C++ 资源编辑器直观地设计用户界面元素、类视图命令,从而将这些元素连接到代码,以及用于实现特定于应用程序的逻辑的类库。

MFC 框架

MFC 框架的版本 3.0 及更高版本支持 Win32 平台(包括 Microsoft Windows 95 及更高版本)的编程,以及Windows NT 版本 3.51 及更高版本。 MFC Win32 支持包括多线程。 如果需要进行 16 位编程,请使用版本 1.5x。

使用 Microsoft 基础类 (MFC) 库框架时很大程度上基于几个主要的类和 Visual C++ 工具。 一些类封装了 Win32 应用程序编程接口 (API) 的一大部分。 其他类封装了应用程序概念,如文档、视图和应用程序本身。 还有其他类封装了 OLE 功能以及 ODBC 和 DAO 数据访问功能。 (DAO 通过 Office 2013 受到支持。DAO 3.6 是最终版本,被认为已经过时。)

例如,Win32 的窗口概念由 MFC 类 CWnd 封装。 也就是说,名为 CWnd 的 C++ 类封装或“包装”了表示 Windows 窗口的 HWND 句柄。 同样,CDialog 类封装了 Win32 对话框。

以 C++ 类 CWnd 为例,封装意味着它包含了 HWND 类型的成员变量,并且它的成员函数封装了对采用 HWND 作为参数的 Win32 函数的调用。 类成员函数通常具有与其所封装的 Win32 函数相同的名称。

SDI 和 MDI

借助 MFC,可以轻松地使用单文档界面 (SDI) 和多文档界面 (MDI) 应用程序。

SDI 应用程序一次只允许打开一个文档框架窗口。 MDI 应用程序允许在应用程序的同一实例中打开多个文档框架窗口。 MDI 应用程序有一个窗口,在该窗口中可以打开多个 MDI 子窗口(其本身就是框架窗口),每个子窗口都包含一个单独的文档。 在某些应用程序中,子窗口的类型可以不同,例如图表窗口和电子表格窗口。 在这种情况下,菜单栏可随着不同类型的 MDI 子窗口激活而改变。

文档、视图和框架

MFC 框架的核心是文档和视图的概念。 文档是用户在编辑会话中与之进行交互的数据对象。 它由“文件”菜单上的“新建”或“打开”命令创建,并且通常保存在一个文件中。 (标准 MFC 文档派生自 CDocument 类,不同于活动文档和 OLE 复合文档)。视图是用户与文档进行交互所用的窗口对象。

一个正在运行的应用程序中的关键对象有:

线程对象

如果应用程序创建不同的执行线程(例如,在后台执行计算),则你将使用从 CWinThread 派生的类。 CWinApp 本身派生自 CWinThread 并表示应用程序中的主执行线程(或主进程)。 还可以在辅助线程中使用 MFC。

应用程序对象

你的应用程序类(派生自 CWinApp)控制上面的所有对象并指定应用程序行为,如初始化和清理。 应用程序仅有的一个应用程序对象为应用程序支持的任何文档类型创建和管理文档模板。

一个或多个文档模板

文档模板可协调文档、视图和框架窗口的创建。 派生自 CDocTemplate 类的特定文档模板类创建并管理一个类型的所有打开的文档。 支持多种文档类型的应用程序具有多个文档模板。 将 CSingleDocTemplate 类用于 SDI 应用程序,或将 CMultiDocTemplate 类用于 MDI 应用程序。

框架窗口

视图显示在“文档框架窗口”内。在 SDI 应用程序中,文档框架窗口也是应用程序的“主框架窗口”。 在 MDI 应用程序中,文档窗口是显示在主框架窗口中的子窗口。 派生的主框架窗口类指定包含您的视图的框架窗口的样式和其他特性。 如果需要自定义框架窗口,请从 CFrameWnd 派生以自定义 SDI 应用程序的文档框架窗口。 从 CMDIFrameWnd 派生以自定义 MDI 应用程序的主框架窗口。 另外,请从 CMDIChildWnd 派生一个类以自定义应用程序支持的每种不同的 MDI 文档框架窗口。

一个文档或多个文档。

文档类(派生自 CDocument)指定应用程序的数据。

如果你在应用程序中需要 OLE 功能,请从 COleDocument 或其派生类之一派生文档类,这取决于你需要的功能类型。

一个视图或多个视图。

视图类(派生自 CView)是用户的“数据窗口”。视图类控制用户如何查看文档数据并与之交互。 在某些情况下,您可能希望一个文档拥有多个数据视图。

如果需要滚动,请从 CScrollView 派生。 如果视图拥有一个在对话框模板资源中布局的用户界面,请从 CFormView 派生。 对于简单的文本数据,请使用 CEditView 或从中派生。 对于基于窗体的数据访问应用程序(如数据输入程序),请从 CRecordView 派生(对于 ODBC)。 此外,还有 CTreeView、CListView 和 CRichEditView 类。

MFC 框架的核心是文档和视图的概念。 文档是用户在编辑会话中与之进行交互的数据对象。 它由“文件”菜单上的“新建”或“打开”命令创建,并且通常保存在一个文件中。 (标准 MFC 文档派生自 CDocument 类,不同于活动文档和 OLE 复合文档)。视图是用户与文档进行交互所用的窗口对象。

在一个正在运行的应用程序中,这些对象以协作方式响应用户操作(由命令和其他消息绑定在一起)。
一个应用程序对象管理一个或多个文档模板。 每个文档模板创建并管理一个或多个文档(具体取决于应用程序是 SDI 还是 MDI)。

用户通过包含在框架窗口中的视图查看和操作文档。 下图演示了 SDI 应用程序的这些对象之间的关系。

运行 SDI 应用程序中的对象

窗口对象

MFC 提供 CWnd 类来封装窗口的 HWND 句柄。 CWnd 对象是一个 C++ 窗口对象,与表示一个 Windows 窗口但包含它的 HWND 不同。 使用 CWnd 可派生您自己的子窗口类,或使用派生自 CWnd 的很多 MFC 类之一。 CWnd 类是所有窗口的基类,包括框架窗口、对话框、子窗口、控件和控件条(如工具栏)。 充分了解 C++ 窗口对象和 HWND 之间的关系对于使用 MFC 进行有效的编程非常重要。

MFC 提供窗口的某些默认功能和管理,但是,可以从 CWnd 派生您自己的类并使用其成员函数自定义所提供的功能。 通过构造 CWnd 对象并调用其 Create 成员函数创建子窗口,然后使用 CWnd 成员函数自定义子窗口。 可以在框架窗口中嵌入派生自 CView 的对象,如窗体视图或树视图。 可以通过由 CSplitterWnd 类提供的拆分器窗格来支持文档的多个视图。

派生自 CWnd 类的每个对象都包含一个消息映射,您可以通过它将 Windows 消息或命令 ID 映射到您自己的处理程序。

有关 Windows 编程的常规资料是了解如何使用可封装 CWnd API 的 HWND 成员函数的合适资源。
用于 CWnd 的函数

CWnd 及其派生的窗口类提供了构造函数、析构函数和成员函数来初始化对象,创建基础的 Windows 结构并访问封装的 HWND。 CWnd 还提供了可封装 Windows API 的成员函数,以用于发送消息、访问窗口的状态、转换坐标、更新、滚动、访问剪贴板以及许多其他任务。 大多数采用 HWND 参数的 Windows 窗口管理 API 都封装为 CWnd 的成员函数。 函数的名称及其参数保留在 CWnd 成员函数中。 有关 CWnd 封装的 Windows API 的详细信息,请参见 CWnd 类。
CWnd 和 Windows 消息

CWnd 的一个主要用途是提供用于处理 Windows 消息的接口,如 WM_PAINT 或 WM_MOUSEMOVE。 CWnd 的许多成员函数是标准消息的处理程序:这些成员函数以标识符 afx_msg 和前缀“On”开头,例如 OnPaint 和 OnMouseMove。 消息处理和映射详细介绍了消息和消息处理。 这些信息同样适用于框架的窗口以及您出于特殊目的自己创建的窗口。

文档/视图体系结构

默认情况下,MFC 应用程序向导会使用文档类和视图类创建应用程序主干。 MFC 将数据管理分隔到这两个类中。 文档存储数据并管理打印数据以及协调更新数据的多个视图。 视图显示数据并管理用户与数据的交互,包括选择和编辑。

在此模型中,MFC 文档对象读取数据并将数据写入持久存储。 文档还可以提供与数据的接口,无论数据驻留在何处(如数据库中)。 单独的视图对象管理数据显示(从在窗口中呈现数据到用户选择和编辑数据)。 视图从文档获取显示数据,并将任何数据更改传达回给文档。

虽然可以轻松替代或忽略文档/视图分隔,但在大多数情况下,有令人信服的理由遵循此模型。 最佳原因之一是需要相同文档的多个视图(例如电子表格和图表视图)时。 文档/视图模型允许单独的视图对象表示数据的每个视图,而对所有视图通用的代码(如计算引擎)可以驻留在文档中。 每当数据发生更改时,文档也会执行更新所有视图的任务。

借助 MFC 文档/视图体系结构,可以轻松地支持多个视图、多种文档类型、拆分窗口和其他重要的用户界面功能。

对于用户和程序员而言,最常看到的 MFC 框架部分是文档和视图。 使用该框架开发应用程序的大多数工作涉及编写文档和视图类。 此文章系列会介绍:

文档和视图的用途以及它们在框架中的交互方式。必须执行哪些操作才能实现它们。

文档/视图的核心是四个关键类:

CDocument(或 COleDocument)类支持用于存储或控制程序数据的对象,并为程序员定义的文档类提供基本功能。 文档表示用户通常使用“文件”菜单上的“打开”命令打开并使用“文件”菜单上的“保存”命令保存的数据单元。

CView(或其许多派生类之一)可为程序员定义的视图类提供基本功能。 视图附加到文档并充当文档与用户之间的中介:视图在屏幕呈现文档的图像,并将用户输入解释为对文档的操作。 视图还呈现图像以用于打印和打印预览。

CFrameWnd(或其变体之一)支持围绕文档的一个或多个视图提供框架的对象。

CDocTemplate(或是 CSingleDocTemplate 或 CMultiDocTemplate)支持的对象可协调给定类型的一个或多个现有文档,并管理为该类型创建正确文档、视图和框架窗口对象。

类库中的文档/视图实现将数据本身与其显示和用户对数据的操作分隔开来。 对数据的所有更改都通过文档类进行管理。 视图调用此接口来访问和更新数据。
文档、其关联视图和围绕视图的框架窗口由文档模板创建。 文档模板负责创建和管理一种文档类型的所有文档。

第一个应用

运行

自动生成的主框架类源码


// MainFrm.cpp: CMainFrame 类的实现
//#include "pch.h"
#include "framework.h"
#include "learnvc1.h"#include "MainFrm.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// CMainFrameIMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWndEx)const int  iMaxUserToolbars = 10;
const UINT uiFirstUserToolBarId = AFX_IDW_CONTROLBAR_FIRST + 40;
const UINT uiLastUserToolBarId = uiFirstUserToolBarId + iMaxUserToolbars - 1;BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)ON_WM_CREATE()ON_COMMAND(ID_WINDOW_MANAGER, &CMainFrame::OnWindowManager)ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize)ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew)ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook)ON_WM_SETTINGCHANGE()
END_MESSAGE_MAP()static UINT indicators[] =
{ID_SEPARATOR,           // 状态行指示器ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,
};// CMainFrame 构造/析构CMainFrame::CMainFrame() noexcept
{// TODO: 在此添加成员初始化代码theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_VS_2008);
}CMainFrame::~CMainFrame()
{
}int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)return -1;BOOL bNameValid;CMDITabInfo mdiTabParams;mdiTabParams.m_style = CMFCTabCtrl::STYLE_3D_ONENOTE; // 其他可用样式...mdiTabParams.m_bActiveTabCloseButton = TRUE;      // 设置为 FALSE 会将关闭按钮放置在选项卡区域的右侧mdiTabParams.m_bTabIcons = FALSE;    // 设置为 TRUE 将在 MDI 选项卡上启用文档图标mdiTabParams.m_bAutoColor = TRUE;    // 设置为 FALSE 将禁用 MDI 选项卡的自动着色mdiTabParams.m_bDocumentMenu = TRUE; // 在选项卡区域的右边缘启用文档菜单EnableMDITabbedGroups(TRUE, mdiTabParams);if (!m_wndMenuBar.Create(this)){TRACE0("未能创建菜单栏\n");return -1;      // 未能创建}m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);// 防止菜单栏在激活时获得焦点CMFCPopupMenu::SetForceMenuFocus(FALSE);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(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME)){TRACE0("未能创建工具栏\n");return -1;      // 未能创建}CString strToolBarName;bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD);ASSERT(bNameValid);m_wndToolBar.SetWindowText(strToolBarName);CString strCustomize;bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);ASSERT(bNameValid);m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);// 允许用户定义的工具栏操作:InitUserToolbars(nullptr, uiFirstUserToolBarId, uiLastUserToolBarId);if (!m_wndStatusBar.Create(this)){TRACE0("未能创建状态栏\n");return -1;      // 未能创建}m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));// TODO: 如果您不希望工具栏和菜单栏可停靠,请删除这五行m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockPane(&m_wndMenuBar);DockPane(&m_wndToolBar);// 启用 Visual Studio 2005 样式停靠窗口行为CDockingManager::SetDockingMode(DT_SMART);// 启用 Visual Studio 2005 样式停靠窗口自动隐藏行为EnableAutoHidePanes(CBRS_ALIGN_ANY);// 加载菜单项图像(不在任何标准工具栏上):CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES, theApp.m_bHiColorIcons ? IDB_MENU_IMAGES_24 : 0);// 创建停靠窗口if (!CreateDockingWindows()){TRACE0("未能创建停靠窗口\n");return -1;}m_wndFileView.EnableDocking(CBRS_ALIGN_ANY);m_wndClassView.EnableDocking(CBRS_ALIGN_ANY);DockPane(&m_wndFileView);CDockablePane* pTabbedBar = nullptr;m_wndClassView.AttachToTabWnd(&m_wndFileView, DM_SHOW, TRUE, &pTabbedBar);m_wndOutput.EnableDocking(CBRS_ALIGN_ANY);DockPane(&m_wndOutput);m_wndProperties.EnableDocking(CBRS_ALIGN_ANY);DockPane(&m_wndProperties);// 基于持久值设置视觉管理器和样式OnApplicationLook(theApp.m_nAppLook);// 启用增强的窗口管理对话框EnableWindowsDialog(ID_WINDOW_MANAGER, ID_WINDOW_MANAGER, TRUE);// 启用工具栏和停靠窗口菜单替换EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR);// 启用快速(按住 Alt 拖动)工具栏自定义CMFCToolBar::EnableQuickCustomization();if (CMFCToolBar::GetUserImages() == nullptr){// 加载用户定义的工具栏图像if (m_UserImages.Load(_T(".\\UserImages.bmp"))){CMFCToolBar::SetUserImages(&m_UserImages);}}// 启用菜单个性化(最近使用的命令)// TODO: 定义您自己的基本命令,确保每个下拉菜单至少有一个基本命令。CList<UINT, UINT> lstBasicCommands;lstBasicCommands.AddTail(ID_FILE_NEW);lstBasicCommands.AddTail(ID_FILE_OPEN);lstBasicCommands.AddTail(ID_FILE_SAVE);lstBasicCommands.AddTail(ID_APP_EXIT);lstBasicCommands.AddTail(ID_EDIT_CUT);lstBasicCommands.AddTail(ID_EDIT_PASTE);lstBasicCommands.AddTail(ID_EDIT_UNDO);lstBasicCommands.AddTail(ID_APP_ABOUT);lstBasicCommands.AddTail(ID_VIEW_STATUS_BAR);lstBasicCommands.AddTail(ID_VIEW_TOOLBAR);lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2003);lstBasicCommands.AddTail(ID_VIEW_APPLOOK_VS_2005);lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLUE);lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_SILVER);lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLACK);lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_AQUA);lstBasicCommands.AddTail(ID_VIEW_APPLOOK_WINDOWS_7);lstBasicCommands.AddTail(ID_SORTING_SORTALPHABETIC);lstBasicCommands.AddTail(ID_SORTING_SORTBYTYPE);lstBasicCommands.AddTail(ID_SORTING_SORTBYACCESS);lstBasicCommands.AddTail(ID_SORTING_GROUPBYTYPE);CMFCToolBar::SetBasicCommands(lstBasicCommands);// 将文档名和应用程序名称在窗口标题栏上的顺序进行交换。这// 将改进任务栏的可用性,因为显示的文档名带有缩略图。ModifyStyle(0, FWS_PREFIXTITLE);return 0;
}BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{if( !CMDIFrameWndEx::PreCreateWindow(cs) )return FALSE;// TODO: 在此处通过修改//  CREATESTRUCT cs 来修改窗口类或样式return TRUE;
}BOOL CMainFrame::CreateDockingWindows()
{BOOL bNameValid;// 创建类视图CString strClassView;bNameValid = strClassView.LoadString(IDS_CLASS_VIEW);ASSERT(bNameValid);if (!m_wndClassView.Create(strClassView, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_CLASSVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI)){TRACE0("未能创建“类视图”窗口\n");return FALSE; // 未能创建}// 创建文件视图CString strFileView;bNameValid = strFileView.LoadString(IDS_FILE_VIEW);ASSERT(bNameValid);if (!m_wndFileView.Create(strFileView, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_FILEVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT| CBRS_FLOAT_MULTI)){TRACE0("未能创建“文件视图”窗口\n");return FALSE; // 未能创建}// 创建输出窗口CString strOutputWnd;bNameValid = strOutputWnd.LoadString(IDS_OUTPUT_WND);ASSERT(bNameValid);if (!m_wndOutput.Create(strOutputWnd, this, CRect(0, 0, 100, 100), TRUE, ID_VIEW_OUTPUTWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_BOTTOM | CBRS_FLOAT_MULTI)){TRACE0("未能创建输出窗口\n");return FALSE; // 未能创建}// 创建属性窗口CString strPropertiesWnd;bNameValid = strPropertiesWnd.LoadString(IDS_PROPERTIES_WND);ASSERT(bNameValid);if (!m_wndProperties.Create(strPropertiesWnd, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_PROPERTIESWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI)){TRACE0("未能创建“属性”窗口\n");return FALSE; // 未能创建}SetDockingWindowIcons(theApp.m_bHiColorIcons);return TRUE;
}void CMainFrame::SetDockingWindowIcons(BOOL bHiColorIcons)
{HICON hFileViewIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_FILE_VIEW_HC : IDI_FILE_VIEW), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);m_wndFileView.SetIcon(hFileViewIcon, FALSE);HICON hClassViewIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_CLASS_VIEW_HC : IDI_CLASS_VIEW), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);m_wndClassView.SetIcon(hClassViewIcon, FALSE);HICON hOutputBarIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_OUTPUT_WND_HC : IDI_OUTPUT_WND), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);m_wndOutput.SetIcon(hOutputBarIcon, FALSE);HICON hPropertiesBarIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_PROPERTIES_WND_HC : IDI_PROPERTIES_WND), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);m_wndProperties.SetIcon(hPropertiesBarIcon, FALSE);UpdateMDITabbedBarsIcons();
}// CMainFrame 诊断#ifdef _DEBUG
void CMainFrame::AssertValid() const
{CMDIFrameWndEx::AssertValid();
}void CMainFrame::Dump(CDumpContext& dc) const
{CMDIFrameWndEx::Dump(dc);
}
#endif //_DEBUG// CMainFrame 消息处理程序void CMainFrame::OnWindowManager()
{ShowWindowsDialog();
}void CMainFrame::OnViewCustomize()
{CMFCToolBarsCustomizeDialog* pDlgCust = new CMFCToolBarsCustomizeDialog(this, TRUE /* 扫描菜单*/);pDlgCust->EnableUserDefinedToolbars();pDlgCust->Create();
}LRESULT CMainFrame::OnToolbarCreateNew(WPARAM wp,LPARAM lp)
{LRESULT lres = CMDIFrameWndEx::OnToolbarCreateNew(wp,lp);if (lres == 0){return 0;}CMFCToolBar* pUserToolbar = (CMFCToolBar*)lres;ASSERT_VALID(pUserToolbar);BOOL bNameValid;CString strCustomize;bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);ASSERT(bNameValid);pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);return lres;
}void CMainFrame::OnApplicationLook(UINT id)
{CWaitCursor wait;theApp.m_nAppLook = id;switch (theApp.m_nAppLook){case ID_VIEW_APPLOOK_WIN_2000:CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager));break;case ID_VIEW_APPLOOK_OFF_XP:CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP));break;case ID_VIEW_APPLOOK_WIN_XP:CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE;CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));break;case ID_VIEW_APPLOOK_OFF_2003:CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003));CDockingManager::SetDockingMode(DT_SMART);break;case ID_VIEW_APPLOOK_VS_2005:CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005));CDockingManager::SetDockingMode(DT_SMART);break;case ID_VIEW_APPLOOK_VS_2008:CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008));CDockingManager::SetDockingMode(DT_SMART);break;case ID_VIEW_APPLOOK_WINDOWS_7:CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7));CDockingManager::SetDockingMode(DT_SMART);break;default:switch (theApp.m_nAppLook){case ID_VIEW_APPLOOK_OFF_2007_BLUE:CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);break;case ID_VIEW_APPLOOK_OFF_2007_BLACK:CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);break;case ID_VIEW_APPLOOK_OFF_2007_SILVER:CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);break;case ID_VIEW_APPLOOK_OFF_2007_AQUA:CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);break;}CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));CDockingManager::SetDockingMode(DT_SMART);}m_wndOutput.UpdateFonts();RedrawWindow(nullptr, nullptr, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);theApp.WriteInt(_T("ApplicationLook"), theApp.m_nAppLook);
}void CMainFrame::OnUpdateApplicationLook(CCmdUI* pCmdUI)
{pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID);
}BOOL CMainFrame::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext)
{// 基类将执行真正的工作if (!CMDIFrameWndEx::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext)){return FALSE;}// 为所有用户工具栏启用自定义按钮BOOL bNameValid;CString strCustomize;bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);ASSERT(bNameValid);for (int i = 0; i < iMaxUserToolbars; i ++){CMFCToolBar* pUserToolbar = GetUserToolBarByIndex(i);if (pUserToolbar != nullptr){pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);}}return TRUE;
}void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
{CMDIFrameWndEx::OnSettingChange(uFlags, lpszSection);m_wndOutput.UpdateFonts();
}

未完下一节继续

windows应用(vc++2022)MFC基础到实战(1)-基础(1)相关推荐

  1. VC++之MFC从零开始实现windows系统任务管理器(一、windows任务管理器界面的制作)

    VC++之MFC从零开始实现windows系统任务管理器(一.windows任务管理器界面的制作) 通过本例程从零开始使用VC++与MFC实现一个基于windows的任务管理器. 最终效果图 软件工具 ...

  2. 深入浅出话VC++(2)——MFC的本质

    一.引言 上一专题中,纯手动地完成了一个Windows应用程序,然而,在实际开发中,我们大多数都是使用已有的类库来开发Windows应用程序.MFC(Microsoft Foundation Clas ...

  3. vc和MFC的详细历史

    VisualC++ 1.0:C++编译器的终结者 唯技术"思想有时能使陷入一种困境,作为一种编程工具(也可以认为是一种技术),Visual C++经历了许多风波和变革,但纵观目前几乎所以有书 ...

  4. 最好的开源项目的一些的在VC + +和MFC的

    简介 This article lists of some of the best Open Source projects written in VC++/MFC. 本文列出了最好的开放源码在VC ...

  5. [转]Windows与VC命名规则

    转自:http://hi.baidu.com/11158512/blog/item/0fbd5535cbfb5d1c91ef3970.html 匈牙利命名法是一种编程时的命名规范.基本原则是:变量名= ...

  6. VC++、MFC最好的开源项目

    介绍:介绍一下用VC++/MFC写的最好的开源项目. Sourceforge.net中有许多高质量的VC++开源项目,我列举了一些可以作为VC++程序员的参考. 正文: VC++.MFC中最好的开源项 ...

  7. 【错误记录】Windows 控制台程序编译报错 ( WINDOWS.H already included. MFC apps must not #include <Windows.h> )

    文章目录 一.报错信息 二.解决方案 一.报错信息 Windows 控制台程序编译报错 : 已启动生成- 1>------ 已启动生成: 项目: hacktool, 配置: Debug Win3 ...

  8. spring environment_SpringBoot实战8-Spring基础-应用环境

    接上篇<SpringBoot实战7-Spring基础-Bean的生命周期>的学习,本文学习Spring的一个重要的概念Environment-应用环境. 2.7 应用环境 - Enviro ...

  9. 开源的数据库,PostgreSQL 基础入门实战

    PostgreSQL 简介与安装 实验介绍 大家好,本课程是关于 PostgreSQL 数据库的使用说明,细致讲解 PostgreSQL 的特性与使用方法,尽量做到描述朴实.深入浅出.示例充足.覆盖重 ...

最新文章

  1. 电子书下载:Building Websites with DotNetNuke 5
  2. 怎么去控制浏览器对资源文件的处理行为
  3. 我来告诉你考研还是找工作!
  4. 微软 python_微软推出 Pylance,改善 VS Code 中的 Python 体验
  5. 蓝桥杯练习系统习题-算法训练3
  6. windows下的文本文件在linux下查看,中文显示乱码
  7. 五阶行列式的对角线之和,函数实现
  8. php设置排序,7种php基本排序实现方法
  9. 2021 Chrome Devtools 新特性
  10. Spring注解解析
  11. .net开发常用工具备忘录
  12. c语言中变量可以用x1表示没,你必须知道的495个C语言问题 读书笔记
  13. java对象--多态的好处
  14. IDEA 查看源码快捷键
  15. Netty ChannelBuffer
  16. 基于pytorch+Resnet101加GPT搭建AI玩王者荣耀
  17. 计算机便签中字的大小,Windows便签字体怎么调整?电脑便签怎么改字体大小
  18. 用了python之后笔记本卡了_干货!如何用Python在笔记本电脑上分析100GB数据(上)...
  19. BUUCTF Misc 隐藏的钥匙
  20. 安全狗“老用户推荐新用户”有奖活动进行中 最高IPhone 4S手机

热门文章

  1. LINK : fatal error LNK1104: 无法打开文件“mfc71.lib”的原因又一例
  2. 前端图片上传并且裁切
  3. 汽车驾驶学习-驾驶技巧:图解如何安全停车的技巧
  4. 二位、三位国家码附SQL语句
  5. 学会吊打面试官之set
  6. CentOS7.3下Zabbix3.5之微信报警配置
  7. 这些手机隐藏功能你知道吗?
  8. win10下docker部署nginx+node+mongodb+redis学习
  9. 万字详解大数据平台异地多机房架构实践
  10. html2day(合并单元格,有序、无序列表,input、select、textarea表单)