xref: /AOO41X/main/extensions/test/ole/MfcControl/MfcControlCtl.cpp (revision 520fa26520b0e796579cd98364c4c8e80094d346)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 // MfcControlCtl.cpp : Implementation of the CMfcControlCtrl ActiveX Control class.
23 
24 #include "stdafx.h"
25 #include "MfcControl.h"
26 #include "MfcControlCtl.h"
27 #include "MfcControlPpg.h"
28 
29 
30 #ifdef _DEBUG
31 #define new DEBUG_NEW
32 #undef THIS_FILE
33 static char THIS_FILE[] = __FILE__;
34 #endif
35 
36 
37 IMPLEMENT_DYNCREATE(CMfcControlCtrl, COleControl)
38 
39 
40 /////////////////////////////////////////////////////////////////////////////
41 // Message map
42 
43 BEGIN_MESSAGE_MAP(CMfcControlCtrl, COleControl)
44     //{{AFX_MSG_MAP(CMfcControlCtrl)
45     // NOTE - ClassWizard will add and remove message map entries
46     //    DO NOT EDIT what you see in these blocks of generated code !
47     //}}AFX_MSG_MAP
48     ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
49 END_MESSAGE_MAP()
50 
51 
52 /////////////////////////////////////////////////////////////////////////////
53 // Dispatch map
54 
55 BEGIN_DISPATCH_MAP(CMfcControlCtrl, COleControl)
56     //{{AFX_DISPATCH_MAP(CMfcControlCtrl)
57     DISP_FUNCTION(CMfcControlCtrl, "inShort", inShort, VT_I2, VTS_I2)
58     DISP_FUNCTION(CMfcControlCtrl, "inLong", inLong, VT_I4, VTS_I4)
59     DISP_FUNCTION(CMfcControlCtrl, "inString", inString, VT_BSTR, VTS_PBSTR)
60     DISP_FUNCTION(CMfcControlCtrl, "inFloat", inFloat, VT_R4, VTS_R4)
61     DISP_FUNCTION(CMfcControlCtrl, "inDouble", inDouble, VT_R8, VTS_R8)
62     DISP_FUNCTION(CMfcControlCtrl, "inVariant", inVariant, VT_VARIANT, VTS_VARIANT)
63     DISP_FUNCTION(CMfcControlCtrl, "inObject", inObject, VT_DISPATCH, VTS_DISPATCH)
64     DISP_FUNCTION(CMfcControlCtrl, "outShort", outShort, VT_EMPTY, VTS_PI2)
65     DISP_FUNCTION(CMfcControlCtrl, "outLong", outLong, VT_EMPTY, VTS_PI4)
66     DISP_FUNCTION(CMfcControlCtrl, "outString", outString, VT_EMPTY, VTS_PBSTR)
67     DISP_FUNCTION(CMfcControlCtrl, "outFloat", outFloat, VT_EMPTY, VTS_PR4)
68     DISP_FUNCTION(CMfcControlCtrl, "outDouble", outDouble, VT_EMPTY, VTS_PR8)
69     DISP_FUNCTION(CMfcControlCtrl, "outVariant", outVariant, VT_EMPTY, VTS_PVARIANT)
70     DISP_FUNCTION(CMfcControlCtrl, "outObject", outObject, VT_EMPTY, VTS_PDISPATCH)
71     //}}AFX_DISPATCH_MAP
72 END_DISPATCH_MAP()
73 
74 
75 /////////////////////////////////////////////////////////////////////////////
76 // Event map
77 
78 BEGIN_EVENT_MAP(CMfcControlCtrl, COleControl)
79     //{{AFX_EVENT_MAP(CMfcControlCtrl)
80     // NOTE - ClassWizard will add and remove event map entries
81     //    DO NOT EDIT what you see in these blocks of generated code !
82     //}}AFX_EVENT_MAP
83 END_EVENT_MAP()
84 
85 
86 /////////////////////////////////////////////////////////////////////////////
87 // Property pages
88 
89 // TODO: Add more property pages as needed.  Remember to increase the count!
90 BEGIN_PROPPAGEIDS(CMfcControlCtrl, 1)
91     PROPPAGEID(CMfcControlPropPage::guid)
92 END_PROPPAGEIDS(CMfcControlCtrl)
93 
94 
95 /////////////////////////////////////////////////////////////////////////////
96 // Initialize class factory and guid
97 
98 IMPLEMENT_OLECREATE_EX(CMfcControlCtrl, "MFCCONTROL.MfcControlCtrl.1",
99     0xac221fb6, 0xa0d8, 0x11d4, 0x83, 0x3b, 0, 0x50, 0x4, 0x52, 0x6a, 0xb4)
100 
101 
102 /////////////////////////////////////////////////////////////////////////////
103 // Type library ID and version
104 
105 IMPLEMENT_OLETYPELIB(CMfcControlCtrl, _tlid, _wVerMajor, _wVerMinor)
106 
107 
108 /////////////////////////////////////////////////////////////////////////////
109 // Interface IDs
110 
111 const IID BASED_CODE IID_DMfcControl =
112         { 0xac221fb4, 0xa0d8, 0x11d4, { 0x83, 0x3b, 0, 0x50, 0x4, 0x52, 0x6a, 0xb4 } };
113 const IID BASED_CODE IID_DMfcControlEvents =
114         { 0xac221fb5, 0xa0d8, 0x11d4, { 0x83, 0x3b, 0, 0x50, 0x4, 0x52, 0x6a, 0xb4 } };
115 
116 
117 /////////////////////////////////////////////////////////////////////////////
118 // Control type information
119 
120 static const DWORD BASED_CODE _dwMfcControlOleMisc =
121     OLEMISC_ACTIVATEWHENVISIBLE |
122     OLEMISC_SETCLIENTSITEFIRST |
123     OLEMISC_INSIDEOUT |
124     OLEMISC_CANTLINKINSIDE |
125     OLEMISC_RECOMPOSEONRESIZE;
126 
IMPLEMENT_OLECTLTYPE(CMfcControlCtrl,IDS_MFCCONTROL,_dwMfcControlOleMisc)127 IMPLEMENT_OLECTLTYPE(CMfcControlCtrl, IDS_MFCCONTROL, _dwMfcControlOleMisc)
128 
129 
130 /////////////////////////////////////////////////////////////////////////////
131 // CMfcControlCtrl::CMfcControlCtrlFactory::UpdateRegistry -
132 // Adds or removes system registry entries for CMfcControlCtrl
133 
134 BOOL CMfcControlCtrl::CMfcControlCtrlFactory::UpdateRegistry(BOOL bRegister)
135 {
136     // TODO: Verify that your control follows apartment-model threading rules.
137     // Refer to MFC TechNote 64 for more information.
138     // If your control does not conform to the apartment-model rules, then
139     // you must modify the code below, changing the 6th parameter from
140     // afxRegApartmentThreading to 0.
141 
142     if (bRegister)
143         return AfxOleRegisterControlClass(
144             AfxGetInstanceHandle(),
145             m_clsid,
146             m_lpszProgID,
147             IDS_MFCCONTROL,
148             IDB_MFCCONTROL,
149             afxRegApartmentThreading,
150             _dwMfcControlOleMisc,
151             _tlid,
152             _wVerMajor,
153             _wVerMinor);
154     else
155         return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
156 }
157 
158 
159 /////////////////////////////////////////////////////////////////////////////
160 // CMfcControlCtrl::CMfcControlCtrl - Constructor
161 
CMfcControlCtrl()162 CMfcControlCtrl::CMfcControlCtrl()
163 {
164     InitializeIIDs(&IID_DMfcControl, &IID_DMfcControlEvents);
165 
166     // TODO: Initialize your control's instance data here.
167 }
168 
169 
170 /////////////////////////////////////////////////////////////////////////////
171 // CMfcControlCtrl::~CMfcControlCtrl - Destructor
172 
~CMfcControlCtrl()173 CMfcControlCtrl::~CMfcControlCtrl()
174 {
175     // TODO: Cleanup your control's instance data here.
176 }
177 
178 
179 /////////////////////////////////////////////////////////////////////////////
180 // CMfcControlCtrl::OnDraw - Drawing function
181 
OnDraw(CDC * pdc,const CRect & rcBounds,const CRect & rcInvalid)182 void CMfcControlCtrl::OnDraw(
183             CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
184 {
185     // TODO: Replace the following code with your own drawing code.
186     pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
187     pdc->Ellipse(rcBounds);
188 }
189 
190 
191 /////////////////////////////////////////////////////////////////////////////
192 // CMfcControlCtrl::DoPropExchange - Persistence support
193 
DoPropExchange(CPropExchange * pPX)194 void CMfcControlCtrl::DoPropExchange(CPropExchange* pPX)
195 {
196     ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
197     COleControl::DoPropExchange(pPX);
198 
199     // TODO: Call PX_ functions for each persistent custom property.
200 
201 }
202 
203 
204 /////////////////////////////////////////////////////////////////////////////
205 // CMfcControlCtrl::OnResetState - Reset control to default state
206 
OnResetState()207 void CMfcControlCtrl::OnResetState()
208 {
209     COleControl::OnResetState();  // Resets defaults found in DoPropExchange
210 
211     // TODO: Reset any other control state here.
212 }
213 
214 
215 /////////////////////////////////////////////////////////////////////////////
216 // CMfcControlCtrl message handlers
217 
218 
inShort(short val)219 short CMfcControlCtrl::inShort(short val)
220 {
221     char buf[256];
222     sprintf( buf, "inByte: value= %d", val);
223     ::MessageBoxA( NULL, buf, "MFCCONTROL.MfcControl", MB_OK);
224     return val+1;
225 }
226 
inLong(long val)227 long CMfcControlCtrl::inLong(long val)
228 {
229     char buf[256];
230     sprintf( buf, "inLong: value= %d", val);
231     ::MessageBoxA( NULL, buf, "MFCCONTROL.MfcControl", MB_OK);
232     return val+1;
233 }
234 
inString(BSTR * val)235 BSTR CMfcControlCtrl::inString(BSTR* val)
236 {
237     CString strResult;
238     strResult= *val;
239     char buf[256];
240     sprintf( buf, "inString: value= %S", *val);
241     ::MessageBoxA( NULL, buf, "MFCCONTROL.MfcControl", MB_OK);
242     strResult += L" an appended string";
243     return strResult.AllocSysString();
244 }
245 
inFloat(float val)246 float CMfcControlCtrl::inFloat(float val)
247 {
248     char buf[256];
249     sprintf( buf, "inFloat: value= %f", val);
250     ::MessageBoxA( NULL, buf, "MFCCONTROL.MfcControl", MB_OK);
251     return val+1;
252 }
253 
inDouble(double val)254 double CMfcControlCtrl::inDouble(double val)
255 {
256     char buf[256];
257     sprintf( buf, "inDouble: value= %g", val);
258     ::MessageBoxA( NULL, buf, "MFCCONTROL.MfcControl", MB_OK);
259     return val+1;
260 }
261 
inVariant(const VARIANT FAR & val)262 VARIANT CMfcControlCtrl::inVariant(const VARIANT FAR& val)
263 {
264     VARIANT vaResult;
265     VariantInit(&vaResult);
266     VariantCopyInd( &vaResult, const_cast<VARIANT*>(&val));
267     if( vaResult.vt == VT_BSTR)
268     {
269         char buf[256];
270         sprintf( buf, "inVariant: value= %S", vaResult.bstrVal);
271         ::MessageBoxA( NULL, buf, "MFCCONTROL.MfcControl", MB_OK);
272 
273     }
274     return _variant_t( L" a string from CMfcControlCtrl::inVariant");
275 }
276 
inObject(LPDISPATCH val)277 LPDISPATCH CMfcControlCtrl::inObject(LPDISPATCH val)
278 {
279     char buf[256];
280     _bstr_t bstr;
281     HRESULT hr= S_OK;
282     COleVariant var;
283     DISPID id;
284     OLECHAR* name=L"prpString";
285     if( SUCCEEDED(hr= val->GetIDsOfNames( IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &id)))
286     {
287         DISPPARAMS params={0,0,0,0};
288         hr= val->Invoke( id, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &params, &var,0,0);
289 
290     }
291 
292     if( var.vt== VT_BSTR)
293         bstr= var.bstrVal;
294     sprintf( buf, "inObject: value= %S", (wchar_t*)bstr);
295     ::MessageBoxA( NULL, buf, "MFCCONTROL.MfcControl", MB_OK);
296 
297     return NULL;
298 }
299 
300 
outShort(short * val)301 void CMfcControlCtrl::outShort(short* val)
302 {
303     *val= 123;
304 }
305 
outLong(long * val)306 void CMfcControlCtrl::outLong(long* val)
307 {
308     *val= 1234;
309 }
310 
outString(BSTR FAR * val)311 void CMfcControlCtrl::outString(BSTR FAR* val)
312 {
313     *val= SysAllocString(L"A string from CMfcControlCtrl::outString ");
314 }
315 
outFloat(float * val)316 void CMfcControlCtrl::outFloat(float* val)
317 {
318     *val= 3.14f;
319 }
320 
outDouble(double * val)321 void CMfcControlCtrl::outDouble(double* val)
322 {
323     *val= 3.145;
324 }
325 
outVariant(VARIANT FAR * val)326 void CMfcControlCtrl::outVariant(VARIANT FAR* val)
327 {
328     VariantInit( val);
329     val->vt= VT_BSTR;
330     val->bstrVal= SysAllocString( L"a string in a VARIANT");
331 }
332 
outObject(LPDISPATCH FAR * val)333 void CMfcControlCtrl::outObject(LPDISPATCH FAR* val)
334 {
335     //{BFE10EBE-8584-11D4-005004526AB4}
336     HRESULT hr= S_OK;
337     CLSID clsTestControl;
338     hr= CLSIDFromProgID( L"AxTestComponents.Basic", &clsTestControl);
339 
340     IDispatch* pDisp= NULL;
341     hr= CoCreateInstance( clsTestControl, NULL, CLSCTX_ALL, __uuidof(IDispatch), (void**)&pDisp);
342 
343     if( SUCCEEDED( hr) && val)
344     {
345         COleVariant var;
346         DISPID id;
347         OLECHAR* name=L"prpString";
348         if( SUCCEEDED(hr= pDisp->GetIDsOfNames( IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &id)))
349         {
350             COleVariant vaParam1(_T("this is property prpString of AxTestComponents.Basic"));
351             DISPID dispidPut= DISPID_PROPERTYPUT;
352             DISPPARAMS params;
353             params.cArgs= 1;
354             params.cNamedArgs= 1;
355             params.rgdispidNamedArgs= &dispidPut;
356             params.rgvarg= &vaParam1;
357 
358             hr= pDisp->Invoke( id, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, &params, &var,0,0);
359             *val= pDisp;
360         }
361 
362     }
363 
364 }
365 // VT_I1
366