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);
}
下面是源码。
父对话框:#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);
}
解决方案 »
- SDK自定义消息如何传递参数??
- 水晶报表中的图表中,最左侧标识数量的那一列数怎样更改数字的样式呢?想改一下精确度显示
- 对话框工程中如何检测鼠标离开窗体的事件?
- 常见到的一些 .C 文件怎么在 VC 做的工程中使用
- 得到了内嵌在页面中的一个IHTMLFrameElement的接口指针,现在想得到里面Form并且附值,该怎么做??大家帮忙。。。
- VC里有没有这样的实现?
- 各位学VC的朋友,进一步怎么提高?
- 请大家帮我看看这个指针的问题
- 图像的水平镜像不需要临时变量储存像素值么?
- 高分求解?如何获取另一个应用程序的命令行参数?
- 请教各位高手,HUGE_VAL是什么意思啊?
- 串口通信中用到读取串口收到的数据前使用PurgeComm
造成你说的问题的主要原因是,在创建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联系吧