// MFCCOMControlCtrl.cpp : Implementation of the CMFCCOMControlCtrl ActiveX Control class. #include "stdafx.h" #include "MFCCOMControlLibrary.h" #include "MFCCOMControlCtrl.h" #include "MFCCOMControlPpg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif IMPLEMENT_DYNCREATE(CMFCCOMControlCtrl, COleControl) // Message map BEGIN_MESSAGE_MAP(CMFCCOMControlCtrl, COleControl) ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() END_MESSAGE_MAP() // Dispatch map BEGIN_DISPATCH_MAP(CMFCCOMControlCtrl, COleControl) DISP_FUNCTION_ID(CMFCCOMControlCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE) DISP_PROPERTY_EX_ID(CMFCCOMControlCtrl, "Label", 1, GetLabel, SetLabel, VT_BSTR) DISP_STOCKPROP_BACKCOLOR() DISP_STOCKPROP_FORECOLOR() DISP_STOCKPROP_FONT() END_DISPATCH_MAP() // Event map BEGIN_EVENT_MAP(CMFCCOMControlCtrl, COleControl) EVENT_STOCK_CLICK() END_EVENT_MAP() // Property pages // TODO: Add more property pages as needed. Remember to increase the count! BEGIN_PROPPAGEIDS(CMFCCOMControlCtrl, 1) PROPPAGEID(CMFCCOMControlPropPage::guid) END_PROPPAGEIDS(CMFCCOMControlCtrl) // Initialize class factory and guid IMPLEMENT_OLECREATE_EX(CMFCCOMControlCtrl, "MFCCOMCONTROLLIB.MFCCOMControlCtrl.1", 0x52bb379c, 0xbeba, 0x459e, 0x95, 0x80, 0xcc, 0x83, 0xce, 0x4e, 0xae, 0x8b) // Type library ID and version IMPLEMENT_OLETYPELIB(CMFCCOMControlCtrl, _tlid, _wVerMajor, _wVerMinor) // Interface IDs const IID BASED_CODE IID_DMFCCOMControlLibrary = { 0x9127BC42, 0x8288, 0x4AFE, { 0x95, 0xA9, 0xDB, 0x86, 0xBC, 0x89, 0x3B, 0xD4 } }; const IID BASED_CODE IID_DMFCCOMControlLibraryEvents = { 0x1E198490, 0x87F6, 0x401C, { 0xBD, 0xF1, 0x8A, 0xA8, 0x4D, 0xD7, 0x5B, 0x58 } }; // Control type information static const DWORD BASED_CODE _dwMFCCOMControlLibraryOleMisc = OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC_SETCLIENTSITEFIRST | OLEMISC_INSIDEOUT | OLEMISC_CANTLINKINSIDE | OLEMISC_RECOMPOSEONRESIZE; IMPLEMENT_OLECTLTYPE(CMFCCOMControlCtrl, IDS_MFCCOMCONTROLLIBRARY, _dwMFCCOMControlLibraryOleMisc) // CMFCCOMControlCtrl::CMFCCOMControlCtrlFactory::UpdateRegistry - // Adds or removes system registry entries for CMFCCOMControlCtrl BOOL CMFCCOMControlCtrl::CMFCCOMControlCtrlFactory::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_MFCCOMCONTROLLIBRARY, IDB_MFCCOMCONTROLLIBRARY, afxRegApartmentThreading, _dwMFCCOMControlLibraryOleMisc, _tlid, _wVerMajor, _wVerMinor); else return AfxOleUnregisterClass(m_clsid, m_lpszProgID); } // CMFCCOMControlCtrl::CMFCCOMControlCtrl - Constructor CMFCCOMControlCtrl::CMFCCOMControlCtrl() { InitializeIIDs(&IID_DMFCCOMControlLibrary, &IID_DMFCCOMControlLibraryEvents); // TODO: Initialize your control's instance data here. } // CMFCCOMControlCtrl::~CMFCCOMControlCtrl - Destructor CMFCCOMControlCtrl::~CMFCCOMControlCtrl() { // TODO: Cleanup your control's instance data here. } // CMFCCOMControlCtrl::OnDraw - Drawing function void CMFCCOMControlCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) { if (!pdc) return; CFont* pOldFont; TEXTMETRIC tm; CRect rc = rcBounds; CBrush bkBrush(TranslateColor(GetBackColor())); // Set the foreground color property and the transparent bk mode. pdc->SetTextColor(TranslateColor(GetForeColor())); pdc->SetBkMode(TRANSPARENT); // Paint background pdc->FillRect(rcBounds, &bkBrush); // Draw the caption and note using the stock Font and ForeColor properties pOldFont = SelectStockFont(pdc); GetStockTextMetrics(&tm); pdc->SetTextAlign(TA_CENTER | TA_TOP); pdc->ExtTextOut((rc.left + rc.right) / 2, (rc.top + rc.bottom - tm.tmHeight) / 2, ETO_CLIPPED, rc, m_label, m_label.GetLength(), NULL); pdc->SelectObject(pOldFont); } // CMFCCOMControlCtrl::DoPropExchange - Persistence support void CMFCCOMControlCtrl::DoPropExchange(CPropExchange* pPX) { ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor)); COleControl::DoPropExchange(pPX); if (pPX->GetVersion() == (DWORD)MAKELONG(_wVerMinor, _wVerMajor)) { PX_String(pPX, _T("Label"), m_label, _T("")); } else if (pPX->IsLoading()) { // Skip over persistent data CString strDummy; strDummy = "My MFC COM Control"; PX_String(pPX, _T("Label"), strDummy, _T("")); m_label = _T(""); } } void CMFCCOMControlCtrl::UpdateLabel(LPCTSTR lpszText) { if (m_label != lpszText) { m_label = lpszText; SetModifiedFlag(TRUE); InvalidateControl(); } } BSTR CMFCCOMControlCtrl::GetLabel() { return m_label.AllocSysString(); } void CMFCCOMControlCtrl::SetLabel(LPCTSTR lpszNewValue) { if (m_label != lpszNewValue) { m_label = lpszNewValue; SetModifiedFlag(TRUE); InvalidateControl(); } } // CMFCCOMControlCtrl::OnResetState - Reset control to default state void CMFCCOMControlCtrl::OnResetState() { COleControl::OnResetState(); // Resets defaults found in DoPropExchange // TODO: Reset any other control state here. } // CMFCCOMControlCtrl::AboutBox - Display an "About" box to the user void CMFCCOMControlCtrl::AboutBox() { CDialog dlgAbout(IDD_ABOUTBOX_MFCCOMCONTROLLIBRARY); dlgAbout.DoModal(); } // CMFCCOMControlCtrl message handlers void CMFCCOMControlCtrl::OnLButtonDown(UINT nFlags, CPoint point) { SetCapture(); } void CMFCCOMControlCtrl::OnLButtonUp(UINT nFlags, CPoint point) { ReleaseCapture(); FireClick(); } void CMFCCOMControlCtrl::OnFontChanged() { InvalidateControl(); COleControl::OnFontChanged(); } void CMFCCOMControlCtrl::OnBackColorChanged() { InvalidateControl(); COleControl::OnBackColorChanged(); } void CMFCCOMControlCtrl::OnForeColorChanged() { InvalidateControl(); COleControl::OnForeColorChanged(); }