在一个多文档工程中:
1.如何用代码实现关闭当前(或者说最上面)的子窗体?2.如何修改子窗体的caption?3.用系统按纽关闭字窗体,是不是真的销毁了这个子窗体?因为我发现我New了一个以后,然后关闭,发现再New的时候,系统默认的Caption是从...2开始的。谢谢大家!

解决方案 »

  1.   

    1、给当前窗口发送WM_CLOSE的消息
    2、SetWindowText
    3、系统默认的Caption并不随着子窗体的销毁而改变递增的规律
      

  2.   

    第一个问题有很多解决方法,但是要看具体情况而言
    1. AfxGetApp()->m_pMainWnd->SendMessage()
    2. ::DestroyWindow();
    .....当然,你也可以用一个进程关闭另外一个进程
    ....
    DWORD dwProcessId;
    HANDLE hProcess;
    // Find the handle to Calculator’s window (as an example).
    HWND hwnd = FindWindow(NULL, “Notepad”);
    GetWindowThreadProcessId(hwnd, &dwProcessId);
    hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessId);
    TerminateProcess(hProcess, 0);
    CloseHandle(hProcess);
    ....一顿乱说~! :)
      

  3.   

    另:SetWindowText好象只是改变主窗体的caption,我想要改变子窗体的caption
      

  4.   

    另:我知道SendMessage可以关闭一个窗口,它的参数为:
    LRESULT SendMessage(
      HWND hWnd,      // handle of destination window
      UINT Msg,       // message to send
      WPARAM wParam,  // first message parameter
      LPARAM lParam   // second message parameter
    );但在MainFrm.cpp(多文档中的一个默认cpp),它只默认后面的三个参数;
    我如何在MainFrm.cpp中关闭当前的子窗体?是子窗体!
      

  5.   

    to:楼上
    那我如何获得当前(最前面)的子窗体的HWND hChild呢?还有,我如果想改变当前子窗体的"caption",该如何做?谢谢!
      

  6.   

    重载OnUpdateFrameTitle,这个函数需要手动添加
      

  7.   

    1.
    访问CWnd::m_hWnd  或用FindWindow
    HWND FindWindow(
      LPCTSTR lpClassName,  // class name
      LPCTSTR lpWindowName  // window name
    );
      
    2.
    BOOL SetWindowText(
      HWND hWnd,         // handle to window or control
      LPCTSTR lpString   // title or text
    );
      

  8.   

    感谢楼上的帮助,不过我还是有点不清楚参数的填写,不好意思。我的多文档工程名叫:FuzzyLogic,系统默认的子窗体叫FuzzyL1,请问我该如何填写FindWindow(
     LPCTSTR lpClassName,  // class name
     LPCTSTR lpWindowName  // window name
    );
    的参数,从而来关闭该子窗体?谢谢 .HWND hwnd;
    hwnd = ::FindWindow(NULL,??);  // how to write?
    ::SendMessage(hwnd,WM_CLOSE,0,0);
      

  9.   

    1。第一种方法
    hwnd = ::FindWindow(NULL,"your child window's title");  
    这种方法不太保险,万一另一个窗体的title和你的重名可能就有麻烦了
    2。第二种方法
    重载子窗体的
    PreCreateWindow(CREATESTRUCT& cs)
    {
    ...
    //----Register Window Class
    static LPCSTR className = NULL;
    if (className==NULL) 
    {
    WNDCLASS wndcls;
    ::GetClassInfo(AfxGetInstanceHandle(), cs.lpszClass, &wndcls);
    wndcls.lpszClassName = "YOUR_CLASSNAME";
    VERIFY(AfxRegisterClass(&wndcls));
    className="YOUR_CLASSNAME";
    }
    cs.lpszClass = className;
    //----
    return TRUE;
    }
    hwnd = ::FindWindow("YOUR_CLASSNAME",NULL);
    3。也可以两个参数一起使用
    4。最直接方法,保存你的子窗体的指针
      

  10.   

    to:hwonzor
    你上面的代码加入以后,编译没有问题,一执行,说是“创建空文档失败”!我的程序是:
    一开始用: //InitInstance()
    if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew)
    {
          cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
    }
    屏蔽了子窗体的出现然后用SendMessage(WM_COMMAND,(WPARAM)ID_FILE_NEW,0);  在程序中创建子窗体;在加入你的代码后:
    一执行SendMessage创建子窗体,说是“创建空文档失败”!有什么办法解决吗?
      

  11.   

    再to:hwonzor
    问题出现在一执行SendMessage(WM_COMMAND,(WPARAM)ID_FILE_NEW,0);  就出了问题,错误信息:“创建空文档失败”谢谢关注...
      

  12.   

    1:
    CFrameWnd* pMainFrame=(CFrameWnd*)AfxGetMainWnd();
    CFrameWnd* pActiveFrame=pMainFrame->GetActiveFrame();
    if(pActiveFrame)
    pActiveFrame->PostMessage(WM_CLOSE);2:
    在CChildFrame中重写CFrameWnd的虚函数OnUpdateFrameTitle:void CChildFrame::OnUpdateFrameTitle(BOOL bAddToTitle)
    {
    SetWindowText("abc");
    }3:
    点关闭以后,子窗口的确被销毁了。
      

  13.   

    unrise(小超) ,如果你的子窗体就是childframe的话,用webber84(***闭关修炼中***) 的方法就可以实现了
      

  14.   

    首先,感谢webber84(***闭关修炼中***) 的代码,解决了我的问题。再to: hwonzor(闲人)
    有什么方法可以解决你上面方法在应用中出现的问题?谢谢...
      

  15.   

    一开始用: //InitInstance()
    if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew)
    {
          cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
    }
    屏蔽了子窗体的出现去掉上面的代码,启动的时候会出现错误吗?
    奇怪...
      

  16.   

    你的CChildFrame::PreCreateWindow(CREATESTRUCT& cs)没有加下面一句 if( !CMDIChildWnd::PreCreateWindow(cs) )
    return FALSE;
      

  17.   

    to:hwonzor(闲人)CChildFrame::PreCreateWindow(CREATESTRUCT& cs)下面系统自动生成有
    {
      //加入你的代码... 
       if( !CMDIChildWnd::PreCreateWindow(cs) )
    return FALSE;
       return TRUE;
    }只要在上面加入你的代码,系统就错误(编译通过),别的我什么都没有动过。
    错误信息:Debug Assertion Failed! 创建空文档失败!--- 为什么会这样?
      

  18.   

    CChildFrame::PreCreateWindow(CREATESTRUCT& cs)下面系统自动生成有
    {
      if( !CMDIChildWnd::PreCreateWindow(cs) )
    return FALSE;
       //加入我的代码... 
       
    }
      

  19.   

    再 to hwonzor(闲人) :
    不好意思,我刚才试了一下,程序是没有出什么大错,就是没有实现目标(关闭该子窗体)
    我的做法:
    1. 建立一个多文档工程;
    2.
    CChildFrame::PreCreateWindow(CREATESTRUCT& cs)下面系统自动生成有
    {
      if( !CMDIChildWnd::PreCreateWindow(cs) )
    return FALSE;
       
       加入你的的代码...
       
       return true; 
       
    }3.
    void CAboutDlg::OnOK() 
    {
        HWND hwnd;
        hwnd = ::FindWindow("YOUR_CLASSNAME",NULL);
        ::SendMessage(hwnd,WM_CLOSE,0,0);}结果:没有反应,hwnd 显示为0
      

  20.   

    忘了,Findwindow对childframe无效,他不寻找子窗口。