在基于单文档的MFC中能不能点击菜单项弹出对话框,再点击对话框中的按钮开始串口通信呢?如果不能的话,要怎样变通来实现这个功能呢?
不知道你这个问题是否已经解决, 如果还没有解决的话:1.使用VS2017搭建基于对话框的MFC应用程序,名为“MainProcess”。并放置一个EDIT控件和两个BUTTON控件并将对话框Caption命名为“MainProcess”,如图。
2.右键“解决方案“MainProcess””->添加->新建项目
3.选择“MFC应用程序”并命名为“ChildProcess”
4.打开ChildProcess的对话框编辑页,添加一个EDIT控件并将对话框Caption命名为“ChildProcess”
5. 右键“解决方案“MainProcess””->属性->启动项目,选择单项目启动“MainProcess”
6.在MainProcessDlg.cpp实现文件中添加宏定义:
//自定义用户消息
#define WM_MYMESSAGE WM_USER + 1
7.双击MainProcessDlg按钮添加按钮响应函数:
//启动子程序按钮响应函数
void CMainProcessDlg::OnBnClickedButton1()
{
PROCESS_INFORMATION pi = { 0 };//进程信息结构
STARTUPINFO si = { 0 };//启动信息结构
si.cb = sizeof(si);
si.wShowWindow = SW_SHOW;//显示窗口
si.dwFlags = STARTF_USESHOWWINDOW;//启动标志,显示窗口
::CreateProcess(
TEXT("F:/Test/MainProcess/Debug/ChildProcess.exe"),//可执行文件(exe)或模块路径
nullptr,//命令行参数
nullptr,//默认进程安全性
nullptr,//默认线程安全性
FALSE, //指定当前进程内局部不可以被子进程继承
CREATE_DEFAULT_ERROR_MODE, //创建进程的标志,这里设为0,不需要
nullptr,//使用本进程的环境变量
nullptr,//使用本进程的驱动器和目录
&si, &pi);
}
//发送指令按钮
void CMainProcessDlg::OnBnClickedButton2()
{
HWND hWnd = ::FindWindow(_T("#32770"), _T("ChildProcess"));//目标进程的窗口类名(可通过Spy++工具查看)和窗口名
if (NULL != hWnd)
{
::PostMessage(hWnd, WM_MYMESSAGE, NULL, NULL);//发送用户消息
SetDlgItemText(IDC_EDIT1, _T("指令1已发送!"));
}
}
8.在ChildProcessDlg.h头文件里添加函数声明:
protected:
afx_msg LRESULT OnMyMessage(WPARAM wp, LPARAM lp);
9.在ChildProcessDlg.cpp实现文件中添加自定义消息宏定义:
#define WM_MYMESSAGE WM_USER + 1
10.在ChildProcessDlg.cpp实现文件中添加自定义消息处理声明:
BEGIN_MESSAGE_MAP(CChildProcessDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)//只添加这一句,其他为示意位置
END_MESSAGE_MAP()
11.最后在ChildProcessDlg.cpp实现文件末尾添加自定义消息响应函数:
LRESULT CChildProcessDlg::OnMyMessage(WPARAM wp, LPARAM lp)
{
SetDlgItemText(IDC_EDIT1, _T("收到指令1"));
return 0;
}