Re: How to DoModal a CDialog initially invisible
David Ching wrote:
"Dansk" <dansk@laouilest.com> wrote in message
news:uHyeUyooHHA.4552@TK2MSFTNGP04.phx.gbl...
Hi all,
Under specific circunstances, I need to start my dialog-based app
invisible.
Make a hidden window the main window of your app, not the dialog:
CYourApp::InitInstance()
{
...
CMainWnd *pMainWnd = new CMainWnd;
if ( !pMainWnd->Init() )
return FALSE;
m_pMainWnd = pMainWnd;
return TRUE;
}
where
//// [mainwnd.h]
class CMainWnd : public CFrameWnd
{
public:
CMainWnd();
BOOL Init();
protected:
virtual ~CMainWnd();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMainWnd)
protected:
//}}AFX_VIRTUAL
// Generated message map functions
protected:
//{{AFX_MSG(CMainWnd)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}
//// [mainwnd.cpp]
CMainWnd::CMainWnd()
{
}
CMainWnd::~CMainWnd()
{
}
BOOL CMainWnd::Init()
{
CRect rcWnd (0, 0, 1, 1); // can be anything because window is hidden
if (!CreateEx (0, AfxRegisterWndClass(0), NULL, WS_POPUP, rcWnd, NULL,
0))
return FALSE;
return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
//{{AFX_MSG_MAP(CMainWnd)
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// CMainWnd message handlers
int CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
But, how does the user make your dialog visible? In my programs,
CMainWnd::OnCreate() creates a tray icon. When the user double-clicks the
icon, CMainWnd gets a message, then shows the modal dialog. You could adapt
this to have CMainWnd show your dialog under applicable circumstances.
-- David
Thanks for your answer.
First, I answer your question.
The dialog has a number of tasks to do.
The tasks are in an array.
If there is only one task to do, I need the dialog to be invisible and
will display a messagebox telling that the tasks ended when ... the task
ends.
If there is more than one task in the array, then I need the dialog to
be visible and it shows the progress of each task.
Tasks are managed in a worker thread (could be member of the dialog or
not, I don't mind)
It can happen that the program starts with only one task (invisible),
but, while executing that task, another one is added to the tasks array.
Then, I want the dialog to appear.
Am I clear enough?
Thank you for the code you kindly suggested, it will be a great help.
Instead of creating an intermediate CFrameWnd, do you think I can
directly call CDialog::Create?
--
Dansk