vc,模式子对话框关闭时,主对话框也随之关闭,怎样才能不使它关闭,你们遇到过这种情况没?郁闷死我了。找了一下午也没找出来。 
下面是源码。
父对话框:#include "stdafx.h"
BEGIN_MESSAGE_MAP(CMainwnd, CDialog)
//{{AFX_MSG_MAP(CMainwnd)
ON_WM_PAINT()
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_PRINT, OnPrint)
ON_BN_CLICKED(IDC_manage, Onmanage)
ON_BN_CLICKED(IDC_EXIT, OnExit)
ON_NOTIFY(NM_CLICK, IDC_MALIST, OnClickMalist)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CMainwnd message handlers
CListCtrl   *m_combobox;
CStatic *m_pic;
CStatic *m_Ppic;
CStatic *m_name;
CListCtrl  *m_pdate;
CStatic *m_date;
CButton *m_add;
CButton *m_del;
CButton *m_exit;
CStatic *m_all;
CStatic *m_dpic;
CMapStringToString map;
BOOL CMainwnd::OnInitDialog() 
{
CDialog::OnInitDialog();
GetOLDpic();           //驾驶员数据初始化
GetDateWG();            //违规数据初始化
//4.16日    下次调整上面初始化  太乱。
return TRUE;  }
void CMainwnd::ChangeRGB(CRect rect,CDC *dc)
{
pen.CreatePen(PS_SOLID,1,RGB(192,192,192));
dc->SelectObject(&pen);
dc->Rectangle(CRect(rect.top+8,rect.left+8,rect.right-8,rect.bottom-8));
dc->FillRect(CRect(rect.top+10,rect.left+10,rect.right-10,rect.bottom-10),&m_Framebrush);
        pen.DeleteObject();
}void CMainwnd::OnPaint() 
{
CPaintDC dc(this); // device context for painting
  
GetClientRect(&FrameSize); 
    CBitmap memBitmap;
CBitmap* pOldBmp = NULL;
memDC.CreateCompatibleDC(&dc);
memBitmap.CreateCompatibleBitmap(&dc,FrameSize.right,FrameSize.bottom);
pOldBmp = memDC.SelectObject(&memBitmap);
memDC.BitBlt(FrameSize.left,FrameSize.top,FrameSize.right,FrameSize.bottom,&dc,0,0,SRCCOPY);
    DrawBG(&memDC);

    dc.BitBlt(FrameSize.left,FrameSize.top,FrameSize.right,FrameSize.bottom,&memDC,0,0,SRCCOPY); memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
memBitmap.DeleteObject();
BitPic(IDC_PPIC,PilotPot); m_combobox->Invalidate();}HBRUSH CMainwnd::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    if (nCtlColor==CTLCOLOR_DLG)
    {  
return m_DlgBrush;
}
if (nCtlColor==CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT); 
return m_Framebrush;
}
return hbr;
}void CMainwnd::DrawBG(CDC *pDC)
{
   ChangeRGB(CRect(FrameSize.top,FrameSize.left*0.35,FrameSize.right*0.35,FrameSize.bottom),pDC);
   ChangeRGB(CRect(FrameSize.left*0.35,FrameSize.left+FrameSize.Width()*0.35-5,FrameSize.right,FrameSize.right*0.35),pDC);
   ChangeRGB(CRect(FrameSize.left+FrameSize.Height()*0.46,FrameSize.left+FrameSize.Width()*0.35-5,FrameSize.right,FrameSize.bottom),pDC);
} void CMainwnd::OnPrint() 
{
CPrintClass dlg;
dlg.DoModal();
}void CMainwnd::BitPic(UINT nId,CString str)
{
CRect rect;
CWnd* pWnd = GetDlgItem(nId); 
pWnd->GetClientRect(&rect);
CDC *pDC=pWnd->GetDC();
CBitmap  pBitmap; 
CDC dcCompatible;
HBITMAP   hBitmap;
hBitmap=(HBITMAP)LoadImage(NULL,_T (str),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);    
pBitmap.Attach(hBitmap);   
BITMAP   bm;   
GetObject(pBitmap,sizeof(BITMAP),&bm);   
int m_nHeight=bm.bmHeight;   
int m_nWidth=bm.bmWidth;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&pBitmap); pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,m_nWidth,m_nHeight,SRCCOPY);
}void CMainwnd::Onmanage() 
{
      CManage dlg;
this->OnCancel();
dlg.DoModal();
}void CMainwnd::OnExit() 
{
if (IDOK==MessageBox("是否退出?","系统提示",MB_OK|MB_OKCANCEL))
{
  this->OnCancel();
}}void CMainwnd::GetOLDpic()                  //数据初始化
{ rst->Close();
}void CMainwnd::GetDateWG()
{


}
rst2->Close();
rst->Close();

}
子对话框:CPrintClass::CPrintClass(CWnd* pParent /*=NULL*/)
: CDialog(CPrintClass::IDD, pParent)
{
//{{AFX_DATA_INIT(CPrintClass)
m_Str = _T("    本程序主要演示如何在对话框中使用只有在文档-视图模型中才能使用的打印预览功能,其实本程序也使用了一个没有文档类的文档-视图结构来间接完成打印预工作的,但我们在使用时基本感觉不到它的存在。\r\n    在实际使用中可将文档-视图部分编制成扩展动态链接库,我就是这样做的,编制打印程序时使用起来非常方便。");
m_FontSize = 0;
m_FontName =  0;
//}}AFX_DATA_INIT
}
void CPrintClass::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPrintClass)
DDX_Control(pDX, IDC_COMBO1, m_FontList);
DDX_Text(pDX, IDC_EDIT1, m_Str);
DDX_Text(pDX, IDC_EDIT_FONTSIZE, m_FontSize);
DDX_CBIndex(pDX, IDC_COMBO1, m_FontName);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPrintClass, CDialog)
//{{AFX_MSG_MAP(CPrintClass)
ON_BN_CLICKED(IDC_BUTTON1, OnPrintpis)
ON_BN_CLICKED(IDC_BUTTON3, OnPrintSee)
ON_BN_CLICKED(IDC_BUTTON2, OnNowPrint)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CPrintClass message handlersvoid CPrintClass::OnPrintpis()            //这是关闭按钮
{
m_PreFrame=NULL;
    this->OnCancel();
}
为什么一关子窗口父窗口也关了。怎么办呀。大家给我想想办法 。。

void Drawf(CDC* pDC,CPrintInfo* pInfo,void* pVoid)
{
((CPrintClass*)pVoid)->OnPrint(pDC,pInfo);
}void CPrintClass::OnPrint(CDC *pDC, CPrintInfo *pInfo)
{}void CPrintClass::OnPrintSee() 
{
m_PreFrame = new CMainFrame(Drawf,this,this,FALSE);
m_PreFrame->ShowWindow(SW_SHOW);
m_PreFrame->UpdateWindow();
}void CPrintClass::OnNowPrint() 
{
m_PreFrame = new CMainFrame(Drawf,this,this,TRUE);

}

解决方案 »

  1.   

    这个问题我遇到过,你的这个对话框中创建打印预览窗口的例子不知道是否是从网上下载的。
    造成你说的问题的主要原因是,在创建CPrintClass类时,它将程序主函数CXXApp.m_pMainWnd改成了预览对话框的指针m_PreFrame,当你退出打印预览窗口时,由于m_pMainWnd所指窗口已经销毁,整个程序也就退出了。
    而此时你真正的主窗口,也就是你所说的父窗口(甚至是父窗口的父窗口)由于不再是m_pMainWnd所指窗口,就被一起关闭了。
    不知道我这么说,你是否清楚。你可以自己跟踪以下程序运行过程中,CXXApp.m_pMainWnd指针的变化情况。
    这算是原来那个程序的一个bug.解决办法:自己编一个函数,负责在预览窗口创建和销毁前后,及时修改CXXApp.m_pMainWnd指针就是了。
    我实现的方法是在CXXApp里面添加了两个指针和两个函数
    CWnd * pMainDlg;//存放真正的主对话框指针
    CWnd *pMyWnd;//存放预览窗口指针
    void ChangeFrameToDlg();//将m_pMainWnd指向真正的主对话框
    void ChangeFrameToWnd();//将m_pMainWnd指向预览窗口指针
    函数实现
    void CXXApp::ChangeFrameToWnd()
    {
    m_pMainWnd=pMyWnd;
    }
    void CXXApp::ChangeFrameToDlg()
    {
    m_pMainWnd=pMainDlg;
    }
    ////////////////////////////////////
    使用时
    在创建打印窗口时执行
    ((CXXApp*)AfxGetApp())->pMyWnd = m_PreFrame;
    ((CXXApp*)AfxGetApp())->ChangeFrameToWnd();
    打印窗口结束时执行
    pApp->m_pMainWnd=pf->pOldWnd;
            ((CXXApp*)AfxGetApp())->ChangeFrameToDlg();////////////////////////////////////////////////////////////////
    上面写的代码只能说明主要的思路和方法,不可能直接拷贝到你的代码中就解决问题,
    如果你对VC足够熟悉,上面的文字足够你解决问题,如果你还是解决不了问题,
    [email protected]
    email联系吧