父子对话框均有一个Edit控件和一个按钮,点击父对话框按钮显示子对话框,更改子对话框Edit控件的值后按按钮,使得子对话框中的值在父对话框中的Edit控件中显示。父对话框的Edit控件ID为IDC_EDIT1,子对话框的Edit控件ID为IDC_EDIT2。
子对话框的按钮按下后的代码如下:
void Dlg1::OnOK()
{
GetDlgItemText(IDC_EDIT2,string1);
::SendMessage(::GetParent(this->m_hWnd),WM_COPYDATA,0,0);
}父对话框接收消息的代码如下:
BOOL CCopyDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
AfxMessageBox("get message",MB_OK,0);
Dlg1 dlg1; //Dlg1是子对话框的类名
CString string2;
string2 = dlg1.string1; //string1在子对话框类中已定义为public
SetDlgItemText(IDC_EDIT1,string2); return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}经运行发现,消息已经被相应,但是字符串变量却没有被传递过来。请大家帮忙给看一下问题出在什么地方,谢谢!
P.S. 也试过在子对话框的OnOK()里传递字符串变量,结果也是一样无法传过来。
子对话框的按钮按下后的代码如下:
void Dlg1::OnOK()
{
GetDlgItemText(IDC_EDIT2,string1);
::SendMessage(::GetParent(this->m_hWnd),WM_COPYDATA,0,0);
}父对话框接收消息的代码如下:
BOOL CCopyDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
AfxMessageBox("get message",MB_OK,0);
Dlg1 dlg1; //Dlg1是子对话框的类名
CString string2;
string2 = dlg1.string1; //string1在子对话框类中已定义为public
SetDlgItemText(IDC_EDIT1,string2); return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}经运行发现,消息已经被相应,但是字符串变量却没有被传递过来。请大家帮忙给看一下问题出在什么地方,谢谢!
P.S. 也试过在子对话框的OnOK()里传递字符串变量,结果也是一样无法传过来。
解决方案 »
- 在ADO中表名有"._"符号的表。调用 updata()时出错 。表名为 [test._lay] 请高手指教。
- 如何让自己编的类响应消息
- 再求<<ATL开发指南>>电子书籍
- 如何逐个得到一个对话框中或者一个视中的所有控件,我想onsize.....
- (500分)在网页中如何用Javascript设置在VC环境下开发的ActiveX的属性或调用它自定义的方法。
- MFC 如何将一个对话框的值,传递给下一个对话框
- 求解:关于CSocket问题,十分不解,[服务端接收不到已经已由客户端发到服务端的包]
- ???音频录制的问题
- 急急急急!!!!怎样把dialogbar放在toolbar的同一行上!
- 如何使用JDK1.2.1?
- 释放内存??
- IP头,UDP头,和TCP头的问题!
传递的时候把值作为参数传进去
应该是利用COPYDATASTRUCT吧,
Dlg1 dlg(this);
if (dlg.DoModal() == IDOK)
{
GetDlgItem(IDC_XXX)->SetWindowText(dlg.m_edit);
}
typedef struct tagMYREC
{
char s1[80];
char s2[80];
DWORD n;
} MYREC;
COPYDATASTRUCT MyCDS;
MYREC MyRec;
HRESULT hResult;
BOOL CALLBACK InfoDlgProc( HWND, UINT, WPARAM, LPARAM );
// ************ Code fragment ****************
// Get data from user. InfoDlgProc stores the information in MyRec.
//
DialogBox( ghInstance, "InfoDlg", hWnd, (DLGPROC) InfoDlgProc );
//
// Copy data into structure to be passed via WM_COPYDATA.
// Also, we assume that truncation of the data is acceptable.
//
hResult = StringCbCopy( MyRec.s1, sizeof(MyRec.s1), szFirstName );
if (hResult != S_OK)
return False;
hResult = StringCbCopy( MyRec.s2, sizeof(MyRec.s2), szLastName );
if (hResult != S_OK)
return False;
MyRec.n = nAge;
//
// Fill the COPYDATA structure
//
MyCDS.dwData = MYPRINT; // function identifier
MyCDS.cbData = sizeof( MyRec ); // size of data
MyCDS.lpData = &MyRec; // data structure
//
// Call function, passing data in &MyCDS
//
hwDispatch = FindWindow( "Disp32Class", "Hidden Window" );
if( hwDispatch != NULL )
SendMessage( hwDispatch,
WM_COPYDATA,
(WPARAM)(HWND) hWnd,
(LPARAM) (LPVOID) &MyCDS );
else
MessageBox( hWnd, "Can't send WM_COPYDATA", "MyApp", MB_OK );
//接收
#define MYDISPLAY 1
typedef struct tagMYREC
{
char s1[80];
char s2[80];
DWORD n;
} MYREC;
PCOPYDATASTRUCT pMyCDS;
void WINAPI MyDisplay( LPSTR, LPSTR, DWORD );
//
// ************ Code fragment ****************
//
case WM_COPYDATA:
pMyCDS = (PCOPYDATASTRUCT) lParam;
switch( pMyCDS->dwData )
{
case MYDISPLAY:
MyDisplay( (LPSTR) ((MYREC *)(pMyCDS->lpData))->s1,
(LPSTR) ((MYREC *)(pMyCDS->lpData))->s2,
(DWORD) ((MYREC *)(pMyCDS->lpData))->n );
}
break;
{
UpdateData(TRUE);//加上这一句
GetDlgItemText(IDC_EDIT2,string1);
::SendMessage(::GetParent(this->m_hWnd),WM_COPYDATA,0,0);
}
CString string2;
string2 = dlg1.string1; //string1在子对话框类中已定义为public 这个"dlg1"就不是你弹出来的那个dlg了
为什么要放到子对话框的OnOK里面啊?不解//二楼的代码应该放到主对话框的按钮响应函数中,并且添加UpdateData(false);首先给子对话框Edit关联变量CString m_edit;
在子对话框的OnOK函数中UpdateData(true);在主对话框的按钮响应函数中:
Dlg1 dlg(this);
if (dlg.DoModal() == IDOK)
{
GetDlgItem(IDC_XXX)->SetWindowText(dlg.m_edit); //这里IDC_XXX为主对话框Edit的ID
}
"点击父对话框按钮显示子对话框"
是如何显示子窗口的?
如果是形如 myDlg.DoModel(), 可以把这个变量作为你这个父对话框的成员变量,
然后string2 = myDlg.string1
Dlg1 dlg1; //Dlg1是子对话框的类名
你想定义一个对象肯定不行。因为dlg1跟之前的不是同一个对象