ShuangChenYue ShuangChenYue
首页
  • Cpp之旅
  • Cpp专栏
  • Effective_CPP
  • muduo网络库
  • Unix环境高级编程
  • Cpp提高编程
  • 计算机网络
  • 操作系统
  • 数据结构
  • Linux
  • 算法
  • 基础篇
  • MySql
  • Redis
  • 电子嵌入式通信协议
  • 深入浅出SSD
  • 文件系统
  • 汇编语言
  • STM32
  • 随笔(持续更新)
  • Git知识总结
  • Git 创建删除远程分支
  • nvm使用小结
  • 虚拟机固定 IP 地址
  • Shell 脚本学习笔记
  • VScode 插件 CodeGeeX 使用教程
  • KylinV10 将项目上传至 Github教程
  • KylinV10 安装 MySQL 教程(可防踩雷)
  • kylinV10-SP1 安装 QT
  • 高并发内存池
  • USBGUARD 项目编译环境配置
  • Power_Destory 项目
  • U 盘清除工具编译教程
  • 个人博客代码推送教程
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • MFC编程随记
  • MFC实现ini配置文件的读取
  • MFC实现点击列表头排序
  • 贴图法美化Button按钮
  • 如何高效阅读嵌入式项目代码
  • NAND Flash
  • ARM 处理器
  • 嵌入式基础知识-存储器
  • 闪存存储和制造技术概述
  • 芯片IO驱动力
  • 主流先进封装技术介绍
  • 虎牙C++技术面经
  • 金山一面复习
  • 完美世界秋招 C++ 游戏开发面经(Cpp部分)
  • 博客搭建
  • 网站收藏箱
首页
  • Cpp之旅
  • Cpp专栏
  • Effective_CPP
  • muduo网络库
  • Unix环境高级编程
  • Cpp提高编程
  • 计算机网络
  • 操作系统
  • 数据结构
  • Linux
  • 算法
  • 基础篇
  • MySql
  • Redis
  • 电子嵌入式通信协议
  • 深入浅出SSD
  • 文件系统
  • 汇编语言
  • STM32
  • 随笔(持续更新)
  • Git知识总结
  • Git 创建删除远程分支
  • nvm使用小结
  • 虚拟机固定 IP 地址
  • Shell 脚本学习笔记
  • VScode 插件 CodeGeeX 使用教程
  • KylinV10 将项目上传至 Github教程
  • KylinV10 安装 MySQL 教程(可防踩雷)
  • kylinV10-SP1 安装 QT
  • 高并发内存池
  • USBGUARD 项目编译环境配置
  • Power_Destory 项目
  • U 盘清除工具编译教程
  • 个人博客代码推送教程
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • MFC编程随记
  • MFC实现ini配置文件的读取
  • MFC实现点击列表头排序
  • 贴图法美化Button按钮
  • 如何高效阅读嵌入式项目代码
  • NAND Flash
  • ARM 处理器
  • 嵌入式基础知识-存储器
  • 闪存存储和制造技术概述
  • 芯片IO驱动力
  • 主流先进封装技术介绍
  • 虎牙C++技术面经
  • 金山一面复习
  • 完美世界秋招 C++ 游戏开发面经(Cpp部分)
  • 博客搭建
  • 网站收藏箱
  • MFC编程随记
    • 1.数据交换机制
    • 2. 将控件值更新到相应的成员变量
    • 3. 将 int 类型的数据转换为 CString 类型
    • 4. 列表控件的可选属性,字体加粗,背景色,水平垂直滚动条
    • 5. 拦截键盘的事件(Enter 键和 Esc 键)
    • 6. 设置或获取编辑框的内容
    • 7. 从页面获取主页面的窗口指针
    • 8. 设置复选框的状态
  • MFC实现点击列表头排序
  • MFC实现ini配置文件的读取
  • 贴图法美化Button按钮
  • MFC编程
霜晨月
2024-06-03
目录

MFC编程随记

# MFC 笔记

# 1.数据交换机制

void CH5Configuration::DoDataExchange(CDataExchange* pDX)
{
    // 调用基类的数据交换函数
    CDialog::DoDataExchange(pDX);
    // 将单选按钮 IDC_H5_WR_TEST_MODE_RADIO 的状态与成员变量 m_uWR_TestMode_H5 关联
    DDX_Check(pDX, IDC_H5_WR_TEST_MODE_RADIO, m_uWR_TestMode_H5);
    DDX_Check(pDX, IDC_H5_R_TEST_MODE_RADIO, m_uR_TestMode_H5);
    DDX_Check(pDX, IDC_H5_MODE3_RADIO, m_uNotH5DataTestMode_H5);

    // 将编辑框 IDC_H5_SET_TEST_CAP_EDIT 的文本值与成员变量 m_uSetTestCap_H5 关联
    DDX_Text(pDX, IDC_H5_SET_TEST_CAP_EDIT, m_uSetTestCap_H5);
    DDX_Text(pDX, IDC_H5_SET_TEST_CYCLE_EDIT, m_uSetTestCycle_H5);
    DDX_Text(pDX, IDC_H5_SET_SAVE_CAP_EDIT, m_uSetSaveCap_H5);

    // 将复选框 IDC_H5_ERR_EXIT_CHECK 的状态与成员变量 m_uErrExitFlg_H5 关联
    DDX_Check(pDX, IDC_H5_ERR_EXIT_CHECK, m_uErrExitFlg_H5);
    DDX_Check(pDX, IDC_H5_SAVE_CFG_CHECK, m_uSaveCfgFlg_H5);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

这段代码是 MFC(Microsoft Foundation Class)中的数据交换(DataExchange)函数,用于在对话框控件和成员变量之间进行数据的交换。

==在 MFC 中,数据交换机制允许将控件的值自动与成员变量进行关联,并且在需要时自动更新。==

具体来说:

  • CDialog::DoDataExchange(pDX); 调用了基类 CDialog 的 DoDataExchange 函数,以便将数据交换的过程委托给基类进行处理。

  • DDX_Check(pDX, IDC_H5_WR_TEST_MODE_RADIO, m_uWR_TestMode_H5); 用于将控件 IDC_H5_WR_TEST_MODE_RADIO(一个单选按钮)的状态与成员变量 m_uWR_TestMode_H5 进行关联。这个函数用于处理单选按钮的选中状态。

  • DDX_Text(pDX, IDC_H5_SET_TEST_CAP_EDIT, m_uSetTestCap_H5); 用于将控件 IDC_H5_SET_TEST_CAP_EDIT(一个编辑框)的文本值与成员变量 m_uSetTestCap_H5 进行关联。这个函数用于处理编辑框中的文本值。

  • DDX_Check(pDX, IDC_H5_ERR_EXIT_CHECK, m_uErrExitFlg_H5); 用于将控件 IDC_H5_ERR_EXIT_CHECK(一个复选框)的状态与成员变量 m_uErrExitFlg_H5 进行关联。这个函数用于处理复选框的选中状态。

通过这种方式,当用户在对话框中操作控件时,数据交换机制会自动更新相关的成员变量,反之亦然。这样可以简化代码,并且确保对话框中的控件和成员变量之间的数据始终保持同步。

# 2. 将控件值更新到相应的成员变量

结合第一点所提到的数据交换机制,通过 UpdateData(TRUE); 语句将所有的控件值更新到相应的成员变量中

void CH5Configuration::SaveSetting(void) {
    UpdateData(TRUE);
    WritePrivateProfileInt(_T("Setting"),_T("--------H5Test_CfgParam---------"),0,m_SettingFilePath);
    /*****************TestMode*******************/
  WritePrivateProfileInt(_T("Setting"),_T("m_uWR_TestMode_H5"),m_uWR_TestMode_H5,m_SettingFilePath);
  WritePrivateProfileInt(_T("Setting"),_T("m_uR_TestMode_H5"),m_uR_TestMode_H5,m_SettingFilePath);
   ......
}
1
2
3
4
5
6
7
8
  • UpdateData(TRUE); 这句代码的作用是将对话框中的控件的当前值更新到对应的成员变量中。

  • 具体来说,UpdateData(TRUE); 函数会从对话框中的控件(如编辑框、复选框等)读取当前的值,并将这些值更新到对应的成员变量中。TRUE 参数表示是从控件更新到变量。

  • 在 MFC 中,当你需要从对话框中获取用户输入的数据时,可以使用 UpdateData(TRUE); 函数来实现。例如,在用户点击“保存”按钮时,你可以先调用 UpdateData(TRUE); 来确保所有的控件值已经被更新到相应的成员变量中,然后再进行数据的保存或处理操作。

  • 在这段代码中,UpdateData(TRUE); 被调用是为了确保所有的成员变量中都包含了最新的控件值,然后才进行了后续的数据保存操作。

  • UpdateData(FALSE); 与 UpdateData(TRUE); 相反,它的作用是将成员变量的值更新到对应的对话框控件上。

  • 具体来说,UpdateData(FALSE); 函数会将成员变量的值写入到对话框中的控件(如编辑框、复选框等),从而更新对话框中的显示。

  • 在 MFC 中,当你需要将程序中的数据显示到对话框上时,可以使用 UpdateData(FALSE); 函数来实现。例如,在初始化对话框时,你可以将默认的数据显示在对话框上,就可以先将成员变量的值更新到对话框控件中。

  • 综上所述,UpdateData(TRUE); 和 UpdateData(FALSE); 分别用于从对话框控件更新到成员变量,以及从成员变量更新到对话框控件。在需要双向同步数据时,可以使用这两个函数来实现数据的更新和显示。

# 3. 将 int 类型的数据转换为 CString 类型

// 例如:
CString Data; 		// 我有一个Data 需要将 lgLen 赋值给他
int lgLen = 100;
// 转换成 CString 类型并赋值给 CString 类型
CString TemplgLen;	// 先声明一个临时的 CString 变量存储转换后的 lgLen
TemplgLen.Format(L"%d", lgLen);
Data = TemplgLen;
1
2
3
4
5
6
7

# 4. 列表控件的可选属性,字体加粗,背景色,水平垂直滚动条

void CFLashSearchDlg::InitListContent()
{
    CRect rect;
    // m_flashConfigList这个列表控件的成员变量,在头文件中声明
    m_flashConfigList.GetClientRect(&rect);	

    // 确认列表控件窗口句柄是否有效
    if (m_flashConfigList.m_hWnd == NULL)
    {
        OutputDebugString(_T("列表控件句柄为空"));
        return;
    }

    m_flashConfigList.SetExtendedStyle(m_flashConfigList.GetExtendedStyle() | LVS_EX_FULLROWSELECT  | LVS_EX_GRIDLINES/*绘制水平和垂直线*/ | LVS_EX_TRACKSELECT | LVS_EX_DOUBLEBUFFER | LVS_EX_FLATSB);
	
    // 为列表视图控件添加列
    m_flashConfigList.InsertColumn(0, _T("Brand"),			 LVCFMT_CENTER, 150, 0);
    m_flashConfigList.InsertColumn(1, _T("Flash Name"),		 LVCFMT_CENTER, 150, 1);
    m_flashConfigList.InsertColumn(2, _T("Flash ID"),		 LVCFMT_CENTER, 150, 2);

    // 设置第一行字体加粗
    CFont font;
    font.CreateFont(16, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, 
                    OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, _T("宋体"));
    m_flashConfigList.SetFont(&font);

    // 设置第一行背景色为浅蓝色
    m_flashConfigList.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
    m_flashConfigList.SetSelectionMark(0);

    // 启用水平和垂直滚动条
    m_flashConfigList.SetScrollPos(SB_HORZ, 0, TRUE);
    m_flashConfigList.SetScrollPos(SB_VERT, 0, TRUE);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  • LVS_EX_DOUBLEBUFFER: 启用双缓冲以减少列表控件的闪烁。即在内存中绘制列表内容,然后一次性将绘制好的内容显示在屏幕上,而不是直接在屏幕上进行绘制。这样可以避免因为列表控件频繁的重绘而产生的闪烁现象,从而提升用户界面的流畅度和可读性。
  • LVS_EX_FULLROWSELECT: 启用全行选择,使得单击项目的任意地方都可以选择整行。
  • LVS_EX_CHECKBOXES: 启用复选框,允许在列表控件中显示复选框,并允许用户选择多个项目。
  • LVS_EX_HEADERDRAGDROP: 启用列标题的拖放功能,允许用户通过拖放方式调整列的顺序。
  • LVS_EX_AUTOSIZECOLUMNS: 自动调整列宽,使得列宽自动适应内容的宽度。
  • LVS_EX_BORDERSELECT: 选中时显示边框,使得在选中项目时显示一个边框。
  • LVS_EX_SUBITEMIMAGES: 允许每个子项显示不同的图标。
  • LVS_EX_TRACKSELECT: 启用跟踪选择,使得鼠标移动到列表项上时自动选择该项。

# 5. 拦截键盘的事件(Enter 键和 Esc 键)

// 拦截回车键信息传递,重定义回车键 = 查找按钮
BOOL CFLashSearchDlg::PreTranslateMessage(MSG* pMsg)
{
    //  拦截回车键信息传递
    if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
    {
        // 在 return 前可以重定义你想要用回车键执行的操作
        // 例如:重定义回车键 = 查找按钮
        OnBnClickedFindButton(); // 执行查找操作
        return TRUE;
    }
    // 如果想要按 Esc 键退出程序则注释这段代码的注释
    if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
    {
        return TRUE;
    }
    return CDialog::PreTranslateMessage(pMsg);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 6. 设置或获取编辑框的内容

// 获取编辑框的内容,IDC_FIND_EDIT 是编辑框的 ID
CString searchText;
GetDlgItemText(IDC_FIND_EDIT, searchText);

// 设置编辑框的内容,IDC_INI_FILE_PATH_EDIT 编辑框的 ID
CString m_strFilePathName = _T("C:\Users\xxxxxxx\Desktop\xxxxxxxx");
SetDlgItemText(IDC_INI_FILE_PATH_EDIT, m_strFilePathName);	// 将路径设置到静态编辑框中

// 弹出窗口进行提示
MessageBox(_T("该文件已经导入过!"));
1
2
3
4
5
6
7
8
9
10

# 7. 从页面获取主页面的窗口指针

// 先声明主页面类型的指针
CFLashSearchDlg *m_pMainDlg = dynamic_cast<CFLashSearchDlg*>(GetParent());
// 然后就可以通过这个指针调用主页面的东西,例如列表控件
// columnIndex 是列表控件的索引列, m_flashConfigList是列表控件的变量名
int nWidth = m_pMainDlg->m_flashConfigList.GetColumnWidth(columnIndex);
1
2
3
4
5

# 8. 设置复选框的状态

// 判断列表控件的指定列是否可见
BOOL CCustomSearchDialog::IsColumnVisible(int columnIndex)
{
	CFLashSearchDlg *m_pMainDlg = dynamic_cast<CFLashSearchDlg*>(GetParent());

    int nWidth = m_pMainDlg->m_flashConfigList.GetColumnWidth(columnIndex);
    return (nWidth > 0);
}
// 根据列表控件的当前状态设置复选框的初始状态
BOOL CCustomSearchDialog::OnInitDialog()
{
    CDialog::OnInitDialog();
    for (int i = 0; i < 21; ++i)
    {
        UINT nID = IDC_CHECK2 + i;	// IDC_CHECK2 是复选框的 ID
        BOOL bChecked = IsColumnVisible(i);	// 检查列是否可见,可见返回一个大于 0 的数(列宽)
        // 设置复选框的状态
        CheckDlgButton(nID, bChecked ? BST_CHECKED : BST_UNCHECKED);
    }
    return TRUE;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
上次更新: 2024/6/3 14:54:44
MFC实现点击列表头排序

MFC实现点击列表头排序→

Theme by Vdoing | Copyright © 2023-2024 霜晨月
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式