| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| // MfcControlCtl.cpp : Implementation of the CMfcControlCtrl ActiveX Control class. |
| |
| #include "stdafx.h" |
| #include "MfcControl.h" |
| #include "MfcControlCtl.h" |
| #include "MfcControlPpg.h" |
| |
| |
| #ifdef _DEBUG |
| #define new DEBUG_NEW |
| #undef THIS_FILE |
| static char THIS_FILE[] = __FILE__; |
| #endif |
| |
| |
| IMPLEMENT_DYNCREATE(CMfcControlCtrl, COleControl) |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // Message map |
| |
| BEGIN_MESSAGE_MAP(CMfcControlCtrl, COleControl) |
| //{{AFX_MSG_MAP(CMfcControlCtrl) |
| // NOTE - ClassWizard will add and remove message map entries |
| // DO NOT EDIT what you see in these blocks of generated code ! |
| //}}AFX_MSG_MAP |
| ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties) |
| END_MESSAGE_MAP() |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // Dispatch map |
| |
| BEGIN_DISPATCH_MAP(CMfcControlCtrl, COleControl) |
| //{{AFX_DISPATCH_MAP(CMfcControlCtrl) |
| DISP_FUNCTION(CMfcControlCtrl, "inShort", inShort, VT_I2, VTS_I2) |
| DISP_FUNCTION(CMfcControlCtrl, "inLong", inLong, VT_I4, VTS_I4) |
| DISP_FUNCTION(CMfcControlCtrl, "inString", inString, VT_BSTR, VTS_PBSTR) |
| DISP_FUNCTION(CMfcControlCtrl, "inFloat", inFloat, VT_R4, VTS_R4) |
| DISP_FUNCTION(CMfcControlCtrl, "inDouble", inDouble, VT_R8, VTS_R8) |
| DISP_FUNCTION(CMfcControlCtrl, "inVariant", inVariant, VT_VARIANT, VTS_VARIANT) |
| DISP_FUNCTION(CMfcControlCtrl, "inObject", inObject, VT_DISPATCH, VTS_DISPATCH) |
| DISP_FUNCTION(CMfcControlCtrl, "outShort", outShort, VT_EMPTY, VTS_PI2) |
| DISP_FUNCTION(CMfcControlCtrl, "outLong", outLong, VT_EMPTY, VTS_PI4) |
| DISP_FUNCTION(CMfcControlCtrl, "outString", outString, VT_EMPTY, VTS_PBSTR) |
| DISP_FUNCTION(CMfcControlCtrl, "outFloat", outFloat, VT_EMPTY, VTS_PR4) |
| DISP_FUNCTION(CMfcControlCtrl, "outDouble", outDouble, VT_EMPTY, VTS_PR8) |
| DISP_FUNCTION(CMfcControlCtrl, "outVariant", outVariant, VT_EMPTY, VTS_PVARIANT) |
| DISP_FUNCTION(CMfcControlCtrl, "outObject", outObject, VT_EMPTY, VTS_PDISPATCH) |
| //}}AFX_DISPATCH_MAP |
| END_DISPATCH_MAP() |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // Event map |
| |
| BEGIN_EVENT_MAP(CMfcControlCtrl, COleControl) |
| //{{AFX_EVENT_MAP(CMfcControlCtrl) |
| // NOTE - ClassWizard will add and remove event map entries |
| // DO NOT EDIT what you see in these blocks of generated code ! |
| //}}AFX_EVENT_MAP |
| END_EVENT_MAP() |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // Property pages |
| |
| // TODO: Add more property pages as needed. Remember to increase the count! |
| BEGIN_PROPPAGEIDS(CMfcControlCtrl, 1) |
| PROPPAGEID(CMfcControlPropPage::guid) |
| END_PROPPAGEIDS(CMfcControlCtrl) |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // Initialize class factory and guid |
| |
| IMPLEMENT_OLECREATE_EX(CMfcControlCtrl, "MFCCONTROL.MfcControlCtrl.1", |
| 0xac221fb6, 0xa0d8, 0x11d4, 0x83, 0x3b, 0, 0x50, 0x4, 0x52, 0x6a, 0xb4) |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // Type library ID and version |
| |
| IMPLEMENT_OLETYPELIB(CMfcControlCtrl, _tlid, _wVerMajor, _wVerMinor) |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // Interface IDs |
| |
| const IID BASED_CODE IID_DMfcControl = |
| { 0xac221fb4, 0xa0d8, 0x11d4, { 0x83, 0x3b, 0, 0x50, 0x4, 0x52, 0x6a, 0xb4 } }; |
| const IID BASED_CODE IID_DMfcControlEvents = |
| { 0xac221fb5, 0xa0d8, 0x11d4, { 0x83, 0x3b, 0, 0x50, 0x4, 0x52, 0x6a, 0xb4 } }; |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // Control type information |
| |
| static const DWORD BASED_CODE _dwMfcControlOleMisc = |
| OLEMISC_ACTIVATEWHENVISIBLE | |
| OLEMISC_SETCLIENTSITEFIRST | |
| OLEMISC_INSIDEOUT | |
| OLEMISC_CANTLINKINSIDE | |
| OLEMISC_RECOMPOSEONRESIZE; |
| |
| IMPLEMENT_OLECTLTYPE(CMfcControlCtrl, IDS_MFCCONTROL, _dwMfcControlOleMisc) |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // CMfcControlCtrl::CMfcControlCtrlFactory::UpdateRegistry - |
| // Adds or removes system registry entries for CMfcControlCtrl |
| |
| BOOL CMfcControlCtrl::CMfcControlCtrlFactory::UpdateRegistry(BOOL bRegister) |
| { |
| // TODO: Verify that your control follows apartment-model threading rules. |
| // Refer to MFC TechNote 64 for more information. |
| // If your control does not conform to the apartment-model rules, then |
| // you must modify the code below, changing the 6th parameter from |
| // afxRegApartmentThreading to 0. |
| |
| if (bRegister) |
| return AfxOleRegisterControlClass( |
| AfxGetInstanceHandle(), |
| m_clsid, |
| m_lpszProgID, |
| IDS_MFCCONTROL, |
| IDB_MFCCONTROL, |
| afxRegApartmentThreading, |
| _dwMfcControlOleMisc, |
| _tlid, |
| _wVerMajor, |
| _wVerMinor); |
| else |
| return AfxOleUnregisterClass(m_clsid, m_lpszProgID); |
| } |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // CMfcControlCtrl::CMfcControlCtrl - Constructor |
| |
| CMfcControlCtrl::CMfcControlCtrl() |
| { |
| InitializeIIDs(&IID_DMfcControl, &IID_DMfcControlEvents); |
| |
| // TODO: Initialize your control's instance data here. |
| } |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // CMfcControlCtrl::~CMfcControlCtrl - Destructor |
| |
| CMfcControlCtrl::~CMfcControlCtrl() |
| { |
| // TODO: Cleanup your control's instance data here. |
| } |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // CMfcControlCtrl::OnDraw - Drawing function |
| |
| void CMfcControlCtrl::OnDraw( |
| CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) |
| { |
| // TODO: Replace the following code with your own drawing code. |
| pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); |
| pdc->Ellipse(rcBounds); |
| } |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // CMfcControlCtrl::DoPropExchange - Persistence support |
| |
| void CMfcControlCtrl::DoPropExchange(CPropExchange* pPX) |
| { |
| ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor)); |
| COleControl::DoPropExchange(pPX); |
| |
| // TODO: Call PX_ functions for each persistent custom property. |
| |
| } |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // CMfcControlCtrl::OnResetState - Reset control to default state |
| |
| void CMfcControlCtrl::OnResetState() |
| { |
| COleControl::OnResetState(); // Resets defaults found in DoPropExchange |
| |
| // TODO: Reset any other control state here. |
| } |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // CMfcControlCtrl message handlers |
| |
| |
| short CMfcControlCtrl::inShort(short val) |
| { |
| char buf[256]; |
| sprintf( buf, "inByte: value= %d", val); |
| ::MessageBoxA( NULL, buf, "MFCCONTROL.MfcControl", MB_OK); |
| return val+1; |
| } |
| |
| long CMfcControlCtrl::inLong(long val) |
| { |
| char buf[256]; |
| sprintf( buf, "inLong: value= %d", val); |
| ::MessageBoxA( NULL, buf, "MFCCONTROL.MfcControl", MB_OK); |
| return val+1; |
| } |
| |
| BSTR CMfcControlCtrl::inString(BSTR* val) |
| { |
| CString strResult; |
| strResult= *val; |
| char buf[256]; |
| sprintf( buf, "inString: value= %S", *val); |
| ::MessageBoxA( NULL, buf, "MFCCONTROL.MfcControl", MB_OK); |
| strResult += L" an appended string"; |
| return strResult.AllocSysString(); |
| } |
| |
| float CMfcControlCtrl::inFloat(float val) |
| { |
| char buf[256]; |
| sprintf( buf, "inFloat: value= %f", val); |
| ::MessageBoxA( NULL, buf, "MFCCONTROL.MfcControl", MB_OK); |
| return val+1; |
| } |
| |
| double CMfcControlCtrl::inDouble(double val) |
| { |
| char buf[256]; |
| sprintf( buf, "inDouble: value= %g", val); |
| ::MessageBoxA( NULL, buf, "MFCCONTROL.MfcControl", MB_OK); |
| return val+1; |
| } |
| |
| VARIANT CMfcControlCtrl::inVariant(const VARIANT FAR& val) |
| { |
| VARIANT vaResult; |
| VariantInit(&vaResult); |
| VariantCopyInd( &vaResult, const_cast<VARIANT*>(&val)); |
| if( vaResult.vt == VT_BSTR) |
| { |
| char buf[256]; |
| sprintf( buf, "inVariant: value= %S", vaResult.bstrVal); |
| ::MessageBoxA( NULL, buf, "MFCCONTROL.MfcControl", MB_OK); |
| |
| } |
| return _variant_t( L" a string from CMfcControlCtrl::inVariant"); |
| } |
| |
| LPDISPATCH CMfcControlCtrl::inObject(LPDISPATCH val) |
| { |
| char buf[256]; |
| _bstr_t bstr; |
| HRESULT hr= S_OK; |
| COleVariant var; |
| DISPID id; |
| OLECHAR* name=L"prpString"; |
| if( SUCCEEDED(hr= val->GetIDsOfNames( IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &id))) |
| { |
| DISPPARAMS params={0,0,0,0}; |
| hr= val->Invoke( id, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, ¶ms, &var,0,0); |
| |
| } |
| |
| if( var.vt== VT_BSTR) |
| bstr= var.bstrVal; |
| sprintf( buf, "inObject: value= %S", (wchar_t*)bstr); |
| ::MessageBoxA( NULL, buf, "MFCCONTROL.MfcControl", MB_OK); |
| |
| return NULL; |
| } |
| |
| |
| void CMfcControlCtrl::outShort(short* val) |
| { |
| *val= 123; |
| } |
| |
| void CMfcControlCtrl::outLong(long* val) |
| { |
| *val= 1234; |
| } |
| |
| void CMfcControlCtrl::outString(BSTR FAR* val) |
| { |
| *val= SysAllocString(L"A string from CMfcControlCtrl::outString "); |
| } |
| |
| void CMfcControlCtrl::outFloat(float* val) |
| { |
| *val= 3.14f; |
| } |
| |
| void CMfcControlCtrl::outDouble(double* val) |
| { |
| *val= 3.145; |
| } |
| |
| void CMfcControlCtrl::outVariant(VARIANT FAR* val) |
| { |
| VariantInit( val); |
| val->vt= VT_BSTR; |
| val->bstrVal= SysAllocString( L"a string in a VARIANT"); |
| } |
| |
| void CMfcControlCtrl::outObject(LPDISPATCH FAR* val) |
| { |
| //{BFE10EBE-8584-11D4-005004526AB4} |
| HRESULT hr= S_OK; |
| CLSID clsTestControl; |
| hr= CLSIDFromProgID( L"AxTestComponents.Basic", &clsTestControl); |
| |
| IDispatch* pDisp= NULL; |
| hr= CoCreateInstance( clsTestControl, NULL, CLSCTX_ALL, __uuidof(IDispatch), (void**)&pDisp); |
| |
| if( SUCCEEDED( hr) && val) |
| { |
| COleVariant var; |
| DISPID id; |
| OLECHAR* name=L"prpString"; |
| if( SUCCEEDED(hr= pDisp->GetIDsOfNames( IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &id))) |
| { |
| COleVariant vaParam1(_T("this is property prpString of AxTestComponents.Basic")); |
| DISPID dispidPut= DISPID_PROPERTYPUT; |
| DISPPARAMS params; |
| params.cArgs= 1; |
| params.cNamedArgs= 1; |
| params.rgdispidNamedArgs= &dispidPut; |
| params.rgvarg= &vaParam1; |
| |
| hr= pDisp->Invoke( id, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, ¶ms, &var,0,0); |
| *val= pDisp; |
| } |
| |
| } |
| |
| } |
| // VT_I1 |