获取父对话框的数据
((CftphelperDlg *) GetParent ())->m_UserName;
获取子对话框的数据
ClnputEDT dlg;
UINT nResult =dlg.DoModal();
if(IDOK== nResult ){
UpdateData(FALSE);用于将数据在屏幕中对应控件中显示出来。
this.m_beizhu=dlg.m_strEdit; //是绑定控件的变量
UpdateData(TRUE);//用于将屏幕上控件中的数据交换到变量中(只能更新value类型的变量)
}
传递数据给父对话框
void CChildDlg::OnOK(){//在子类窗口关闭时回传当前编辑框中的值给父窗口
CParentDlg * parent = (CParent*)GetParent(); //或者CDialogEx *parent=(CDialogEx*)GetParent();
CString str;
this->m_edit.GetWindowText(str);//获取当前子窗口编辑框中的值
parent->m_edit2.SetWindowText(str);//把当前编辑框中的值回传给父窗口
}
使用动态dll的资源rc
解决DLL和主调程序的资源冲突及如何使用Dll的资源_weixin_30824599的博客-CSDN博客
仅在多项目解决方案中,才需要切换rc,不同项目dll的资源不能混用,除非按以下操作来
//主调程序和每个DLL都有一个全局唯一的HINSTANCE句柄(HMODULE模块),不管是在主调程序还是DLL中,加载资源都要参考HINSTANCE。主调程序和DLL都可能包含自己的资源,这些资源的ID却不是全局的,可能出现主调程序和某个DLLHINSTANCE中资源ID号相同的情况而发生加载冲突。
//使用了共享的MFC库之后,默认情况下使用主程序的句柄来加载资源,所以如果DLL和主调程序的资源ID相同的话,会默认调用主调程序的资源,表现为:EXE打算调用DLL中的对话框却显示的是EXE中的对话框
HINSTANCE hResOld = AfxGetResourceHandle(); //获取主程序的资源句柄
AfxSetResourceHandle(m_hRes);//设置当前资源句柄为dll的,mhRes 在本cpp的初始化代码中通过 m_hRes = AfxGetResourceHandle();得到,m_hRes 定义在本cpp对应的.h中
//。。。使用dll的资源。。。
AfxSetResourceHandle(hResOld);//还原资源句柄为主程序的
弹出消息框
(42条消息) c++中的消息框messagebox()详细介绍及使用方法_夜-醉梦红尘的博客-CSDN博客
int result = MessageBox(TEXT(“Text”), TEXT(“Title”), MB_OKCANCEL) 返回值是点击了弹出提示框的哪一个按钮
添加菜单消息处理函数
(42条消息) MFC添加菜单资源,绑定菜单事件函数_mfc菜单添加事件处理程序_孔二他老表的博客-CSDN博客
本地文件相关
PathFileExists(Localfilename)
(42条消息) MFC 创建目录、检查目录和文件是否存在_mfc 查找创建目录_rehuojunguan的博客-CSDN博客
总是返回FALSE:原因是通过GetBuffer获得ini的名字没有ReleaseBuffer所以会有空格,所以只需要看这个文件名从哪里来的,中间加个ReleaseBuffer就行了,真正的原因是连接FTP时,PathIsDirectory函数无法查找到本地路径
经过测试CopyFile函数,正在运行的文件也可以被复制到另一个文件夹
创建目录
(42条消息) MFC用CreateDirectory创建文件目录_mfc 查找创建目录_死神在世的博客-CSDN博客
(42条消息) 【工作笔记】PathFileExists 返回 FALSE_installerthread path_半雨微凉丶的博客-CSDN博客
if (!PathIsDirectory(LocalFilePath)) //注意当前是本地路径还是网络路径,连接FTP时,本函数无法查找到本地路径
CreateDirectory(LocalFilePath, 0);//不存在则创建返回0创建失败
选择目录
Shell API SHBrowseForFolder()来选择目录
https://blog.csdn.net/dpsying/article/details/17458401 //比较全
//调用Shell api
https://bbs.csdn.net/topics/390241606
https://www.cnblogs.com/ficow/p/5137343.html
//设置默认路径
https://blog.csdn.net/chengke1866/article/details/100695611
typedef struct _browseinfo {
HWND hwndOwner; // 父窗口句柄
LPCITEMIDLIST pidlRoot; // 要显示的文件目录对话框的根(Root)
LPTSTR pszDisplayName; // 保存被选取的文件夹路径的缓冲区
LPCTSTR lpszTitle; // 显示位于对话框左上部的标题
UINT ulFlags; // 指定对话框的外观和功能的标志
BFFCALLBACK lpfn; // 处理事件的回调函数
LPARAM lParam; // 应用程序传给回调函数的参数
int iImage; // 文件夹对话框的图片索引
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO
#include <afx.h>//使用CFileFind类 获取目录下的文件和文件夹
//完整代码
BROWSEINFO bi;
char name[MAX_PATH]={0};
ZeroMemory(&bi, sizeof(BROWSEINFO));
bi.hwndOwner = AfxGetMainWnd()->GetSafeHwnd();
bi.pszDisplayName = (LPWSTR)name; //=NULL
bi.lpszTitle = _T("选择文件夹目录"); //显示的提示文字
bi.ulFlags = BIF_RETURNFSANCESTORS; //样式
LPITEMIDLIST idl = SHBrowseForFolder(&bi);
CString path;
SHGetPathFromIDList(idl, path.GetBuffer(MAX_PATH)); //传递变量 给path
path.ReleaseBuffer();
选择文件
CFileDialog fileDlg(TRUE);
if(fileDlg.DoModal() == IDOK)
{
CString str=fileDlg.GetFolderPath()+_T("\\")+fileDlg.GetFileName();
GetDlgItem(IDC_EDIT_DIRPATH)->SetWindowText(str);
}
项目相对路径
(42条消息) MFC 得到exe绝对路径_Louis19910615的博客-CSDN博客
利用GetPrivateProfileString读取配置文件(.ini) - sfbrzkh - 博客园 (cnblogs.com)
GetCurrentDirectory,是项目当前的路径,而非exe的路径,GetCurrentDirectory只是返回当前进程的当前目录,而并不是进程的镜像文件(.exe)所在的目录,{项目名}/{项目名} 目录下放的文件,在单独双击exe时也用的是这个路径,也就是说调试的时候放在{项目名}/{项目名} 目录下需要用到的文件,在exe发布时,直接放在exe同目录即可。
CString des;
::GetCurrentDirectory(MAX_PATH,des.GetBuffer(MAX_PATH));// —— {项目名}/{项目名} 目录下
des.ReleaseBuffer();
des+="\\RenewTime.ini";
(43条消息) MFC 获得当前程序所在目录_mfc 获取当前目录_安静平和的博客-CSDN博客
获得当前程序的运行目录(.exe)所在的目录
{
CString path;
GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
path.ReleaseBuffer();
int pos = path.ReverseFind('\\');
path = path.Left(pos);
MessageBox(_T("当前运行在文件夹:")+path);
}
vector
C++ vector 容器浅析 | 菜鸟教程 (runoob.com)
提示不是模板,需要加上using namespace std;
共享文件夹 网络共享
不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接.中断与此服务器或共享资源的所有连接,然后再试一次
win局域网共享文件夹(开启,关闭与访问) - 知乎 (zhihu.com)
外部exe启动
(43条消息) MFC打开外部程序_怎么在mfc按钮打开外部程序_Big Joker的博客-CSDN博客
线程同步互斥
[MFC多线程同步互斥转载] - 老能 - 博客园 (cnblogs.com)
(45条消息) MFC的多线程同步和互斥_CodingLife99的博客-CSDN博客
抓包过滤
ip.addr == 192.168.5.9
bug
-
#include < vector > 如果在.h中函数声明中也用到了vector<?>,则必须用 .h文件来包含vector包
-
调试时会自动跳过语句,VS2019调试会跳过某些代码,但这些语句可以正常执行解决办法 在项目属性-生成中把“优化编码”取消勾选,重新发布调试即可解决。
-
error C1189: #error : Please use the /MD switch for _AFXDLL builds—解决方案
(43条消息) error C1189: #error : Please use the /MD switch for _AFXDLL builds—解决方案_Ruben-Lv的博客-CSDN博客
MFC 特色
MFC中控件关联到变量
-
[(42条消息) MFC]在程序中访问对话框中的控件——GetDlgItem函数_getdlgitem mfc_Lirx_Tech的博客-CSDN博客
-
使用rc中右键添加control变量或者数值变量。
//改tab顺序
按照想要的TAB顺序依次用鼠标点击界面上的控件,点击完成后,控件的TAB顺序就会变成鼠标的点击顺序
选中对话框中的所有空间,然后按下快捷键Ctrl+D,然后在界面上就会显示当前这些控件的TAB顺序
- ::MessageBox(NULL,_T(“请输入24以内小时数”),_T(“提示”),MB_OK); //::是win32 原型函数,不带::是Cwnd子函数
- mfc由于消息机制不可以在消息处理函数中,用sleep,否则会卡死所有其它消息绑定的按钮事件。导致不能触发
- {项目名}/{项目名} 目录下放的文件,在单独双击exe时也用的是这个路径,也就是说调试的时候放在{项目名}/{项目名} 目录下需要用到的文件,在exe发布时,直接放在exe同目录即可。
- .h里面新定义的变量群中之一不用加注释如在ini中对接的变量,但如果是单独的最好加注释
MFC扩展思路
美化ui,重写组件以便于更改其颜色。
项目规程
异常提交测试课流程
清理解决方案,重新release,然后压缩并加密release文件夹作为附件,另一个附件是“软件验证记录表”,在 总务->文档管理->文档下载 ,发邮件给产品经理,抄送小领导(黄旭)、部门总监(张超)、测试课的成员。
请假流程
反悔不想请假了,可以销假,请假入口在 人事->考勤管理->请假申请
项目参与日志
第二个月前两周无erp,写了新增的gpio和流程测试辅助log
FTP小程序
ftp账号192.168.1.36 HDSZ-23011 7m8Wh8kl
\实现功能:
\1. 可以通过IP、端口、用户名、密码连接上对应服务器
\2. 可以显示服务器内所有文件
\3. 实现服务器文件下载至本地
\4. 实现本地文件上传至服务器
\5. 可以删除服务器文件
\6. 可以根据设定自动将设置的本地文件夹数据打包上传至设置的FTP文件夹内,上传有对应的规则。
附加:
软件存储至FTP内,每次双击exe程序,自动更新,如果和FTP内不一致则不给使用
要求:
\1. FTP登录信息可以保存
\2. 文件上传后需复核以确认数据是否上传成功
\3. 界面需要包括:用户信息设定、上传按钮、下拉按钮、本地文件显示框、FTP文件显示框、
(42条消息) 基于MFC的FTP客户端_ CouchDB的博客-CSDN博客 备注:连接ftp过程抄这个的
典型 FTP 客户端应用程序中的步骤 | Microsoft Learn 备注:这些个b函数,只有在#include "afxinet.h"之后才能使用
MFC 实现FTP服务器上传下载 我是是是是是西红柿的博客-CSDN博客
MFC实现FTP客户端_ 慢慢爬的小蜗牛的博客-CSDN博客
引入图标,双击列表,通用函数UpdateDir,用于更新当前ftp路径到列表
.cpp中include的包的类,只能在cpp中声明才有效,在.h里面声明虽然不报错,但拿到.cpp里面用就会报错
新增功能
-
看csdn上改编码,遇到了问题,项目在unicode代码页下,显示不出来ftp上的文件目录下的文件夹或者文件 ,这是GetFilename获取的名字有 /0 导致,后边的目录接上也显示不出来。多字节字符编码下是正常的。
关于Cstring::GetLength()_cstring getlength_maybe__god的博客-CSDN博客
GetLength获取的也是/0之前的字符个数。攻略在
解决CFtpFileFind在Unicode版本下GetFileURL不能正确返回路径_getfileurlsd_zgl7903的博客-CSDN博客MFC CFtpFileFind::GetFileURL问题
使用了 CFtpConnection 类派生的新类,直接用finder.FindFile(T(" * "));或者 finder.FindFile(NULL); 查找路径就能去掉\0,然后strpath=ftpfind.GetFilePath(); 或者strpath=ftpfind.GetFileURL();就能在UNICODE编码的项目下使用了。
-
BOOL bfind=ftpfind.FindFile(_T("/2.软件部")); int index=0; while (bfind) { bfind=ftpfind.FindNextFile(); CString strpath; if (!ftpfind.IsDirectory())//判断是目录还是文件夹 { strpath=ftpfind.GetFileName();//是文件则读取文件名 m_list_file.InsertItem(index,strpath); } else{ strpath=ftpfind.GetFilePath();//如果是文件夹则获取相对路径 m_list_file.InsertItem(index,strpath); } index++; }
-
会显示软件部的目录下的文件和文件夹。
-
更改之后,添加了对话框类的变量 strcurpath为当前显示的目录,显示文件或者文件夹的大小日期,双击跳进下一文件夹,双击文件无反应
- 功能包括,使用 CFileFind类 获取ftp上文件的上次修改时间,大小按KB和MB显示,有“上一目录”的列表项目。初始化添加菜单Menu ,设置菜单的事件处理函数(绑定对话框主类CftphelperDlg)