#ifndef __standrd_h__ #define __standrd_h__ // Useful macros #ifndef TRACENOTIMPL #define TRACENOTIMPL(funcname) TRACE_OUT((_T("%s not implemented.\n"), funcname)); hr = E_NOTIMPL #endif #define CONSTANT( x ) enum{ x } #define CASERET(x) case x: return _T(#x) #define ClearStruct(lpv) ZeroMemory((LPVOID) (lpv), sizeof(*(lpv))) #ifndef STRING_RESOURCE_MODULE # define STRING_RESOURCE_MODULE _Module.GetModuleInstance() #endif typedef struct _tagCol { UINT dwWidth; LPTSTR lpsz; } COL; typedef COL * LPCOL; inline LPTSTR CopyLPCTSTR( LPCTSTR sz ) { LPTSTR newString = new TCHAR[ lstrlen( sz ) + 1 ]; if( !lstrcpy( newString, sz ) ) { // Somethnig fialide delete [] newString; newString = NULL; } return newString; } #ifndef CchMax #define CchMax(pcsz) (sizeof(pcsz) / sizeof((pcsz)[0])) #endif // CchMax #define MAX_RESOURCE_STRING_LEN 256 /* C O N V E R T S Z C H */ /*------------------------------------------------------------------------- %%Function: ConvertSzCh Replace every instance of chSrc to chDest in the string -------------------------------------------------------------------------*/ inline VOID ConvertSzCh(LPTSTR psz, TCHAR chSrc, TCHAR chDest) { while (_T('\0') != *psz) { if (chSrc == *psz) { *psz = chDest; psz++; } else { psz = CharNext(psz); } } } inline VOID ConvertSzCh(LPTSTR psz, TCHAR chSrc = _T('|'), TCHAR chDest = _T('\0')); inline HRESULT NmCtlLoadString(UINT id, LPTSTR lpsz, UINT cch) { HRESULT hr = S_OK; if( NULL != STRING_RESOURCE_MODULE ) { if( NULL != lpsz ) { if (0 == ::LoadString(STRING_RESOURCE_MODULE, id, lpsz, cch)) { ERROR_OUT(("*** Resource %d does not exist", id)); *lpsz = _T('\0'); hr = HRESULT_FROM_WIN32( ::GetLastError() ); } } else { ERROR_OUT(("LoadString passed an empty buffer")); hr = E_INVALIDARG; } } else { ERROR_OUT(("LoadString could not find the module")); hr = E_UNEXPECTED; } return hr; } /////////////////////////////////////////////////////////////////////////////////////////////////////////// // this works if you have a member variable CComBSTR m_bstrProp ( substitute Prop for the Prop param ) // Example: // // CComBSTR m_bstrName; // // // DECLARE_CCOMBSTR_PROPPUT( Name, DISPID_PROP_NAME ); // DECLARE_CCOMBSTR_PROPGET( Name ); // #define DECLARE_CCOMBSTR_PROPPUT( Prop, PROP_DISPID ) \ STDMETHOD(put_##Prop)( BSTR newVal ) \ {\ HRESULT hr = S_OK;\ if( S_OK == __ATL_PROP_NOTIFY_EVENT_CLASS::FireOnRequestEdit(GetUnknown(), PROP_DISPID) )\ {\ m_bstr##Prop = newVal;\ hr = __ATL_PROP_NOTIFY_EVENT_CLASS::FireOnChanged(GetUnknown(), PROP_DISPID);\ }\ return hr; \ } #define DECLARE_CCOMBSTR_PROPGET( Prop ) \ STDMETHOD(get_##Prop)( BSTR *pVal ) \ {\ if( pVal )\ {\ *pVal = m_bstr##Prop.Copy();\ }\ else\ {\ return E_POINTER;\ }\ return S_OK;\ } /////////////////////////////////////////////////////////////////////////////////////////////////////////// // this works if you have a member variable m_aryProp ( substitute Prop for the Prop param ) // Example: // // lst m_AryName; // // // DECLARE_SAFEARRAY_UNK_PROPPUT( Name, DISPID_PROP_NAME ); // DECLARE_SAFEARRAY_UNK_PROPGET( Name ); // #define DECLARE_SAFEARRAY_UNK_PROPPUT( Prop, PROP_DISPID ) \ STDMETHOD(put_##Prop)( SAFEARRAY newVal ) \ {\ HRESULT hr = S_OK;\ if( S_OK == __ATL_PROP_NOTIFY_EVENT_CLASS::FireOnRequestEdit(GetUnknown(), PROP_DISPID) )\ {\ lst::iterator I = m_ary##Prop.begin();\ while( I != m_ary##Prop.end() )\ {\ (*I)->Release();\ ++I;\ }\ m_ary##Prop.erase(m_ary##Prop.begin(), m_ary##Prop.end());\ IUnknown** ppUnkArray;\ SafeArrayAccessData( &newVal, reinterpret_cast(&ppUnkArray) );\ for (UINT x = 0; x < newVal.rgsabound->cElements; x++)\ {\ IUnknown* pUnk = ppUnkArray[x];\ pUnk->AddRef();\ m_ary##Prop.push_back( pUnk );\ }\ SafeArrayUnaccessData(&newVal);\ hr = __ATL_PROP_NOTIFY_EVENT_CLASS::FireOnChanged(GetUnknown(), PROP_DISPID);\ }\ return hr; \ } #define DECLARE_SAFEARRAY_UNK_PROPGET( Prop ) \ STDMETHOD(get_##Prop)( SAFEARRAY *pVal ) \ {\ if( pVal )\ {\ int nItems = m_ary##Prop.size();\ SAFEARRAYBOUND bounds = { nItems, 0 };\ pVal = SafeArrayCreate( VT_UNKNOWN, 1, &bounds );\ IUnknown** ppUnkArray;\ SafeArrayAccessData( pVal, reinterpret_cast(&ppUnkArray) );\ lst::iterator I = m_ary##Prop.begin();\ for( int i = 0; I != m_ary##Prop.end(); ++I, ++i )\ {\ ppUnkArray[i] = (*I);\ }\ SafeArrayUnaccessData(pVal);\ }\ else\ {\ return E_POINTER;\ }\ return S_OK;\ } /////////////////////////////////////////////////////////////////////////////////////////////////////// // The following DECLARE_PROPXXX macros define functions if you have a member variable that supports // an issignment operator ( cleaning up memory if need be.... #define DECLARE_PROPPUT( Type, lVal, Prop, PROP_DISPID ) \ STDMETHOD(put_##Prop)( Type newVal ) \ {\ HRESULT hr = S_OK;\ if( S_OK == __ATL_PROP_NOTIFY_EVENT_CLASS::FireOnRequestEdit(GetUnknown(), PROP_DISPID) )\ {\ lVal = newVal;\ hr = __ATL_PROP_NOTIFY_EVENT_CLASS::FireOnChanged(GetUnknown(), PROP_DISPID);\ }\ return hr; \ } #define DECLARE_PROPGET( Type, rVal, Prop ) \ STDMETHOD(get_##Prop)( Type* pVal )\ {\ if( pVal )\ {\ *pVal = rVal;\ }\ else\ {\ return E_POINTER;\ }\ return S_OK;\ } inline HRESULT GetTextBoxHeight( HWND hwnd, int* pcy ) { HRESULT hr = S_OK; HDC hdc = NULL; HFONT hSysFont = NULL; HFONT hOldFont = NULL; TEXTMETRIC tm; int HeightOfCurrentFont = 0; int HeightOfSystemFont = 0; if( pcy ) { if( IsWindow( hwnd ) ) { //get the DC for the control hdc = GetDC(hwnd); //get the metrics for the system font hSysFont = reinterpret_cast(GetStockObject(SYSTEM_FONT)); hOldFont = reinterpret_cast(SelectObject(hdc, hSysFont)); GetTextMetrics(hdc, &tm); HeightOfSystemFont = tm.tmHeight; //select the original font back into the DC and release the DC SelectObject(hdc, hOldFont); DeleteObject(hSysFont); GetTextMetrics(hdc, &tm); ReleaseDC(hwnd, hdc); HeightOfCurrentFont = tm.tmHeight; *pcy = HeightOfCurrentFont + ( min( HeightOfSystemFont, HeightOfCurrentFont ) >> 1 ) + (GetSystemMetrics(SM_CYEDGE) * 2); } else { hr = E_INVALIDARG; } } else { hr = E_POINTER; } return hr; } #define RES_CH_MAX 256 inline TCHAR* Res2THelper( UINT uID, TCHAR* psz, int cch ) { if( LoadString( STRING_RESOURCE_MODULE, uID, psz, cch ) ) { return psz; } return _T(""); } #ifndef RES2T #define RES2T(uID) ( Res2THelper( uID, static_cast(_alloca( RES_CH_MAX )), RES_CH_MAX ) ) #endif inline LPCTSTR CommDlgLastErrorToa( DWORD dwErr ) { switch( dwErr ) { CASERET ( CDERR_DIALOGFAILURE ); CASERET ( CDERR_GENERALCODES ); CASERET ( CDERR_STRUCTSIZE ); CASERET ( CDERR_INITIALIZATION ); CASERET ( CDERR_NOTEMPLATE ); CASERET ( CDERR_NOHINSTANCE ); CASERET ( CDERR_LOADSTRFAILURE ); CASERET ( CDERR_FINDRESFAILURE ); CASERET ( CDERR_LOADRESFAILURE ); CASERET ( CDERR_LOCKRESFAILURE ); CASERET ( CDERR_MEMALLOCFAILURE ); CASERET ( CDERR_MEMLOCKFAILURE ); CASERET ( CDERR_NOHOOK ); CASERET ( CDERR_REGISTERMSGFAIL ); CASERET ( PDERR_PRINTERCODES ); CASERET ( PDERR_SETUPFAILURE ); CASERET ( PDERR_PARSEFAILURE ); CASERET ( PDERR_RETDEFFAILURE ); CASERET ( PDERR_LOADDRVFAILURE ); CASERET ( PDERR_GETDEVMODEFAIL ); CASERET ( PDERR_INITFAILURE ); CASERET ( PDERR_NODEVICES ); CASERET ( PDERR_NODEFAULTPRN ); CASERET ( PDERR_DNDMMISMATCH ); CASERET ( PDERR_CREATEICFAILURE ); CASERET ( PDERR_PRINTERNOTFOUND ); CASERET ( PDERR_DEFAULTDIFFERENT ); CASERET ( CFERR_CHOOSEFONTCODES ); CASERET ( CFERR_NOFONTS ); CASERET ( CFERR_MAXLESSTHANMIN ); CASERET ( FNERR_FILENAMECODES ); CASERET ( FNERR_SUBCLASSFAILURE ); CASERET ( FNERR_INVALIDFILENAME ); CASERET ( FNERR_BUFFERTOOSMALL ); CASERET ( FRERR_FINDREPLACECODES ); CASERET ( FRERR_BUFFERLENGTHZERO ); CASERET ( CCERR_CHOOSECOLORCODES ); } return _T("NOERROR"); } inline void DumpCommDlgLastError() { ATLTRACE(_T("CommDlgExtendedError == %s"), CommDlgLastErrorToa( CommDlgExtendedError() )); } inline int _Points_From_LogFontHeight( int height, HWND hwnd ) { HDC hdc = ::GetDC( hwnd ); if( NULL != hdc ) { int iRet = MulDiv( -height, 72, GetDeviceCaps( hdc, LOGPIXELSY ) ); ::ReleaseDC( hwnd, hdc ); return iRet; } return 0; } #endif // __standrd_h__