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
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;
|
|
}
|