windows-nt/Source/XPSP1/NT/printscan/ui/printui/asyncdlg.cxx
2020-09-26 16:20:57 +08:00

404 lines
6.2 KiB
C++

/*++
Copyright (C) Microsoft Corporation, 1997 - 1998
All rights reserved.
Module Name:
asyncdlg.cxx
Abstract:
Asynchronous Dialog.
Author:
Steve Kiraly (SteveKi) 10-Feb-1997
Revision History:
--*/
#include "precomp.hxx"
#pragma hdrstop
#include "asyncdlg.hxx"
/*++
Routine Name:
TAsyncDlg
Routine Description:
Asychronous dialog. This is a dialog which starts a
worker thread to do its work. Note because a thread
is started and this class is reference counted it must
be instantiated from the heap.
Arguments:
Nothing.
Return Value:
Nothing.
--*/
TAsyncDlg::
TAsyncDlg(
IN HWND hwnd,
IN TAsyncData *pData,
IN UINT uResourceId
) : _pData( pData ),
_hWnd( hwnd ),
_uResourceId( uResourceId ),
_bActive( FALSE )
{
DBGMSG( DBG_TRACE, ( "TAsyncDlg::ctor.\n" ) );
}
TAsyncDlg::
~TAsyncDlg(
VOID
)
{
DBGMSG( DBG_TRACE, ( "TAsyncDlg::dtor.\n" ) );
}
BOOL
TAsyncDlg::
bDoModal(
VOID
)
{
//
// Create a modal dialog.
//
return (BOOL)DialogBoxParam( ghInst,
MAKEINTRESOURCE( _uResourceId ),
_hWnd,
MGenericDialog::SetupDlgProc,
(LPARAM)this );
}
VOID
TAsyncDlg::
vSetTitle(
IN LPCTSTR pszTitle
)
{
if( pszTitle && *pszTitle )
{
//
// Update the dialog title.
//
TStatusB bStatus;
bStatus DBGCHK = _strTitle.bUpdate( pszTitle );
//
// If the window is currently active then post
// our special set title message.
//
if( _bActive )
{
PostMessage( _hDlg, WM_COMMAND, WM_APP, 0 );
}
}
}
BOOL
TAsyncDlg::
bIsActive(
VOID
) const
{
return _bActive;
}
BOOL
TAsyncDlg::
bHandle_InitDialog(
VOID
)
{
BOOL bRetval = FALSE;
//
// Indicate the dialog is active.
//
_bActive = TRUE;
//
// Start the animation.
//
HWND hwndAni = GetDlgItem( _hDlg, IDD_STATUS );
Animate_Open(hwndAni, MAKEINTRESOURCE( IDA_SEARCH ) );
Animate_Play(hwndAni, 0, -1, -1);
//
// Set the window title.
//
SetWindowText( _hDlg, _strTitle );
//
//
// Start the asynchronous thread.
//
bRetval = bStartAsyncThread();
if( !bRetval )
{
vTerminate( IDCANCEL );
}
return bRetval;
}
BOOL
TAsyncDlg::
bHandle_Destroy(
VOID
)
{
DBGMSG( DBG_TRACE, ( "TAsyncDlg::bHandle_Destroy.\n" ) );
Animate_Stop( GetDlgItem( _hDlg, IDD_STATUS ) );
_bActive = FALSE;
return TRUE;
}
BOOL
TAsyncDlg::
bHandleMessage(
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam
)
{
BOOL bStatus = TRUE;
switch( uMsg )
{
case WM_INITDIALOG:
bStatus = bHandle_InitDialog();
break;
case WM_COMMAND:
bStatus = bHandle_Command( GET_WM_COMMAND_ID( wParam, lParam ), wParam, lParam );
break;
case WM_DESTROY:
bStatus = bHandle_Destroy();
break;
default:
bStatus = FALSE;
break;
}
bStatus &= _pData->bHandleMessage( this, uMsg, wParam, lParam );
return bStatus;
}
/*++
Routine Name:
bHandle_Command
Routine Description:
Handles WM_COMMAND messages from the dialog
box procedure.
Arguments:
uMsg - Command message( control ID )
wParam - dialog procedure passed wParam
lParam - dialog procedure passed lParam
Return Value:
TRUE message handled, otherwise false.
--*/
BOOL
TAsyncDlg::
bHandle_Command(
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam
)
{
BOOL bStatus = TRUE;
switch( uMsg )
{
case IDOK:
case IDCANCEL:
EndDialog( _hDlg, uMsg );
break;
case IDC_CANCEL:
vTerminate( IDCANCEL );
break;
case WM_APP:
SetWindowText( _hDlg, _strTitle );
break;
default:
bStatus = FALSE;
break;
}
return bStatus;
}
/*++
Routine Name:
bRefZeroed
Routine Description:
Called when the reference count drops to zero.
Arguments:
Nothing.
Return Value:
Nothing.
--*/
VOID
TAsyncDlg::
vRefZeroed(
VOID
)
{
DBGMSG( DBG_TRACE, ( "TAsyncDlg::vRefZeroed.\n" ) );
//
// Since we are reference counting the printer data object
// we know that it is safe to delete ourselves now.
//
delete this;
}
VOID
TAsyncDlg::
vTerminate(
IN WPARAM wParam
)
{
PostMessage( _hDlg, WM_COMMAND, wParam, 0 );
}
BOOL
TAsyncDlg::
bStartAsyncThread(
VOID
)
{
BOOL bStatus = FALSE;
HANDLE hThread;
DWORD dwIgnore;
//
// Ensure we bump the reference count.
//
vIncRef();
//
// Create a save printui thread.
//
hThread = TSafeThread::Create( NULL,
0,
reinterpret_cast<LPTHREAD_START_ROUTINE>( iProc ),
this,
0,
&dwIgnore );
//
// Close the handle to the new thread if it was created.
//
if( hThread )
{
CloseHandle( hThread );
bStatus = TRUE;
}
return bStatus;
}
INT
TAsyncDlg::
iProc(
IN TAsyncDlg *pDlg
)
{
//
// Execute the callback.
//
pDlg->_pData->bAsyncWork( pDlg );
//
// Terminate the async dialog.
//
pDlg->vTerminate( IDOK );
//
// Release our reference to the async dialog.
//
pDlg->cDecRef();
return ERROR_SUCCESS;
}
/********************************************************************
TAsynchronous data class.
********************************************************************/
TAsyncData::
TAsyncData(
VOID
)
{
DBGMSG( DBG_TRACE, ( "TAsyncData::ctor.\n" ) );
}
TAsyncData::
~TAsyncData(
VOID
)
{
DBGMSG( DBG_TRACE, ( "TAsyncData::dtor.\n" ) );
}
BOOL
TAsyncData::
bHandleMessage(
IN TAsyncDlg *pDlg,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam
)
{
return FALSE;
}