VC在VIEW窗口中显示和关闭对话框的问题

阿童木1999 2018-11-02 07:40:13
在一个有检测功能VIEW窗中,当检测完毕想自动弹出一个对话框,来显示检测完成的信息。
因为每次检测完成的信息都不同,所以每次窗口在弹出前必须重新初始化并做对应的赋值操作。
现在是用Cxxdlg dlg; dlg.DoModal()来实现测试完成后弹窗,功能已没有问题。
但我想在每次检测之前,自动关闭这个dlg,并且在测试完成dlg自动显示后,仍可对VIEW窗口操作。
目前必须关闭dlg才可操作,可能是模态对话框的原因。
希望论坛各位朋友帮忙看看,谢谢。大概框架如下
CViewxx::Test()
if(dlg窗口已显示)
{
关闭窗口;
}
{
执行测试;
}
{
重新显示dlg窗口;
}
...全文
148 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2018-11-05
  • 打赏
  • 举报
回复
试试 DestroyWindow后 RedrawWindow 或 UpdateWindow 强制刷新
阿童木1999 2018-11-04
  • 打赏
  • 举报
回复
引用 15 楼 schlafenhamster 的回复:

我目前使用指针,每次显示之前 new一个对话框,功能已实现。
在测试之前,先判断m_pdlg是否已创建,如果创建先DestoryWindow再 delete m_pDlg;
在析构函数里面,也加了这个判断,请问这样对吗?
还有一个问题,对话框显示后,如果马上继续执行测试,可能是对话框还没来得及消失,对话框会和底下的VIEW窗口混在一起,重叠显示,就像卡死了一样,非常难看。有没有办法,让对话框在测试之前完全消失呢?谢谢。
阿童木1999 2018-11-03
  • 打赏
  • 举报
回复
引用 12 楼 schlafenhamster 的回复:
放在VIEW类内 ?
说的是 头文件 ?

#include “ViewBlock.h”

是的,没错,加了#include “ViewBlock.h”
包含CViewBlock对象就报这个错误,指针就可以。
schlafenhamster 2018-11-03
  • 打赏
  • 举报
回复
放在VIEW类内 ?
说的是 头文件 ?

#include “ViewBlock.h”
阿童木1999 2018-11-03
  • 打赏
  • 举报
回复
引用 10 楼 andylau819 的回复:
[quote=引用 8 楼 schlafenhamster 的回复:]
头文件 中 CNoModeDlg m_Dlg;// 在头文件
表示 构造一个 对话框 。(创建 窗口 的 第一步)

m_Dlg.Create(IDD_DIALOG1); (创建 窗口 的 第二步)

这是一个 非 模态 对话框 ,自己 不带 消息环 !

请教一下,按您的方式,将对话框的对象放在VIEW类内,但提示以下错误,是什么原因呀?在VIEW的CPP文件中,则没问题。
我在VIEW头文件中已经加了声明,也加了class CViewBlock;

: error C2079: 'm_dlg' uses undefined class 'CViewBlock'[/quote]

好像只能定义对话框的指针,在构造时先赋值为NULL,每次显示之前,都要new CxxDlg,再Create,然后就是showWindow?这个流程对吗?
一直用一个对象好像不行呀?如果用指针,在哪里析构比较好啊?谢谢。
阿童木1999 2018-11-03
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
头文件 中 CNoModeDlg m_Dlg;// 在头文件
表示 构造一个 对话框 。(创建 窗口 的 第一步)

m_Dlg.Create(IDD_DIALOG1); (创建 窗口 的 第二步)

这是一个 非 模态 对话框 ,自己 不带 消息环 !

请教一下,按您的方式,将对话框的对象放在VIEW类内,但提示以下错误,是什么原因呀?在VIEW的CPP文件中,则没问题。
我在VIEW头文件中已经加了声明,也加了class CViewBlock;

: error C2079: 'm_dlg' uses undefined class 'CViewBlock'
schlafenhamster 2018-11-03
  • 打赏
  • 举报
回复
schlafenhamster 2018-11-03
  • 打赏
  • 举报
回复

#include "NoModeDlg.h"

class CMainFrame : public CFrameWnd
{

protected: // create from serialization only
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMainFrame)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
protected:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CMainFrame();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif

protected: // control bar embedded members
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
CNoModeDlg m_Dlg;
// distance bw. frame and dlg
int m_distx;
int m_disty;
//
// CButton m_btShowDlg;

// Generated message map functions
protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnMove(int x, int y);
afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point);
afx_msg void OnButton32772();
afx_msg void OnUpdateButton32772(CCmdUI* pCmdUI);
afx_msg void OnUpdateAppAbout(CCmdUI* pCmdUI);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnNcRButtonDown(UINT nHitTest, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};


void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(IsWindow(m_Dlg.m_hWnd)) m_Dlg.DestroyWindow();
//
m_Dlg.Create(IDD_DIALOG1);

CRect rc;
m_Dlg.GetWindowRect(&rc);
CPoint pt=point;
// ClientToScreen(&pt);// only in view;
m_Dlg.MoveWindow(pt.x-10,pt.y-10,rc.Width(),rc.Height());
m_Dlg.ShowWindow(SW_SHOW);
m_Dlg.SendMessage(WM_SYSCOMMAND,0xF012,0);// SC_DRAGMOVE = 0xF012
//
CFrameWnd::OnLButtonDown(nFlags, point);
}

放 CMainFrame 里
schlafenhamster 2018-11-02
  • 打赏
  • 举报
回复
CNoModeDlg m_Dlg;// 在头文件
/////
检测之前,关闭这个dlg if(m_Dlg.IsWindow() ) m_Dlg.DestroyWindow ();
CWnd::DestroyWindow
virtual BOOL DestroyWindow( );
Return Value
Nonzero if the window is destroyed; otherwise 0.
/////
检测完毕, 弹出一个对话框
m_Dlg.Create(IDD_DIALOG1);// 需要时
/////
CDialog::Create
BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );
BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );
Return Value
Both forms return nonzero if dialog-box creation and initialization were successful; otherwise 0.

zgl7903 2018-11-02
  • 打赏
  • 举报
回复
检查 .m_hWnd 就可以, m_hWnd 空就表示没对话框没有被创建或已经被销毁
阿童木1999 2018-11-02
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903的回复:
再次启动检测如果是菜单之类的操作,还是可能非模态的比较好, 模态的本身已经阻塞了父窗口的消息环
非模态的 用 Create 和 DestroyWindow
如果使用非模态对话框,是不是先将该对话框的指针作为类的成员,在构造函数内赋值为null。在show之前每次都new一个dlg,在检测之前如果发现dlg已经存在,先delete掉?是不是最后在析构函数内,如果发现dlg不为空,也要delete一次?这样会不会浪费资源呢?烦请赐教,谢谢。
zgl7903 2018-11-02
  • 打赏
  • 举报
回复
再次启动检测如果是菜单之类的操作,还是可能非模态的比较好, 模态的本身已经阻塞了父窗口的消息环
非模态的 用 Create 和 DestroyWindow
zgl7903 2018-11-02
  • 打赏
  • 举报
回复
模态对话框 可以用 EndDialog
m_dlg.EndDialog(IDOK);
worldy 2018-11-02
  • 打赏
  • 举报
回复
“测试完成dlg自动显示后,仍可对VIEW窗口操作”这样的要求不能使用domodal,要使用showwindow,否则View不能继续操作
schlafenhamster 2018-11-02
  • 打赏
  • 举报
回复
头文件 中 CNoModeDlg m_Dlg;// 在头文件
表示 构造一个 对话框 。(创建 窗口 的 第一步)

m_Dlg.Create(IDD_DIALOG1); (创建 窗口 的 第二步)

这是一个 非 模态 对话框 ,自己 不带 消息环 !
zgl7903 2018-11-02
  • 打赏
  • 举报
回复
Create的对话框 不会自动消失, 调用DestroyWindow关闭对话框
阿童木1999 2018-11-02
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster的回复:
CNoModeDlg m_Dlg;// 在头文件
/////
检测之前,关闭这个dlg if(m_Dlg.IsWindow() ) m_Dlg.DestroyWindow ();
CWnd::DestroyWindow
virtual BOOL DestroyWindow( );
Return Value
Nonzero if the window is destroyed; otherwise 0.
/////
检测完毕, 弹出一个对话框
m_Dlg.Create(IDD_DIALOG1);// 需要时
/////
CDialog::Create
BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );
BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );
Return Value
Both forms return nonzero if dialog-box creation and initialization were successful; otherwise 0.
用这种方式,这个对话框显示后会马上消失吧?没法一直显示?我需要在下次销毁这个对话框之前,要能一直显示,除非用户手动点ok或取消。谢谢。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧