逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法

简介: 逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法

Microsoft Foundation Class (MFC) 是用于创建基于 Windows 的应用程序的 C++ 库。它提供了丰富的类库来简化 Windows 编程,使得开发者可以更方便地创建图形用户界面 (GUI)。本文将介绍如何在 MFC 中进行视图分割以及如何在窗口程序中添加图标,并通过多个代码案例展示具体实现。

1. 视图分割

视图分割是一种将窗口区域划分为多个子区域的方法,每个子区域可以显示不同的内容。MFC 提供了 CSplitterWnd 类来实现视图的分割。

1.1 基本视图分割

首先,我们将介绍如何在 MFC 中实现基本的视图分割。

案例1:水平和垂直分割视图

  1. 创建一个 MFC 应用程序。
  2. MainFrm.h 文件中,添加分割窗口成员变量:
class CMainFrame : public CFrameWnd {
protected:
    CSplitterWnd m_wndSplitter;
public:
    virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
    ...
};
  1. MainFrm.cpp 文件中,实现 OnCreateClient 方法:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {
    // 创建一个静态分割窗口,垂直分为两部分
    if (!m_wndSplitter.CreateStatic(this, 1, 2)) {
        AfxMessageBox(_T("Failed to create splitter window"));
        return FALSE;
    }
    // 在分割窗口的两个部分中创建视图
    if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMyView), CSize(200, 200), pContext) ||
        !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMyView), CSize(200, 200), pContext)) {
        AfxMessageBox(_T("Failed to create views"));
        return FALSE;
    }
    return TRUE;
}

在这个例子中,我们创建了一个静态的分割窗口,并将其垂直分为两部分,每个部分都包含一个视图。

1.2 动态视图分割

动态视图分割允许用户在运行时调整分割窗口的大小。

案例2:动态调整视图分割

MainFrm.cpp 中,修改 OnCreateClient 方法:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {
    // 创建一个动态分割窗口,水平分为两部分
    if (!m_wndSplitter.CreateStatic(this, 2, 1)) {
        AfxMessageBox(_T("Failed to create splitter window"));
        return FALSE;
    }
    // 在分割窗口的两个部分中创建视图
    if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMyView), CSize(200, 200), pContext) ||
        !m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CMyView), CSize(200, 200), pContext)) {
        AfxMessageBox(_T("Failed to create views"));
        return FALSE;
    }
    return TRUE;
}

在这个例子中,我们创建了一个动态的分割窗口,并将其水平分为两部分,每个部分都包含一个视图。

2. 在窗口程序中添加图标

在 Windows 窗口程序中添加图标可以增强用户界面的视觉效果。MFC 提供了简单的方法来设置窗口的图标。

2.1 添加资源文件

首先,确保在资源文件中添加了所需的图标文件(例如,IDI_MYICON)。

2.2 在窗口程序中设置图标

CMainFrame 类中设置图标。

案例3:在主窗口中添加图标

  1. MainFrm.h 文件中,添加成员变量:
class CMainFrame : public CFrameWnd {
protected:
    HICON m_hIcon;
public:
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    ...
};
  1. MainFrm.cpp 文件中,加载并设置图标:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
    if (!CFrameWnd::PreCreateWindow(cs))
        return FALSE;
    // 加载图标
    m_hIcon = AfxGetApp()->LoadIcon(IDI_MYICON);
    cs.hIcon = m_hIcon;
    return TRUE;
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    // 设置小图标和大图标
    SetIcon(m_hIcon, TRUE);  // 大图标
    SetIcon(m_hIcon, FALSE); // 小图标
    return 0;
}

在这个例子中,我们在 PreCreateWindow 方法中加载了图标,并在 OnCreate 方法中设置了窗口的小图标和大图标。

2.3 在对话框中添加图标

如果需要在对话框中添加图标,可以在对话框类中进行设置。

案例4:在对话框中添加图标

  1. 在对话框类的头文件中,添加成员变量:
class CMyDialog : public CDialogEx {
protected:
    HICON m_hIcon;
public:
    virtual BOOL OnInitDialog();
    ...
};
  1. 在对话框类的实现文件中,加载并设置图标:
BOOL CMyDialog::OnInitDialog() {
    CDialogEx::OnInitDialog();
    // 加载图标
    m_hIcon = AfxGetApp()->LoadIcon(IDI_MYICON);
    // 设置小图标和大图标
    SetIcon(m_hIcon, TRUE);  // 大图标
    SetIcon(m_hIcon, FALSE); // 小图标
    return TRUE;
}

在这个例子中,我们在 OnInitDialog 方法中加载了图标,并设置了对话框的小图标和大图标。

3. 注意事项

  • 确保图标文件添加到资源中:在设置图标之前,确保所需的图标文件已经正确添加到资源文件中。
  • 使用正确的资源ID:在加载图标时,使用正确的资源ID(例如 IDI_MYICON)以确保图标能够正确加载。
  • 处理错误情况:在加载和设置图标时,处理可能的错误情况,例如加载图标失败等。

结语

本文详细介绍了如何在 MFC 中进行视图分割以及如何在窗口程序中添加图标。通过这些案例,可以帮助你更好地理解和应用 MFC 提供的功能,提高代码的可读性和复用性。在实际开发中,合理运用这些技术,可以显著提升应用程序的用户体验和开发效率。希望这些示例和注意事项能帮助你更好地掌握 MFC 的使用技巧。

目录
相关文章
|
2月前
|
Windows
Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序
Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序
116 2
|
3月前
|
Windows
Windows下版本控制器(SVN)-启动服务器端程序
Windows下版本控制器(SVN)-启动服务器端程序
116 4
|
4月前
|
安全 Devops 测试技术
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
89 0
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
|
6月前
|
Windows
Windows程序的数字签名证书怎么申请
Windows程序的数字签名证书申请流程包括:准备企业资料(营业执照、税务登记证等),提交申请表及企业资料。经过初审、实名认证和二审后,等待1-5个工作日审核结果。审核通过后,CA机构颁发证书并通过邮件或邮寄方式发送。收到证书后按指南安装并使用签名工具对程序进行数字签名,确保软件完整性和可信度。注意证书有效期、管理和兼容性问题。
|
7月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
3月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
88 0
|
3月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
166 0
|
5月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
171 12
|
6月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
127 16
|
7月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)