两个基于对话框的MFC程序,利用创建进程的方式实现调用,然而要实现在一个对话框上设置好的参数传输到另一个对话框上,并且使另一个对话框正常运行。这个通信应该怎么实现呢?具体的发送端怎么发送消息和接收端怎么接受这个消息的代码?WM_COPYDATA可以用么,还是要自定义消息。
解决方案 »
- MFC,Win32跨平台程序问题。
- c++ 读多个日志文件的问题
- 急求windows 32 api或者类似解决方法
- 解决问题给--1100分--http://community.csdn.net/Expert/topic/3675/3675861.xml?temp=.1981012
- 窗口句柄无效是什么原因???
- 组合框
- vc学习方法大讨论--方法最佳者独得100分
- 举手之劳!谢谢!
- 这个宏为什么出现 error C2017: 非法的转义序列
- mfc项目使用GDIPlus对按钮贴图,运行在高清屏上图片位置错乱
- iwebbrowser2 IOleCommandTarget 脚本错误
- 快速写入文件的问题 writefile
[editcnt]
cnt = 10
[readvalue]//标注是否被取走过了,
[edit-1]
value=......
[edit-1]
value=......
..
这样规律的存放读取数据就可以了。
最不济的做法也就把这段代码多复制几次罢了。
//发送..
for(int i=0;i<10;i++)
{
CString s=第i个编辑框的内容;
COPYDATASTRUCT cpd;
cpd.dwData=i;//标记这个是第几个编辑框
cpd.cbData=(s.GetLength()+1)*sizeof(TCHAR);
cpd.lpData=(void*)s.GetString();
SendMessage(....);
}//接收:
BOOL xxDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
CString s=(TCHAR*)(pCopyDataStruct->lpData);//获取字符串内容
int i=pCopyDataStruct->dwData;//获取这个是第几个编辑框的内容
这里就更新第i个编辑框的内容....
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
//大致就这样了.
没有遍历的条件,就不能创造遍历的条件?
首先你得明白,控件的ID到底是什么?
实际上,在MFC里面,id就是一个数字!一个 int 的数字!
你打开工程下面的 Resource.h 看看就知道了.所以,你只需要定义一个int的数组,就可以遍历了!
至于设置/获取文本,只需要用 GetWindowsText / SetWindowsText 即可.int idlst[]={IDC_EDIT1,IDC_EDIT2,IDC_EDIT3};//你需要遍历多少个,就写多少个,只要是正确的控件ID即可..
for(int i=0;i<sizeof(idlst)/sizeof(int);i++)
{
//这里直接用 idlst[i] 作为 控件ID 即可.
CString str;
CWnd *p=GetDlgItem(idlst[i]);// 获取这个id的对象.
p->GetWindowsText(str);// 这样,str就得到了输入框的值.
str="xxxxx";
p->SetWindowsText(str);// 这样, 输入框的值就变成 "xxxxx"
}
//大致思路就这样了.
"Window" 后面没有s的.
void CPXIDlg::OnBtnSend()
{
// TODO: Add your control notification handler code here
int idlst[]={IDC_MOTU_TYPE_COMBO,IDC_FILTER_TYPE_COMBO,IDC_COMBO_PRB,IDC_SAMPLE_RATE_COMBO,IDC_ROLLOFF_COMBO};
for (int i=0;i<sizeof(idlst)/sizeof(int);i++)
{
CString szCopydata; szCopydata.Empty();
CWnd *p=GetDlgItem(idlst[i]);
p->GetWindowText(szCopydata);
//fill the COPYDATASTRUCT
COPYDATASTRUCT cpdst;
cpdst.dwData = NULL;
cpdst.cbData = szCopydata.GetLength();
cpdst.lpData = (void *)szCopydata.GetBuffer(cpdst.cbData);
if(szCopydata.IsEmpty())
{
CWnd::MessageBox("Please input sth");
return;
}
CWnd * pWnd = CWnd::FindWindow(NULL,"Custom Digital Modulation");
if(pWnd == NULL)
{
CWnd::MessageBox("Unable to find the RecieveMsg");
return;
}
pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpdst);
}
}
接收端:
BOOL CCustomDigitalModulation::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: Add your message handler code here and/or call default
int idlsts[]={IDC_COMBO_MODULATION,IDC_COMBO_FILTER,IDC_DataSource,IDC_EDIT_OVERSAMPLING,IDC_XISHU1};
for (int i=0;i<sizeof(idlsts)/sizeof(int);i++)
{ CString szRecvCopydata;
szRecvCopydata.Empty();
szRecvCopydata = (LPSTR)pCopyDataStruct->lpData;
szRecvCopydata = szRecvCopydata.Left(pCopyDataStruct->cbData);
CWnd::SetDlgItemText(idlsts[i],szRecvCopydata);
}
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
话说,以后的代码,记得用代码标签包括起来(像我下面那样),不然别人很难看的.简单看了一下,你的代码有一个问题.(详细的我没去调试过)
那就是, 你的 SendMessage 是在 for 里面进行的, 但是你接收处理的时候,for ... 这算什么?
简单来说, 既然你每一次Send只会发送一个文本框的内容,你处理的时候也应该每次只处理一个文本框的内容.简单改了一下吧,未测试过,纯参考:void CPXIDlg::OnBtnSend()
{
// TODO: Add your control notification handler code here
int idlst[]={IDC_MOTU_TYPE_COMBO,IDC_FILTER_TYPE_COMBO,IDC_COMBO_PRB,IDC_SAMPLE_RATE_COMBO,IDC_ROLLOFF_COMBO};
for (int i=0;i<sizeof(idlst)/sizeof(int);i++)
{
CString szCopydata;
CWnd *p=GetDlgItem(idlst[i]);
p->GetWindowText(szCopydata);//其实严格来说,这里要判断 p!=NULL 的. //fill the COPYDATASTRUCT
COPYDATASTRUCT cpdst;
cpdst.dwData = i;// 这里不要设置为NULL,因为接收方要知道你这个是哪一个文本框...
cpdst.cbData = szCopydata.GetLength();
cpdst.lpData = (void *)szCopydata.GetBuffer(cpdst.cbData); if(szCopydata.IsEmpty())
{
CWnd::MessageBox("Please input sth");
return;//纯建议:这里不妨用 continue ...
}//if CWnd * pWnd = CWnd::FindWindow(NULL,"Custom Digital Modulation");
if(pWnd == NULL)
{
CWnd::MessageBox("Unable to find the RecieveMsg");
return;
}//if pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpdst);
//注意了,这个send是在for里面的,不是在外面.
//在里面和在外面,代码里面就一个 } 的位置,但实际上是天和地的区别...
}//for
}//function()//接收端:
BOOL CCustomDigitalModulation::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: Add your message handler code here and/or call default
int idlsts[]={IDC_COMBO_MODULATION,IDC_COMBO_FILTER,IDC_DataSource,IDC_EDIT_OVERSAMPLING,IDC_XISHU1};
//这里就不要用for了,因为你每次只是 Send 了一个编辑框的数据过来...
//for (int i=0;i<sizeof(idlsts)/sizeof(int);i++)
{
CString szRecvCopydata;
szRecvCopydata.Empty();
szRecvCopydata = (LPSTR)pCopyDataStruct->lpData;
szRecvCopydata = szRecvCopydata.Left(pCopyDataStruct->cbData); //===== here =========
int i=(int)pCopyDataStruct->dwData;//获取编辑框的index
CWnd::SetDlgItemText(idlsts[i],szRecvCopydata);
}
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}