预备工作
我们以程序创建的主窗口基础进行讲解
首先我们设置以下对话框
编辑框绑定控件类型变量,名为m_Eidt,并添加点击事件。
第一行按钮绑定控件类型并添加变量m_Bn11,m_Bn12,m_Bn13,并对第一个按钮设置为群
第二行第一个按钮绑定值类型并添加int类型变量m_Bn21
第三行按钮绑定值类型并添加变量m_Check01,m_Check02,m_Check03
静态文本绑定变量m_Static
下拉框绑定控件变量m_Com,注意此处需要点击类向导,在虚函数OnInitDialog初始化代码中添加如下代码作为初始化:
m_Com.AddString(L"北京");
m_Com.AddString(L"上海");
m_Com.AddString(L"深圳");
m_Com.SetCurSel(0);//设置下拉框默认选项,此处是北京
进度条添加控件类型变量m_Progress
滑块添加控件类型变量m_Slider,进入OnInitDialog初始化代码中添加如下代码作为初始化:
m_Slider.SetRange(0, 100);//设置滑块刻度达到的百分比范围
m_Slider.SetPos(0);//获取初始刻度位置
m_Slider.SetTicFreq(1);//每次滑动前进的刻度数
菜单创建:直接手动设置一个菜单,然后在对话框属性中进行添加即可
列表绑定控件变量m_List,进入类向导选择右键点击消息
文件应用
文件读写
void CDemo02Dlg::OnBnClickedButton1()//文件读写
{
CFile cFileObj; //创建文件对象
cFileObj.Open(L"D:\\123.txt", CFile::modeReadWrite);//以可读可写的方式打开目标文件
DWORD dwFileLength = cFileObj.GetLength();//获取文件长度
char * szBuffer = new char[dwFileLength + 1];//申请文件大小的读写内存缓冲区
memset(szBuffer, 0, dwFileLength + 1);//使读取文件以后,以00结尾
cFileObj.Read(szBuffer, dwFileLength);//读取文件
CString csBuffer;//创建字符串缓冲区
csBuffer.Format(L"%S", szBuffer);//缓冲区接收文件内容
m_Eidt.SetWindowTextW(csBuffer);//编辑框显示文件内容
char * szWriteBuffer = "|||||||||||||||rkvir";//存储我们要写的文件内容
cFileObj.Write(szWriteBuffer, strlen(szWriteBuffer));//将文件内容写入文件
cFileObj.Flush();//文件内存刷新,而非显示刷新
cFileObj.Close();//关闭文件
}
查询目标文件
void CDemo02Dlg::OnBnClickedButton1()//查询目标文件
{
CString FileInfo;//存储文本缓冲区
CFileFind finder; //文件查询类
BOOL bRet = finder.FindFile(L"D:\\symbols(Win7x64)\\*.*");//查询指定文件,*.*表示查询指定目录下文件
while (bRet)//遍历该目录下文件名称
{
bRet = finder.FindNextFileW();//查询下一个文件
CString strName = finder.GetFileName();//接收文件名称
CString strPath = finder.GetFilePath();//接收文件路径
if (strName == L"acpi.pdb")//判断是否是目标文件
{
AfxMessageBox(strName);//查询到目标文件时弹窗
}
FileInfo += strName += "\r\n";//先strName+=后FileInfo+=
FileInfo += strPath += "\r\n";//填充文本缓冲区
}
m_Eidt.SetWindowTextW(FileInfo);//编辑框显示内容
新查询文件
void CDemo02Dlg::OnBnClickedButton1()//MFC新型查询文件
{
//L"文件|*.txt|All Files|*.*||
//文件|*.txt|:txt类型文件
//All Files | *.* |:所有类型文件
CFileDialog cFileDlg(TRUE, NULL, NULL, NULL, L"文件|*.txt|All Files|*.*||", this); //MFC新类型创建文件对话框,可以读取电脑中文件
cFileDlg.DoModal();//显示文件对话框
CString szPath = cFileDlg.GetPathName();//点击目标文件后,接收我们选择的文件路径
m_Eidt.SetWindowTextW(szPath);//编辑框显示文件路径
}
此时我们可以像正常操作一样,选中我们的目标文件
多选按钮应用
判断是否选中按钮
void CDemo02Dlg::OnBnClickedButton2()
{
if (m_Bn11.GetCheck())//获取第一个按钮绑定状态
{
AfxMessageBox(L"11");
}
else if (m_Bn12.GetCheck())
{
AfxMessageBox(L"12");
}
else if (m_Bn13.GetCheck())
{
AfxMessageBox(L"13");
}
}
此时我们选中按钮123后,点击判断会弹出相应的窗口
根据按钮值弹窗
void CDemo02Dlg::OnBnClickedRadio4()//点击不同的按钮后,改变第二行第一个按钮变量值
{
m_Bn21 = 1;
}
void CDemo02Dlg::OnBnClickedRadio5()
{
m_Bn21 = 2;
}
void CDemo02Dlg::OnBnClickedRadio6()
{
m_Bn21 = 3;
}
void CDemo02Dlg::OnBnClickedButton3()//根据选中按钮后变量值弹出不同窗口
{
switch (m_Bn21)
{
case 1:
AfxMessageBox(L"21");
break;
case 2:
AfxMessageBox(L"22");
break;
case 3:
AfxMessageBox(L"23");
break;
default:
break;
}
根据按钮状态弹窗
void CDemo02Dlg::OnBnClickedButton4()//根据选中按钮的状态弹出不同窗口
{
if (m_Check01.GetCheck())
{
AfxMessageBox(L"11");
}
if (m_Check02.GetCheck())
{
AfxMessageBox(L"12");
}
if (m_Check03.GetCheck())
{
AfxMessageBox(L"13");
}
}
点击按钮修改文本
void CDemo02Dlg::OnBnClickedButton5()//点击按钮修改静态文本
{
HWND hStatic = ::GetDlgItem(m_hWnd, IDC_STATIC);
::SetWindowText(hStatic,L"rkvir");
}
void CDemo02Dlg::OnBnClickedButton6()//点击选项后,获取下拉框中的文本
{
int Cur = m_Com.GetCurSel();//获取下拉框选项的序号
CString csTemp;
csTemp.Format(L"%d", Cur);//存储文本至缓冲区
AfxMessageBox(csTemp);/弹窗获取到的内容
}
点击按钮获取下拉框文本
void CDemo02Dlg::OnBnClickedButton6()//点击选项后,获取下拉框中的文本
{
int Cur = m_Com.GetCurSel();//获取下拉框选项的序号
CString csTemp;
csTemp.Format(L"%d", Cur);//存储文本至缓冲区
AfxMessageBox(csTemp);/弹窗获取到的内容
}
滑块与进度条
void CDemo02Dlg::OnBnClickedButton7()
{
const int nMin = 0;
const int nMax = 100000;设置进度条小值和最大值
m_Progress.SetRange32(nMin, nMax);/设置进度条范围
for (size_t i = nMin; i < nMax; i++)//加载进度条
{
m_Progress.SetPos(i);//进度条当前位置
}
}
void CDemo02Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)//滑块和进度条绑定
{
int nID = pScrollBar->GetDlgCtrlID();//获取滑块ID
if (IDC_SLIDER1 == nID) //该消息是全局消息,因此需要进行判断选中的滑块
{
int Pos = m_Slider.GetPos();//获取滑块当前刻度
m_Progress.SetPos(Pos);//设置进度条为滑块的刻度位置
}
CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
菜单应用
点击菜单项弹窗
void CDemo02Dlg::On13()
{
AfxMessageBox(L"Msg");
}
右键菜单
void CDemo02Dlg::OnRclickList1(NMHDR *pNMHDR, LRESULT *pResult)//右键点击列表
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
POINT pt = { 0 };//获取点击位置
GetCursorPos(&pt);//存储点击位置
HMENU hMenu = LoadMenu((HINSTANCE)GetWindowLongPtr(m_hWnd, GWLP_HINSTANCE), MAKEINTRESOURCE(IDR_MENU2));//加载IDR_MENU2菜单
HMENU hSubMenu = GetSubMenu(hMenu, NULL);//获取菜单句柄
TrackPopupMenu(hSubMenu, TPM_CENTERALIGN, pt.x, pt.y, 0, m_hWnd, NULL);//鼠标点击位置弹出菜单
*pResult = 0;
}
点击右键菜单弹窗
void CDemo02Dlg::On134()//对菜单选项1下面的3进行应用
{
// TODO: 在此添加命令处理程序代码
AfxMessageBox(L"Msg");//点击时弹窗
}
作业
使用MFC搜索D盘获取指定文件并且读取到程序内,显示在Edit上
CString RealFilePath = L"0";
CString FileFind(CString FilePath, CString FileName)
{
CFileFind finder;
FilePath = FilePath + L"\\*.*";
BOOL bRet = finder.FindFile(FilePath);
while (bRet)
{
bRet = finder.FindNextFileW();
if (finder.IsDots())//当遍历到特殊目录时跳过本次循环
{
continue;
}
CString strName = finder.GetFileName();
CString strPath = finder.GetFilePath();
if (finder.IsDirectory())//当目标文件是目录时
{
FileFind(strPath, FileName);
}
if (strName == FileName)
{
RealFilePath = strPath;
}
}
return RealFilePath;
}
void CMFCApplication2Dlg::OnBnClickedButton1()
{
CString FilePath = FileFind(L"D:", L"QQ浏览器截图20240814104659.png");
m_Edit.SetWindowTextW(FilePath);
}