在VC 6.0中有一个对话框工程在其界面有一个图形框,我在这个对话框中又引进包含了另一个对话框,程序运行时调用显示这个子对话框。然后子对话框的文本编辑控件中输入文字时想实时显示在父对话框的图形控件中。也就是两个对话框在同一个界面显示,一个对话框类使用另一个对话框中的数据,但是要实时显示,子对话框输入时同步显示在父对话框中这在一个对话框好做,在两个对话框中没有做出来,不知如何样去做。谢谢!
调试欢乐多
void CEditDlg::OnChangeEdit1()
{
UpdateData(true);
m_edit2=m_edit1;
UpdateData(false);
}
在子对话框中将要实时输入同时给主对话框就可以了
#define WM_EditChanged WM_USER+1002.子对话框中有输入,记录Edit中的字符串,发消息给父窗口
void CDlg1::OnChangeEdit1()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
m_Edit.GetWindowText(m_strEdit);
::PostMessage(GetParent()->m_hWnd,WM_EditChanged,NULL,NULL);
}3.父窗口中定义消息响应函数
头文件: // Generated message map functions
//{{AFX_MSG(CEditDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButton1();
//}}AFX_MSG
afx_msg LRESULT OnEditChanged(LPARAM lParam,WPARAM wParam);
DECLARE_MESSAGE_MAP()
cpp文件
BEGIN_MESSAGE_MAP(CEditDlg, CDialog)
//{{AFX_MSG_MAP(CEditDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_EditChanged,OnEditChanged)
END_MESSAGE_MAP()LRESULT CEditDlg::OnEditChanged(LPARAM lParam,WPARAM wParam)
{
m_Edit.SetWindowText(dlg.m_strEdit);
return 0;
}
OK了!简单吧!
在子对话框OnEditChanged()函数里添加
GetParent()->SendMessage(WM_XXX, (WPARAM)lpstrEdit);// lpstrEdit为修改后的编辑框字符串指针在父窗体中添加对WM_XXX的消息响应函数,或者可以重载PreTranslateMessage()
{
if (pMsg->wParam == WM_XXX)
{
LPTSTR pStr = pMsg->wParam;
将pStr显示到副窗体控件中即可
}
}
我做个总结,问题完全按 uckyboy1979 的所例代码书写。可能我描述上有些差异,在获取父窗口指针哪儿出了点问题,但还是解决了,感谢 uckyboy1979 没有你的代码,我解决不了,解决了就简单了,没有解决前,真是没有想到用 SendMessage 方法啊。 void CDlg1::OnChangeEdit1()
{
CWnd* pWnd = CWnd::FindWindow(NULL, _T("窗口名称"));
HWND hwnd = pWnd -> GetSafeHwnd();
::SendMessage(hwnd,WM_EditChanged,NULL,NULL);
}FindWindow 第一个参数可以是 类名,第个参数可以是 NULL 但这样一改就出不来了,i不知原因,
可能还有其它好的办法,再次 感谢!
2.给子窗口重载一个构建函数,用这个函数传入hPwnd.ChildDLG::ChildDLG(HWND hwnd)
{
m_hPeditwnd=hwnd;
}3.void ChildDLG::OnChangeEdit1()
{
UpdateData(true);
::SetWindowText(m_hPeditwnd,m_strChild);
UpdateData(false);
}