我的程序是这样的,我用一个DIALOG做主程序启动,启动后生成另一个DIALOG(无模式对话框),我想用PostMessage函数向第二个DIALOG发送消息。
1。请问PostMessage的第一个参数HWND hWnd怎么得到?
2。我可不可以在第一个DIALOG中直接调用另一个DIALOG中的控件呢?(比如像VB中的直接Form2.Edit1.text = "asdfas")

解决方案 »

  1.   

    1:假设子dialog为dlg,直接用dlg.PostMessage就可以了。
    2:可以。先用dlg.GetDlgItem找到要操纵的控件。
      

  2.   

    1。你在生成第二个对话框时保存句柄不就行了2。可以,有了对话框的句柄就行了,如你上边的例子LONG SendDlgItemMessage(
      HWND hDlg,      // handle of dialog box //有EDIT框的对话框的句                        柄
      IDE_EDIT,       // identifier of control // EDIT控件的ID
      WM_SETTEXT,       // message to send   //消息
      WPARAM wParam,  // first message parameter
      "asdfas"        // second message paramete//字符串
    );
      

  3.   

    如果时子对话框想得到夫对话框的句柄用GetParent(HWND hWnd)就行了
      

  4.   

    1. 如果你用MFC的CDialog,比如,CDialog dlg2;,则直接用:dlg2.PostMessage(......); 否则,在创建第二个对话框的时候,把HDLG记录下来就可以了;
    2. 以你的例子和CDialog dlg2;为例:
    dlg2.GetDlgItem(IDC_EDIT1)->SetWindowText("asdfas");
    或者:dlg2.SetDlgItemText(IDC_EDIT1, "asdfas");
    (当然,你也可以用动态数据交换技术,为IDC_EDIT1关联一个CString m_strEdit1;这样:
    dlg2.m_strEdit1 = "asdfas";
    dlg2.UpdateData(FALSE);)
      

  5.   

    上面的例子中,一定要得到对话框HWND的话,可以dlg2.GetSafeHwnd();。
      

  6.   

    CMyDialog2 dlg2;
    dlg2.m_pFirstDlg = this->m_hWnd;ShowWindow(dlg2);
    ...
      

  7.   

    对不起,我按照你的代码做的,代码如下:
    CAlarm256Dlg * m_pDlg=(CAlarm256Dlg *)GetDlgItem(IDD_ALARM256_DIALOG);int a = ::PostMessage(m_pDlg->GetSafeHwnd(), WM_MSG_ONE, 0, 0);
    //这个a返回是1,应该成功了吧!但是我消息没有收到,而且我监视m_pDlg它的内容始终是0x00000000,这不对吧
    m_pDlg->GetDlgItem(IDC_MSG)->SetWindowText("asdfas");
    //这么执行出现非法操作对话框
      

  8.   

    对不起,我现在说的详细些,希望大家再帮下忙
    我有两个对话框类
    CAlarm256Dlg
    CMainBoardDlg(主的,在OnInitDilog中生成CAlarm256Dlg的无模式对话框).
    在CAlarm256Dlg中增加一个自定义消息,代码如下:我按照你的代码做的,代码如下:
    const WM_MSG_ONE = WM_USER + 100;
    afx_msg LONG OnBtnOne(WPARAM wParam, LPARAM lParam);CAlarm256Dlg * m_pDlg=(CAlarm256Dlg *)GetDlgItem(IDD_ALARM256_DIALOG);BEGIN_MESSAGE_MAP(CAlarm256Dlg, CDialog)
    //{{AFX_MSG_MAP(CAlarm256Dlg)
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_MSG_ONE, OnBtnOne)
    END_MESSAGE_MAP()LONG CAlarm256Dlg::OnBtnOne(WPARAM wParam, LPARAM lParam)
    {
    m_strMsg = _T("按键1");
    return 0;
    }
    //上面的这些代码,没错吧?然后在CMainBoardDlg中的一个按键函数如OnBtnOne()中增加如下代码?int a = ::PostMessage(m_pDlg->GetSafeHwnd(), WM_MSG_ONE, 0, 0);
    //这个a返回是1,应该成功了吧!但是我消息没有收到,而且我监视m_pDlg它的内容始终是0x00000000,这不对吧?结果是程序,没有反映,看来是消息没有收到。请再帮忙解释一下好吗?
      

  9.   

    wrong, 
    CAlarm256Dlg * m_pDlg=(CAlarm256Dlg *)GetDlgItem(IDD_ALARM256_DIALOG);
    不能这么取
      

  10.   

    GetDlgItem()是取Dialog中的控件窗口指针的
    你的m_pDlg一定是0x0PostMessage()永远返回1应该这样m_pDlg = new CAlarm256Dlg(this);
      

  11.   

    CParentDlg *pDlg = (CParentDlg *)GetParent();
    HWND hHandle = pDlg->GetSafeHwnd();