214 lines
5.6 KiB
C++
214 lines
5.6 KiB
C++
|
//==============================================================;
|
||
|
//
|
||
|
// This source code is only intended as a supplement to
|
||
|
// existing Microsoft documentation.
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
||
|
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
||
|
// PURPOSE.
|
||
|
//
|
||
|
// Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
//==============================================================;
|
||
|
#include <stdio.h>
|
||
|
#include "People.h"
|
||
|
|
||
|
#include <initguid.h>
|
||
|
// for vb component
|
||
|
//#include "vb\mmcsample.h"
|
||
|
|
||
|
const GUID CPeoplePoweredVehicle::thisGuid = { 0x2974380d, 0x4c4b, 0x11d2, { 0x89, 0xd8, 0x0, 0x0, 0x21, 0x47, 0x31, 0x28 } };
|
||
|
const GUID CPerson::thisGuid = { 0xd41ef043, 0x8bc5, 0x11d2, { 0x8a, 0xb, 0x0, 0x0, 0x21, 0x47, 0x31, 0x28 } };
|
||
|
|
||
|
//==============================================================
|
||
|
//
|
||
|
// CPeoplePoweredVehicle implementation
|
||
|
//
|
||
|
//
|
||
|
CPeoplePoweredVehicle::CPeoplePoweredVehicle(CComponentData *pComponentData)
|
||
|
{
|
||
|
m_pComponentData = pComponentData;
|
||
|
|
||
|
for (int n = 0; n < NUMBER_OF_CHILDREN; n++) {
|
||
|
children[n] = new CPerson(n, pComponentData);
|
||
|
children[n]->Initialize(_T("Fred"), 6, 2, 115, n % 2 == 0 ? TRUE : FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CPeoplePoweredVehicle::~CPeoplePoweredVehicle()
|
||
|
{
|
||
|
for (int n = 0; n < NUMBER_OF_CHILDREN; n++)
|
||
|
if (children[n]) {
|
||
|
delete children[n];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
HRESULT CPeoplePoweredVehicle::Expand(IConsoleNameSpace *pConsoleNameSpace, IConsole *pConsole, HSCOPEITEM parent)
|
||
|
{
|
||
|
SCOPEDATAITEM sdi;
|
||
|
|
||
|
if (!bExpanded) {
|
||
|
// create the child nodes, then expand them
|
||
|
for (int n = 0; n < NUMBER_OF_CHILDREN; n++) {
|
||
|
ZeroMemory(&sdi, sizeof(SCOPEDATAITEM) );
|
||
|
sdi.mask = SDI_STR | // Displayname is valid
|
||
|
SDI_PARAM | // lParam is valid
|
||
|
SDI_IMAGE | // nImage is valid
|
||
|
SDI_OPENIMAGE | // nOpenImage is valid
|
||
|
SDI_PARENT |
|
||
|
SDI_CHILDREN;
|
||
|
|
||
|
sdi.relativeID = (HSCOPEITEM)parent;
|
||
|
sdi.nImage = children[n]->GetBitmapIndex();
|
||
|
sdi.nOpenImage = children[n]->GetBitmapIndex();
|
||
|
sdi.displayname = MMC_CALLBACK;
|
||
|
sdi.lParam = (LPARAM)children[n]; // The cookie
|
||
|
sdi.cChildren = 0;
|
||
|
|
||
|
HRESULT hr = pConsoleNameSpace->InsertItem( &sdi );
|
||
|
|
||
|
_ASSERT( SUCCEEDED(hr) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
//==============================================================
|
||
|
//
|
||
|
// CPeopleVehicle::CPerson implementation
|
||
|
//
|
||
|
//
|
||
|
CPerson::CPerson(int id, CComponentData *pComponentData)
|
||
|
: m_id(id)
|
||
|
{
|
||
|
m_pComponentData = pComponentData;
|
||
|
|
||
|
m_pUnknown = NULL;
|
||
|
szName = NULL;
|
||
|
lSpeed = 0;
|
||
|
lHeight = 0;
|
||
|
lWeight = 0;
|
||
|
fAnimating = FALSE;
|
||
|
}
|
||
|
|
||
|
CPerson::~CPerson()
|
||
|
{
|
||
|
if (szName)
|
||
|
delete [] szName;
|
||
|
|
||
|
if (m_pUnknown)
|
||
|
m_pUnknown->Release();
|
||
|
}
|
||
|
|
||
|
void CPerson::Initialize(_TCHAR *szName, LONG lSpeed, LONG lHeight, LONG lWeight, BOOL fAnimating)
|
||
|
{
|
||
|
if (szName) {
|
||
|
this->szName = new _TCHAR[_tcslen(szName) + 20];
|
||
|
_tcscpy(this->szName, szName);
|
||
|
_tcscat(this->szName, _T(" "));
|
||
|
|
||
|
if (m_id % 2)
|
||
|
_tcscat(this->szName, _T("(new control)"));
|
||
|
else
|
||
|
_tcscat(this->szName, _T("(share control)"));
|
||
|
}
|
||
|
|
||
|
this->lSpeed = lSpeed;
|
||
|
this->lHeight = lHeight;
|
||
|
this->lWeight = lWeight;
|
||
|
this->fAnimating = fAnimating;
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
const _TCHAR *CPerson::GetDisplayName(int nCol)
|
||
|
{
|
||
|
static _TCHAR buf[128];
|
||
|
|
||
|
switch (nCol) {
|
||
|
case 0:
|
||
|
_tcscpy(buf, szName ? szName : _T(""));
|
||
|
break;
|
||
|
|
||
|
case 1:
|
||
|
_stprintf(buf, _T("%ld m/s"), lSpeed);
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
_stprintf(buf, _T("%ld meters"), lHeight);
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
_stprintf(buf, _T("%ld kilos"), lWeight);
|
||
|
break;
|
||
|
}
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
HRESULT CPerson::GetResultViewType(LPOLESTR *ppViewType, long *pViewOptions)
|
||
|
{
|
||
|
// for vb component
|
||
|
// LPOLESTR lpOleStr;
|
||
|
// HRESULT hr = StringFromCLSID(CLSID_VBComponent, &lpOleStr);
|
||
|
// *ppViewType = lpOleStr;
|
||
|
|
||
|
// for atl component
|
||
|
LPOLESTR lpOleStr = L"{9A12FB62-C754-11D2-952C-00C04FB92EC2}";
|
||
|
*ppViewType = static_cast<LPOLESTR>(CoTaskMemAlloc((wcslen(lpOleStr) + 1) * sizeof(WCHAR)));
|
||
|
wcscpy(*ppViewType, lpOleStr);
|
||
|
|
||
|
if (m_id % 2) {
|
||
|
// create new control
|
||
|
*pViewOptions = MMC_VIEW_OPTIONS_CREATENEW;
|
||
|
} else {
|
||
|
// share control
|
||
|
*pViewOptions = MMC_VIEW_OPTIONS_NONE;
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
HRESULT CPerson::ShowContextHelp(IConsole *pConsole, IDisplayHelp *m_ipDisplayHelp, LPOLESTR helpFile)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
IUnknown *pUnk = NULL;
|
||
|
if (SUCCEEDED(hr = pConsole->QueryResultView(&pUnk))) {
|
||
|
IDispatch *pDispatch = NULL;
|
||
|
|
||
|
if (SUCCEEDED(hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDispatch))) {
|
||
|
DISPID dispID;
|
||
|
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
|
||
|
EXCEPINFO exInfo;
|
||
|
OLECHAR *pszName = L"DoHelp";
|
||
|
UINT uErr;
|
||
|
|
||
|
hr = pDispatch->GetIDsOfNames(IID_NULL, &pszName, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
|
||
|
|
||
|
if (SUCCEEDED(hr)) {
|
||
|
hr = pDispatch->Invoke(
|
||
|
dispID,
|
||
|
IID_NULL,
|
||
|
LOCALE_USER_DEFAULT,
|
||
|
DISPATCH_METHOD,
|
||
|
&dispparamsNoArgs, NULL, &exInfo, &uErr);
|
||
|
}
|
||
|
|
||
|
pDispatch->Release();
|
||
|
}
|
||
|
|
||
|
pUnk->Release();
|
||
|
}
|
||
|
|
||
|
_ASSERT(SUCCEEDED(hr));
|
||
|
|
||
|
return hr;
|
||
|
}
|