我想在对话框应用程序中打开对话框后,自动关闭对话框,但这段代码没有实现我的要求


我的代码如下:
BOOL CTESTApp::InitInstance()
{
AfxEnableControlContainer();

// Standard initialization
// If you are not using these features and wish to reduce the size
//  of your final executable, you should remove from the following
//  the specific initialization routines you do not need.

#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif

CTESTDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
dlg.SendMessage(WM_CLOSE,0,0);
return FALSE;
}
这段代码要怎么改,才能实现我的要求?

10 个解决方案

#1


不太明白你这样做的目的,虽然你的想法可以实现,但对话框一打开就关闭,程序就退出来了。这样的程序有什么用?
dlg.DoModal(即模态显示对话框)后程序是在对话框控制,只有对话框关闭后才返回,返回后才执行下一句dlg.SendMessage,所以你的程序不满足你的要求。
理论上要实现你的想法可以创建非模块的对话框并显示,然后用发消息关闭对话框。麻烦一点的用多线程估计也可以实现。

#2


在CTESTDlg类中用SetTimer和KillTimer,可以比较方便的实现

#3


同意fengqinggao(风清高) 的,在CTESTDlg中实现!

#4


多谢两位给了我新的思路
我只是把我的要求简化成大家容易拿出解决代码,我也容易理解的情况
我的应用是做一个复制文件的应用程序,主程序弹出一个提示对话框提示
用户等待,然后主程序开始复制文件,复制完成后,发消息给先前弹出的
对话框,让它关闭。
请问wenzhousun,怎么创建非模式对话框,请就着上面那段程序中添加,这样
我一试就可以了,也容易理解
主要是复制文件时间不一定,因为文件长度不固定

#5


CTipDlg dlg;
dlg.Create(CTipDlg::IDD, NULL);
dlg.ShowWindow(SW_SHOW);
........//拷贝文件代码
dlg.ShowWindow(SW_HIDE);//或dlg.EndDialog(0);
(以上程序可能导致dlg界面得不到刷新。)

#6


如果是那样,还是开线程,做一个进度条比较好,当然,楼上的方法是可行的

#7


#define ID_COPYFILE 1001
#define ID_CLOSEWIN 1002

BOOL CAutoCloseWinDlg::OnInitDialog()
{
  ...
  SetTimer( ID_COPYFILE, 10, NULL );
  m_Progress1.SetRange( 0, 100 );
  m_Progress1.SetPos( 1 );
  return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

void CAutoCloseWinDlg::OnTimer(UINT nIDEvent)
{
  // TODO: 在此添加消息处理程序代码和/或调用默认值
  switch( nIDEvent ) {
  case ID_COPYFILE:
    FileCopy( "cc", "dd" );
    SetTimer( ID_CLOSEWIN, 10, NULL );
    break;
  case ID_CLOSEWIN:
    DestroyWindow();
    break;
  }

  CDialog::OnTimer(nIDEvent);
}

BOOL CAutoCloseWinDlg::FileCopy( const CString SourcePath, const CString DestPath )
{
  if( SourcePath.IsEmpty() && DestPath.IsEmpty() )
    return FALSE;
  int Min = 0, Max = 0;
  m_Progress1.SetStep( 10 );
  m_Progress1.GetRange( Min, Max ); 
  for( int ii = Min; ii < Max; ii++ ) {
    m_Progress1.SetPos( ii + 10 );
    Sleep( 100 );
  }

  return TRUE;
}

当然我这里没有写真的copy file 你自己改一下,  你最好以多程序方式调用它.

#8


To fengqinggao(风清高)
有没有线程实现的简单代码,我有几个进度条的例子是用线程实现的,但是其他代码太多,有很多
类文件,不方便提取出来,你能不能就着上面这段代码给改一下

#9


一个类就可以实现啊,如果还需要,请发信至fqg76@163.com,注明要进度条即可

#10


已经发送,请查收,:)

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号