// MyOcxCtrl.cpp :  CMyOcxCtrl ActiveX コントロール クラスの実装

#include "stdafx.h"
#include "MyOcx.h"
#include "MyOcxCtrl.h"
#include "MyOcxPropPage.h"
#include ".\myocxctrl.h"
#include <process.h>


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


IMPLEMENT_DYNCREATE(CMyOcxCtrl, COleControl)



// メッセージ マップ

BEGIN_MESSAGE_MAP(CMyOcxCtrl, COleControl)
	ON_WM_CREATE()
	ON_OLEVERB(AFX_IDS_VERB_EDIT, OnEdit)
	ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
END_MESSAGE_MAP()



// ディスパッチ マップ

BEGIN_DISPATCH_MAP(CMyOcxCtrl, COleControl)
	DISP_PROPERTY_NOTIFY_ID(CMyOcxCtrl, "MyParam", dispidMyParam, m_MyParam, OnMyParamChanged, VT_BSTR)
END_DISPATCH_MAP()



// イベント マップ

BEGIN_EVENT_MAP(CMyOcxCtrl, COleControl)
END_EVENT_MAP()



// プロパティ ページ

// TODO: プロパティ ページを追加して、BEGIN 行の最後にあるカウントを増やしてください。
BEGIN_PROPPAGEIDS(CMyOcxCtrl, 1)
	PROPPAGEID(CMyOcxPropPage::guid)
END_PROPPAGEIDS(CMyOcxCtrl)



// クラス ファクトリおよび GUID を初期化します。

IMPLEMENT_OLECREATE_EX(CMyOcxCtrl, "MYOCX.MyOcxCtrl.1",
	0x240ab2f3, 0xf9b, 0x418b, 0x99, 0x39, 0x72, 0x4b, 0x83, 0xa9, 0x7b, 0xb0)



// タイプ ライブラリ ID およびバージョン

IMPLEMENT_OLETYPELIB(CMyOcxCtrl, _tlid, _wVerMajor, _wVerMinor)



// インターフェイス ID

const IID BASED_CODE IID_DMyOcx =
		{ 0xAF2945A5, 0xE4E9, 0x4617, { 0xA0, 0xBC, 0x9E, 0xFC, 0x73, 0x8A, 0x57, 0x3 } };
const IID BASED_CODE IID_DMyOcxEvents =
		{ 0x245E9CA9, 0x3C11, 0x4C4C, { 0x9C, 0x44, 0x50, 0xA1, 0x77, 0x45, 0x65, 0xEE } };



//コントロールの型情報

static const DWORD BASED_CODE _dwMyOcxOleMisc =
	OLEMISC_ACTIVATEWHENVISIBLE |
	OLEMISC_SETCLIENTSITEFIRST |
	OLEMISC_INSIDEOUT |
	OLEMISC_CANTLINKINSIDE |
	OLEMISC_RECOMPOSEONRESIZE;

IMPLEMENT_OLECTLTYPE(CMyOcxCtrl, IDS_MYOCX, _dwMyOcxOleMisc)



// CMyOcxCtrl::CMyOcxCtrlFactory::UpdateRegistry -
// CMyOcxCtrl のシステム レジストリ エントリを追加または削除します。

BOOL CMyOcxCtrl::CMyOcxCtrlFactory::UpdateRegistry(BOOL bRegister)
{
	// TODO: コントロールが apartment モデルのスレッド処理の規則に従っていることを
	// 確認してください。詳細については MFC のテクニカル ノート 64 を参照してください。
	// アパートメント モデルのスレッド処理の規則に従わないコントロールの場合は、6 番目
	// のパラメータを以下のように変更してください。
	// afxRegInsertable | afxRegApartmentThreading を afxRegInsertable へ変更してください。

	if (bRegister)
		return AfxOleRegisterControlClass(
			AfxGetInstanceHandle(),
			m_clsid,
			m_lpszProgID,
			IDS_MYOCX,
			IDB_MYOCX,
			afxRegInsertable | afxRegApartmentThreading,
			_dwMyOcxOleMisc,
			_tlid,
			_wVerMajor,
			_wVerMinor);
	else
		return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}



// CMyOcxCtrl::CMyOcxCtrl - コンストラクタ

CMyOcxCtrl::CMyOcxCtrl()
{
	InitializeIIDs(&IID_DMyOcx, &IID_DMyOcxEvents);
	// TODO: この位置にコントロールのインスタンス データの初期化処理を追加してください
}



// CMyOcxCtrl::~CMyOcxCtrl - デストラクタ

CMyOcxCtrl::~CMyOcxCtrl()
{
	// TODO: この位置にコントロールのインスタンス データの後処理用のコードを追加してください
}

afx_msg int CMyOcxCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	char hWndString[100];

	if (COleControl::OnCreate(lpCreateStruct) == -1)
		return -1;

	sprintf(hWndString, "%d", this->m_hWnd);

	_spawnl(_P_NOWAIT,
		"C:\\Program Files\\squeak\\Plugin\\Squeak.exe",
		"\"C:\\Program Files\\squeak\\Plugin\\Squeak.exe\"",
		"-browserWindow:",
		hWndString,
		"\"C:\\Program Files\\squeak\\Plugin\\SqueakPlugin.image\"",
		NULL
		);
	return 0;
}

// CMyOcxCtrl::OnDraw - 描画関数

void CMyOcxCtrl::OnDraw(
			CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
	char handle[100];
	sprintf(handle, "hWnd = %d", this->m_hWnd);
	if (!pdc)
		return;

	// TODO: 以下のコードを描画用のコードに置き換えてください
	pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
	pdc->TextOut(0, 0, m_MyParam);
//	pdc->TextOut(0, 0, handle);
	pdc->Ellipse(rcBounds);
}



// CMyOcxCtrl::DoPropExchange - 永続性のサポート

void CMyOcxCtrl::DoPropExchange(CPropExchange* pPX)
{
	ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
	COleControl::DoPropExchange(pPX);

	// TODO: 永続属性を持つ各カスタム プロパティ用の PX_ 関数を呼び出します。
    PX_String(pPX, _T("MyParam"), m_MyParam, "");

}



// CMyOcxCtrl::OnResetState - コントロールを既定の状態にリセットします。

void CMyOcxCtrl::OnResetState()
{
	COleControl::OnResetState();  // DoPropExchange を呼び出してデフォルト値にリセット

	// TODO: この位置にコントロールの状態をリセットする処理を追加してください
}



// CMyOcxCtrl メッセージ ハンドラ

void CMyOcxCtrl::OnMyParamChanged(void)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	// TODO: ここにプロパティ ハンドラ コードを追加してください。

	SetModifiedFlag();
}

