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);
}
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);
......
}
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;
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);
}
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);
}
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("该文件已经导入过!"));
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);
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;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21