程序里的一个子窗体需调用一回调函数,但当程序返回后该窗体类本来已经赋值的成员变量都清空或者由构造函数重新赋值,不知道是怎么回事情 。 如窗体类 CaDlg 中
oninitdialog 本来已经将 m_x 初始化,
在调用一回调后
 LRESULT CALLBACK WndProc1(  HWND hwnd,  UINT uMsg,  WPARAM wParam,  LPARAM lParam  )
{
        
   //CaDlg* dlg=new CaDlg();
    switch( uMsg )
{
  case WM_LBUTTONDOWN:
//((CaDlg* )AfxGetMainWnd())->ProcessLButtonDown( hwnd );
//AfxGetMainWnd()
//((CaDlg* )((CMainDlg*)(::AfxGetApp ()->GetMainWnd ()))->GetMyWnd())->OnInitDialog ();
((CaDlg* )((CMainDlg*)(::AfxGetApp ()->GetMainWnd ()))->GetMyWnd())->ProcessLButtonDown (hwnd);
//dlg->ProcessLButtonDown (hwnd);
//delete dlg;
return 0;
}本来我直接用AfxGetMainWnd() 但想了下这是主窗体句柄
就转了几个弯子取的该子窗体句柄,然后调用成员函数aDlg::ProcessLButtonDown(),这时候发现以前初始化的变量都清空或者由构造函数重新赋值 谢谢 帮忙看看,分还有 :)

解决方案 »

  1.   

    CaDlg* dlg=new CaDlg(); ???
    此处的dlg不是原来已经初始化了的对话框了
      

  2.   

    m_x 是 CaDlg的成员变量 就算是int 吧
    在oninitdlg赋值
    回调后被清空了回调函数在令外一个类
      

  3.   

    GetMyWnd()是怎么写的?
    ProcessLButtonDown ()又是怎么写的?
    说不定这两个东东有问题
      

  4.   

    ProcessLButtonDown () 肯定没问题我也觉得应该窗体句柄有问题所以我才会 new 了一段出来
    CaDlg* dlg=new CaDlg();
    dlg->ProcessLButtonDown ();
    delete dlg;
    这样取句柄应该行吧但还是不对!!!!555各位大虾帮帮忙  小弟谢过  要分好说 :)
      

  5.   

    问题没有说清楚,所以大家都在猜.楼主需要说明:1. CaDlg是在哪里实例化的? 
    2. 实例化后是在哪里调DoModal()的?
    3. WndProc1是谁的WNDPROC,它和CaDlg的实例间是什么关系?楼主应该知道:
    1. 只有等DoModal()后,OnInitDialog()才用被调用,你的m_x才会被初始化.
    2. 在你"转了几个弯子取的该子窗体句柄"时,你所取得的"子窗体句柄"并不一定是你想像中要用的那个子窗口实例的句柄.
      

  6.   

    我把代码贴出来
    在CFileExplorDlg::OnNMDblclkList1中实例化CaDlg
    实例化代码是
    CaDlg* playDlg=new CaDlgDlg(this);
    playDlg->DoModal();
    delete playDlg;CaDlg 的回调函数:
     LRESULT CALLBACK WndProc1(
      HWND hwnd, UINT uMsg, WPARAM wParam,  LPARAM lParam );//实例CaDlg的消息重载处理过程徽调类容:
    LRESULT CALLBACK WndProc1(  HWND hwnd,  UINT uMsg,  WPARAM wParam,  LPARAM lParam  )
    {
            
       CaDlg* dlg=new CaDlg();
        switch( uMsg )
    {
      case WM_LBUTTONDOWN:
    //((CaDlg* )AfxGetMainWnd())->ProcessLButtonDown( hwnd );
    dlg->ProcessLButtonDown (hwnd);
    delete dlg;
    return 0;
                case WM_PAINT:
                          
    }
    ProcessLButtonDown()函数重新处理左键消息
    void CaDlg::ProcessLButtonDown(HWND hwnd)
    {
    int i =0;
        PRECT pRect;
    switch(m_x)                  //m_x 在实例化时OnInitDialog()初始化成功 赋值为16,但回调处理消息进入这个函数后 m_x的值就变成了构造函数中初始的4
    {
     case 1:
          Proc1(); 
                   break;
              case 4:
                   Proc2(); 
                   break;
              case 9:
               ... ... 
            }
    }
    我也觉得子窗体句柄有问题,但我现在这样new 有问题吗?
    多谢楼上几位大哥慷慨解疑:)