115 lines
2.5 KiB
C++
115 lines
2.5 KiB
C++
/**********************************************************************/
|
|
/** Microsoft Windows/NT **/
|
|
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
MdlsDlg.cpp
|
|
The class to handle modelss dialog in the snapin
|
|
|
|
FILE HISTORY:
|
|
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
#include "modeless.h"
|
|
#include "MdlsDlg.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CModelessDlg dialog
|
|
|
|
|
|
CModelessDlg::CModelessDlg()
|
|
: CBaseDialog()
|
|
{
|
|
//{{AFX_DATA_INIT(CModelessDlg)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
|
|
m_hEventThreadKilled = ::CreateEvent(NULL, FALSE, FALSE, NULL);
|
|
Assert(m_hEventThreadKilled);
|
|
}
|
|
|
|
CModelessDlg::~CModelessDlg()
|
|
{
|
|
if (m_hEventThreadKilled)
|
|
::CloseHandle(m_hEventThreadKilled);
|
|
m_hEventThreadKilled = 0;
|
|
}
|
|
|
|
void CModelessDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CBaseDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CModelessDlg)
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CModelessDlg, CBaseDialog)
|
|
//{{AFX_MSG_MAP(CModelessDlg)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CModelessDlg message handlers
|
|
|
|
void CModelessDlg::OnOK()
|
|
{
|
|
DestroyWindow();
|
|
|
|
// Explicitly kill this thread.
|
|
AfxPostQuitMessage(0);
|
|
}
|
|
|
|
|
|
void CModelessDlg::OnCancel()
|
|
{
|
|
DestroyWindow();
|
|
|
|
// Explicitly kill this thread.
|
|
AfxPostQuitMessage(0);
|
|
}
|
|
|
|
|
|
void CreateModelessDlg(CModelessDlg * pDlg,
|
|
HWND hWndParent,
|
|
UINT nIDD)
|
|
{
|
|
ModelessThread * pMT;
|
|
|
|
// If the dialog is still up, don't create a new one
|
|
if (pDlg->GetSafeHwnd())
|
|
{
|
|
::SetActiveWindow(pDlg->GetSafeHwnd());
|
|
return;
|
|
}
|
|
|
|
pMT = new ModelessThread(hWndParent,
|
|
nIDD,
|
|
pDlg->GetSignalEvent(),
|
|
pDlg);
|
|
pMT->CreateThread();
|
|
}
|
|
|
|
void WaitForModelessDlgClose(CModelessDlg *pDlg)
|
|
{
|
|
if (pDlg->GetSafeHwnd())
|
|
{
|
|
// Post a cancel to that window
|
|
// Do an explicit post so that it executes on the other thread
|
|
pDlg->PostMessage(WM_COMMAND, IDCANCEL, 0);
|
|
|
|
// Now we need to wait for the event to be signalled so that
|
|
// its memory can be cleaned up
|
|
WaitForSingleObject(pDlg->GetSignalEvent(), INFINITE);
|
|
}
|
|
|
|
}
|
|
|