windows-nt/Source/XPSP1/NT/admin/pchealth/sr/shell/rstrprog.cpp
2020-09-26 16:20:57 +08:00

256 lines
6.3 KiB
C++

/******************************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name:
rstrprog.cpp
Abstract:
This file contains the implementation of the CRstrProgress class, which
wraps Progress Bar control from the Common Control.
Revision History:
Seong Kook Khang (SKKhang) 10/08/99
created
******************************************************************************/
#include "stdwin.h"
#include "stdatl.h"
#include "resource.h"
#include "rstrpriv.h"
#include "srui_htm.h"
#include "rstrprog.h"
#ifndef WS_EX_LAYOUTRTL
#define WS_EX_NOINHERITLAYOUT 0x00100000L // Disable inheritence of mirroring by children
#define WS_EX_LAYOUTRTL 0x00400000L // Right to left mirroring
#endif /* WS_EX_LAYOUTRTL */
/////////////////////////////////////////////////////////////////////////////
//
// CRstrProgress
//
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CRstrProgress message handlers
LRESULT
CRstrProgress::OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
TraceFunctEnter("CRstrProgress::OnSetFocus");
LRESULT lRes = CComControl<CRstrProgress>::OnSetFocus(uMsg, wParam, lParam, bHandled);
if (m_bInPlaceActive)
{
DoVerbUIActivate(&m_rcPos, NULL);
if(!IsChild(::GetFocus()))
m_cCtrl.SetFocus();
}
TraceFunctLeave();
return lRes;
}
LRESULT
CRstrProgress::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
TraceFunctEnter("CRstrProgress::OnCreate");
RECT rc;
WORD wLangId ;
GetWindowRect(&rc);
rc.right -= rc.left;
rc.bottom -= rc.top;
rc.top = rc.left = 0;
//
// Based on language change method of creating the progress bar
//
wLangId = GetDefaultUILang();
if ( PRIMARYLANGID(wLangId) == LANG_ARABIC ||
PRIMARYLANGID(wLangId) == LANG_HEBREW )
{
m_cCtrl.Create(m_hWnd, rc, NULL,
WS_BORDER | WS_CHILD | WS_VISIBLE | PBS_SMOOTH,
WS_EX_LAYOUTRTL, IDC_PROGRESS);
}
else
{
m_cCtrl.Create(m_hWnd, rc, NULL,
WS_BORDER | WS_CHILD | WS_VISIBLE | PBS_SMOOTH,
0, IDC_PROGRESS);
};
Fire_OnCreate();
TraceFunctLeave();
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CRstrProgress - IOleInPlaceObject methods
STDMETHODIMP
CRstrProgress::SetObjectRects( LPCRECT prcPos, LPCRECT prcClip )
{
TraceFunctEnter("CRstrProgress::SetObjectRects");
IOleInPlaceObjectWindowlessImpl<CRstrProgress>::SetObjectRects(prcPos, prcClip);
int cx, cy;
cx = prcPos->right - prcPos->left;
cy = prcPos->bottom - prcPos->top;
::SetWindowPos(m_cCtrl.m_hWnd, NULL, 0,
0, cx, cy, SWP_NOZORDER | SWP_NOACTIVATE);
TraceFunctLeave();
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////
// CRstrProgress - IRstrProgress properties
STDMETHODIMP
CRstrProgress::get_hWnd( OLE_HANDLE *phWnd )
{
TraceFunctEnter("CRstrProgress::get_hWnd");
HRESULT hr = S_OK;
VALIDATE_INPUT_ARGUMENT(phWnd);
*phWnd = (OLE_HANDLE)m_cCtrl.m_hWnd;
Exit:
TraceFunctLeave();
return( hr );
}
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CRstrProgress::put_Max( long lMax )
{
TraceFunctEnter("CRstrProgress::put_Max");
long lMin = m_cCtrl.SendMessage( PBM_GETRANGE, TRUE, NULL );
m_cCtrl.SendMessage( PBM_SETRANGE32, lMin, lMax );
TraceFunctLeave();
return( S_OK );
}
STDMETHODIMP
CRstrProgress::get_Max( long *plMax )
{
TraceFunctEnter("CRstrProgress::get_Max");
HRESULT hr = S_OK;
VALIDATE_INPUT_ARGUMENT(plMax);
*plMax = m_cCtrl.SendMessage( PBM_GETRANGE, FALSE, NULL );
Exit:
TraceFunctLeave();
return( hr );
}
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CRstrProgress::put_Min( long lMin )
{
TraceFunctEnter("CRstrProgress::put_Min");
long lMax = m_cCtrl.SendMessage( PBM_GETRANGE, FALSE, NULL );
m_cCtrl.SendMessage( PBM_SETRANGE32, lMin, lMax );
TraceFunctLeave();
return( S_OK );
}
STDMETHODIMP
CRstrProgress::get_Min( long *plMin )
{
TraceFunctEnter("CRstrProgress::get_Min");
HRESULT hr = S_OK;
VALIDATE_INPUT_ARGUMENT(plMin);
*plMin = m_cCtrl.SendMessage( PBM_GETRANGE, TRUE, NULL );
Exit:
TraceFunctLeave();
return( hr );
}
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CRstrProgress::put_Value( long lValue )
{
TraceFunctEnter("CRstrProgress::put_Value");
m_cCtrl.SendMessage( PBM_SETPOS, lValue, 0 );
TraceFunctLeave();
return( S_OK );
}
STDMETHODIMP
CRstrProgress::get_Value( long *plValue )
{
TraceFunctEnter("CRstrProgress::get_Value");
HRESULT hr = S_OK;
VALIDATE_INPUT_ARGUMENT(plValue);
*plValue = m_cCtrl.SendMessage( PBM_GETPOS, 0, 0 );
Exit:
TraceFunctLeave();
return( hr );
}
/////////////////////////////////////////////////////////////////////////////
// CRstrProgress - IRstrProgress methods
/////////////////////////////////////////////////////////////////////////////
// CRstrProgress - DRstrProgressEvents firing methods
STDMETHODIMP
CRstrProgress::Fire_OnCreate()
{
TraceFunctEnter("CRstrProgress::Fire_OnCreate");
HRESULT hr = S_OK ;
CComPtr<IDispatch> pDispatch;
DISPPARAMS dpArgs = { NULL, NULL, 0, 0 };
Lock();
IUnknown **ppUnk = m_vec.begin();
while ( ppUnk < m_vec.end() )
{
if ( *ppUnk != NULL )
{
pDispatch = reinterpret_cast<IDispatch*>(*ppUnk);
hr = pDispatch->Invoke( 1, // DISPID_DRSTRCALENDAREVENTS_ONCREATE
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_METHOD,
&dpArgs,
NULL,
NULL,
NULL );
DebugTrace(TRACE_ID, "Invoke returned %d", hr);
}
ppUnk++;
}
Unlock();
TraceFunctLeave();
return( hr );
}
// end of file