有个对话框 建立了一个类  class CDlg1 : public CFormView
在这个对话框有个“退出”按钮,  想按下这个按钮就退出这个对话框  
就象class CDlg2:public CDialog  的那种 CDialog::OnCancel()一样的  要怎么写呢

解决方案 »

  1.   

    建立消息响应函数,调用OnCancel方法。或者把你这个退出按钮的ID改为Cancel按钮的ID
      

  2.   

    OnCancel()不行,就用OnOK(),再不行就用DestroyWindow(),总行了吧。
      

  3.   

    CDlg1应该从CDialog派生把?然后用CDialog::OnCancel()才可以的
    class CDlg1 : public CDialog
      

  4.   

    CloseWindow();
    或 DestroyWindow();
    或 PostMessage(WM_CLOSE);
    或 SendMessage(WM_CLOSE);
    或 ExitProcess(0);//这个函数将推出整个程序
    CFormView本身没有OnOK和OnCancel函数。
      

  5.   

    SendMessage(WM_CLOSE, 0, 0);
      

  6.   

    CWnd::OnClose();
    SendMessage(WM_CLOSE, 0, 0);
    CloseWindow();
    或 DestroyWindow();
    或 PostMessage(WM_CLOSE);
    或 SendMessage(WM_CLOSE);
    都试过了  不行  只有 ExitProcess这个有反应  不过整个程序都退出来了  
    晕晕哦  到底要怎么才能把那个子界面窗口关闭啊???
      

  7.   

    日。你把程序发这来。我关不掉给你打。
    [email protected]
      

  8.   

    // MainFrm.h : CMainFrame 类的接口
    //#include "ChildFrm.h"#pragma once
    class CMainFrame : public CMDIFrameWnd
    {
    DECLARE_DYNAMIC(CMainFrame)
    public:
    CMainFrame();// 属性
    public:
    CChildFrame *m_DlgView1,*m_DlgView2;
    ***************************************************
    // MainFrm.cpp : CMainFrame 类的实现
    //
    #include "stdafx.h"
    #include "MOD.h"#include "MainFrm.h"
    #include ".\mainfrm.h"
    #include "ChildFrm.h"
    #include "DlgView1.h"
    #include "DlgView2.h"
    // CMainFrameIMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
    ON_WM_CREATE()
    ON_COMMAND(ID_MENU_OPENDLGVIEW1, OnMenuOpendlgview1)
    ON_COMMAND(ID_MENU_OPENDLGVIEW2, OnMenuOpendlgview2)
    END_MESSAGE_MAP()// CMainFrame 构造/析构CMainFrame::CMainFrame()
    {
    // TODO: 在此添加成员初始化代码
    m_DlgView1=NULL;
    m_DlgView2=NULL;
    }// CMainFrame 消息处理程序
    void CMainFrame::OnMenuOpendlgview1()  //这个和下面一个是在菜单栏上的事件
    {
    // TODO: 在此添加命令处理程序代码
    if(m_DlgView1!=NULL)   //如果样式窗口1已经打开 激活他.否则动态创建样式窗口1.
    {
    m_DlgView1->MDIActivate();
    return;
    } m_DlgView1=new CChildFrame();
    CCreateContext context;
    context.m_pNewViewClass=RUNTIME_CLASS(CDlgView1);
    if(!m_DlgView1->LoadFrame(IDI_ICON1,WS_MAXIMIZE|WS_OVERLAPPEDWINDOW,this,&context))
    return;
    m_DlgView1->ShowWindow(SW_SHOWMAXIMIZED);
    m_DlgView1->InitialUpdateFrame(NULL,true);
    }void CMainFrame::OnMenuOpendlgview2()
    {
    // TODO: 在此添加命令处理程序代码
    if(m_DlgView2!=NULL)   //如果样式窗口1已经打开 激活他.否则动态创建样式窗口1.
    {
    m_DlgView2->MDIActivate();
    return;
    } m_DlgView2=new CChildFrame();
    CCreateContext context;
    context.m_pNewViewClass=RUNTIME_CLASS(CDlgView2);
    if(!m_DlgView2->LoadFrame(IDI_ICON2,WS_MAXIMIZE|WS_OVERLAPPEDWINDOW,this,&context))
    return;
    m_DlgView2->ShowWindow(SW_SHOWMAXIMIZED);
    m_DlgView2->InitialUpdateFrame(NULL,true);}
      

  9.   


    这个CDlgView1类和CDlgView2类是在MDI工程里添加了对话框  然后生成的类(把对话框的Border改成Thin  , style改成child)
    class CDlgView1 : public CFormView
    {
    DECLARE_DYNCREATE(CDlgView1)protected:
    CDlgView1();           // 动态创建所使用的受保护的构造函数
    virtual ~CDlgView1();public:
    enum { IDD = IDD_DIALOG1 };
    ************************************************BOOL CMODApp::InitInstance()
    {
    // 如果一个运行在 Windows XP 上的应用程序清单指定要
    // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
    //则需要 InitCommonControls()。否则,将无法创建窗口。
    InitCommonControls(); CWinApp::InitInstance(); // 初始化 OLE 库
    if (!AfxOleInit())
    {
    AfxMessageBox(IDP_OLE_INIT_FAILED);
    return FALSE;
    }
    AfxEnableControlContainer();
    // 标准初始化
    // 如果未使用这些功能并希望减小
    // 最终可执行文件的大小,则应移除下列
    // 不需要的特定初始化例程
    // 更改用于存储设置的注册表项
    // TODO: 应适当修改该字符串,
    // 例如修改为公司或组织名
    SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
    LoadStdProfileSettings(4);  // 加载标准 INI 文件选项(包括 MRU)
      // 创建主 MDI 框架窗口
    CMainFrame* pMainFrame = new CMainFrame;
    if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MODTYPE))
    return FALSE;
    m_pMainWnd = pMainFrame;
    // 仅当具有后缀时才调用 DragAcceptFiles
    //  在 MDI 应用程序中,这应在设置 m_pMainWnd 之后立即发生
    // 分析标准外壳命令、DDE、打开文件操作的命令行
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);
    // 调度在命令行中指定的命令。如果
    // 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
    if (!ProcessShellCommand(cmdInfo))
    return FALSE;
    // 主窗口已初始化,因此显示它并对其进行更新
    pMainFrame->ShowWindow(m_nCmdShow);
    pMainFrame->UpdateWindow();
    return TRUE;
    }++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++就这些了  其他都是默认的   在CDlgView1对应的对话框添加了一个按钮  然后想点这个按钮关闭这个对话框   怎么也关不掉   晕死~
      

  10.   

    OnlyHappy(说好不打脸) 
    代码已经发到你邮箱了  帮我关掉那个窗口啊  谢谢:)
    大虾们继续  原来以为自己还可以 米想到一个对话框都关不来_-##
      

  11.   

    不好意思。刚刚看到。已经搞好了。发到你email了。
      

  12.   

    晕哦  没收到你的信啊 
    [email protected]
    能麻烦再发一次吗 谢谢了
      

  13.   

    void CDlgView2::OnBnClickedOk()
    {
    // TODO: 在此添加控件通知处理程序代码
    GetParent()->SendMessage(WM_CLOSE);
    }
    现在能关掉了  可是  关掉后再打开  就有错误  到底什么问题呢  
    这样子程序不稳定啊
      

  14.   

    还以为你睡眠了呢。你的程序在主窗口中为ChildFrame保存为一个指针。这个指针dlgview1和另外一个对话框被关闭的时候没有重新被赋值。故出错。我重新改了一下。你查一下Email吧
      

  15.   

    你主窗口中有m_dlgView1 和m_dlgView2.这些值在窗口关闭的时候还是原来的值。这时重新打开的时候会访问他们。所以在你的DlgView1和DlgView2被关闭的时候。应该通知主窗口一下。主窗口接收到了消息后重新设置这2个指针为NULL。这时候就不会出现问题了。
      

  16.   

    可以结贴了  结帖前再能问个问题 _-##
    我的
    class CDlgView1 : public CFormView里的按钮事件为什么非要取得父窗口句柄才能关掉呢?
    GetParent()->SendMessage(WM_CLOSE);  这里取得的父句柄又代表哪个窗口呢?