Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

151 lines
5.4 KiB

// WzScrEng.cpp : Implementation of CWizardScriptingEngine
#include "stdafx.h"
#include "WizChain.h"
#include "WzScrEng.h"
// local proto(s)
HBITMAP LoadPicture (LPOLESTR szURLorPath, long lWidth, long lHeight);
/////////////////////////////////////////////////////////////////////////////
// CWizardScriptingEngine
STDMETHODIMP CWizardScriptingEngine::Initialize(BSTR bstrWatermarkBitmapFile, BSTR bstrHeaderBitmapFile, BSTR bstrTitle, BSTR bstrHeader, BSTR bstrText, BSTR bstrFinishHeader, BSTR bstrFinishIntroText, BSTR bstrFinishText)
{
if (m_pCW != NULL)
return E_UNEXPECTED; // should only be called once
HRESULT hr = CComObject<CChainWiz>::CreateInstance (&m_pCW);
if (hr != S_OK)
return hr;
if (!m_pCW)
return E_FAIL;
m_pCW->AddRef(); // CreateInstance above doesn't addref
// try bitmaps first
m_hbmLarge = (HBITMAP)LoadImageW (NULL, // no hinstance when loading from file
(LPWSTR)bstrWatermarkBitmapFile, // filename
IMAGE_BITMAP, // type of image
0, 0, // size (width and height)
LR_LOADFROMFILE);
m_hbmSmall = (HBITMAP)LoadImageW (NULL, // no hinstance when loading from file
(LPWSTR)bstrHeaderBitmapFile, // filename
IMAGE_BITMAP, // type of image
0, 0, // size (width and height)
LR_LOADFROMFILE);
// use IPicture
if(!m_hbmLarge)
m_hbmLarge = LoadPicture ((LPOLESTR)bstrWatermarkBitmapFile, 0, 0);
if(!m_hbmSmall)
m_hbmSmall = LoadPicture ((LPOLESTR)bstrHeaderBitmapFile, 49, 49);
// TODO: should I add defaults when LoadImage calls above fail?
hr = m_pCW->Initialize (m_hbmLarge, m_hbmSmall, (LPOLESTR)bstrTitle, (LPOLESTR)bstrHeader, (LPOLESTR)bstrText, (LPOLESTR)bstrFinishHeader, (LPOLESTR)bstrFinishIntroText, (LPOLESTR)bstrFinishText);
return hr;
}
STDMETHODIMP CWizardScriptingEngine::AddWizardComponent(BSTR bstrClassIdOrProgId)
{
if (m_pCW == NULL)
return E_UNEXPECTED;
// if progid, get clsid
OLECHAR * p = (OLECHAR *)bstrClassIdOrProgId;
if (*p != L'{') {
CLSID clsid;
HRESULT hr = CLSIDFromProgID ((LPCOLESTR)bstrClassIdOrProgId, &clsid);
if (hr != S_OK)
return hr;
OLECHAR szClsid[50]; // find a define for this
StringFromGUID2 (clsid, szClsid, sizeof(szClsid)/sizeof(OLECHAR));
return m_pCW->AddWizardComponent (szClsid);
} else
return m_pCW->AddWizardComponent ((LPOLESTR)bstrClassIdOrProgId);
}
STDMETHODIMP CWizardScriptingEngine::DoModal(long *lRet)
{
if (m_pCW == NULL)
return E_UNEXPECTED;
return m_pCW->DoModal (lRet);
}
STDMETHODIMP CWizardScriptingEngine::get_ScriptablePropertyBag(IDispatch **pVal)
{
if (m_pCW == NULL)
return E_UNEXPECTED;
return m_pCW->get_PropertyBag (pVal);
}
HBITMAP LoadPicture (LPOLESTR szURLorPath, long lWidth, long lHeight)
{ // idea: load picture using OleLoadPicturePath
// play into memory dc, get back a hbitmap
HBITMAP hbm = NULL;
IPicture * pPic = NULL;
HRESULT hr = OleLoadPicturePath (szURLorPath,
NULL, // LPUNKNOWN punkCaller,
0, // DWORD dwReserved,
(OLE_COLOR)-1, // OLE_COLOR clrReserved,
__uuidof(IPicture), // REFIID
(void**)&pPic); // LPVOID *
if (pPic) {
OLE_XSIZE_HIMETRIC xhi;
OLE_YSIZE_HIMETRIC yhi;
pPic->get_Width (&xhi);
pPic->get_Height(&yhi);
SIZEL him, pixel = {0};
him.cx = xhi;
him.cy = yhi;
AtlHiMetricToPixel (&him, &pixel);
if (lWidth == 0) lWidth = pixel.cx;
if (lHeight == 0) lHeight = pixel.cy;
HDC hdcNULL = GetDC (NULL);
HDC hdc = CreateCompatibleDC (hdcNULL);
hbm = CreateCompatibleBitmap (hdcNULL, lWidth, lHeight);
ReleaseDC (NULL, hdcNULL);
HBITMAP holdbm = (HBITMAP)SelectObject (hdc, (HGDIOBJ)hbm);
// do palette action if any
HPALETTE hpal = NULL;
HPALETTE holdpal = NULL;
hr = pPic->get_hPal ((OLE_HANDLE *)&hpal);
if( SUCCEEDED(hr) && hpal)
{
holdpal = SelectPalette (hdc, hpal, FALSE);
RealizePalette (hdc);
hr = pPic->Render (hdc,
0,
lHeight-1, // 0,
lWidth,
-lHeight, // lHeight,
0, 0,
xhi, yhi,
NULL); // lpcrect used only if metafiledc
}
SelectObject (hdc, (HGDIOBJ)holdbm);
if (holdpal) {
SelectPalette (hdc, holdpal, FALSE);
DeleteObject ((HGDIOBJ)hpal);
}
if (hr != S_OK) {
DeleteObject ((HGDIOBJ)hbm);
hbm = NULL;
}
if( NULL != hdc )
{
ReleaseDC (NULL, hdc);
}
pPic->Release();
}
return hbm;
}