// pushctl.cpp : Implementation of the CPushCtrl OLE control class. // // This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. #include "stdafx.h" #include "push.h" #include "pushctl.h" #include "pushppg.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNCREATE(CPushCtrl, COleControl) ///////////////////////////////////////////////////////////////////////////// // Message map BEGIN_MESSAGE_MAP(CPushCtrl, COleControl) //{{AFX_MSG_MAP(CPushCtrl) ON_MESSAGE(OCM_COMMAND, OnOcmCommand) ON_MESSAGE(OCM_DRAWITEM, OnOcmDrawItem) ON_WM_ERASEBKGND() //}}AFX_MSG_MAP ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // Dispatch map BEGIN_DISPATCH_MAP(CPushCtrl, COleControl) //{{AFX_DISPATCH_MAP(CPushCtrl) DISP_STOCKPROP_BORDERSTYLE() DISP_STOCKPROP_CAPTION() DISP_STOCKPROP_ENABLED() //}}AFX_DISPATCH_MAP DISP_FUNCTION_ID(CPushCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE) END_DISPATCH_MAP() ///////////////////////////////////////////////////////////////////////////// // Event map BEGIN_EVENT_MAP(CPushCtrl, COleControl) //{{AFX_EVENT_MAP(CPushCtrl) EVENT_CUSTOM("CustomClick", FireCustomClick, VTS_BSTR VTS_I2) //}}AFX_EVENT_MAP END_EVENT_MAP() ///////////////////////////////////////////////////////////////////////////// // Property pages // TODO: Add more property pages as needed. Remember to increase the count! BEGIN_PROPPAGEIDS(CPushCtrl, 1) PROPPAGEID(CPushPropPage::guid) END_PROPPAGEIDS(CPushCtrl) ///////////////////////////////////////////////////////////////////////////// // Initialize class factory and guid IMPLEMENT_OLECREATE_EX(CPushCtrl, "PUSH.PushCtrl.1", 0x75303863, 0xb925, 0x101a, 0xb5, 0x7a, 0x0, 0x0, 0xc0, 0xc3, 0xed, 0x5f) ///////////////////////////////////////////////////////////////////////////// // Type library ID and version IMPLEMENT_OLETYPELIB(CPushCtrl, _tlid, _wVerMajor, _wVerMinor) ///////////////////////////////////////////////////////////////////////////// // Interface IDs const IID BASED_CODE IID_DPush = { 0x37446b86, 0x5870, 0x101b, { 0xb5, 0x7b, 0x0, 0x60, 0x8c, 0xc9, 0x6a, 0xfa } }; const IID BASED_CODE IID_DPushEvents = { 0x37446b87, 0x5870, 0x101b, { 0xb5, 0x7b, 0x0, 0x60, 0x8c, 0xc9, 0x6a, 0xfa } }; ///////////////////////////////////////////////////////////////////////////// // Control type information static const DWORD BASED_CODE _dwPushOleMisc = OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC_SETCLIENTSITEFIRST | OLEMISC_INSIDEOUT | OLEMISC_CANTLINKINSIDE | OLEMISC_RECOMPOSEONRESIZE; IMPLEMENT_OLECTLTYPE(CPushCtrl, IDS_PUSH, _dwPushOleMisc) ///////////////////////////////////////////////////////////////////////////// // CPushCtrl::CPushCtrlFactory::UpdateRegistry - // Adds or removes system registry entries for CPushCtrl BOOL CPushCtrl::CPushCtrlFactory::UpdateRegistry(BOOL bRegister) { if (bRegister) return AfxOleRegisterControlClass( AfxGetInstanceHandle(), m_clsid, m_lpszProgID, IDS_PUSH, IDB_PUSH, FALSE, // Not insertable _dwPushOleMisc, _tlid, _wVerMajor, _wVerMinor); else return AfxOleUnregisterClass(m_clsid, m_lpszProgID); } ///////////////////////////////////////////////////////////////////////////// // CPushCtrl::CPushCtrl - Constructor CPushCtrl::CPushCtrl() { InitializeIIDs(&IID_DPush, &IID_DPushEvents); SetInitialSize(28, 28); } ///////////////////////////////////////////////////////////////////////////// // CPushCtrl::~CPushCtrl - Destructor CPushCtrl::~CPushCtrl() { } ///////////////////////////////////////////////////////////////////////////// // CPushCtrl::OnDraw - Drawing function void CPushCtrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect&) { DoSuperclassPaint(pdc, rcBounds); } ///////////////////////////////////////////////////////////////////////////// // CPushCtrl::DoPropExchange - Persistence support void CPushCtrl::DoPropExchange(CPropExchange* pPX) { ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor)); COleControl::DoPropExchange(pPX); } ///////////////////////////////////////////////////////////////////////////// // CPushCtrl::OnResetState - Reset control to default state void CPushCtrl::OnResetState() { COleControl::OnResetState(); // Resets defaults found in DoPropExchange } ///////////////////////////////////////////////////////////////////////////// // CPushCtrl::AboutBox - Display an "About" box to the user void CPushCtrl::AboutBox() { CDialog dlgAbout(IDD_ABOUTBOX_PUSH); dlgAbout.DoModal(); } ///////////////////////////////////////////////////////////////////////////// // CPushCtrl::PreCreateWindow - Modify parameters for CreateWindowEx BOOL CPushCtrl::PreCreateWindow(CREATESTRUCT& cs) { cs.lpszClass = _T("BUTTON"); cs.style |= BS_PUSHBUTTON | BS_OWNERDRAW; return COleControl::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CPushCtrl::IsSubclassedControl - This is a subclassed control BOOL CPushCtrl::IsSubclassedControl() { return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CPushCtrl::OnOcmCommand - Handle command messages LRESULT CPushCtrl::OnOcmCommand(WPARAM wParam, LPARAM lParam) { #ifdef _WIN32 lParam; WORD wNotifyCode = HIWORD(wParam); #else wParam; WORD wNotifyCode = HIWORD(lParam); #endif switch (wNotifyCode) { case BN_CLICKED: // Fire custom click event, sending caption CString strCaption = InternalGetText(); FireCustomClick(strCaption, (short) strCaption.GetLength()); break; } return 0; } ///////////////////////////////////////////////////////////////////////////// // CPushCtrl::OnEraseBkgnd - Simply return TRUE so background is not erased. BOOL CPushCtrl::OnEraseBkgnd(CDC*) { return TRUE; } //////////////////////////////////////////////////////////////////////////// // CPushCtrl::OnOcmDrawItem - Draw an item. LRESULT CPushCtrl::OnOcmDrawItem(WPARAM, LPARAM lParam) { DrawItem((LPDRAWITEMSTRUCT)lParam); return 1; } ///////////////////////////////////////////////////////////////////////////// // CPushCtrl::DrawItem - Draw an item. void CPushCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CDC *pdc; int bmpId; CBitmap bitmap; BITMAP bmp; CPictureHolder picHolder; CRect rcSrcBounds; CPen* pOldPen; RECT rect; SHORT inflate; pdc = CDC::FromHandle(lpDrawItemStruct->hDC); switch (lpDrawItemStruct->itemAction) { case ODA_DRAWENTIRE: case ODA_SELECT: // Load "up" or "down" bitmap depending on selection state bmpId = (lpDrawItemStruct->itemState & ODS_SELECTED) ? IDB_DOWNBITMAP : IDB_UPBITMAP; bitmap.LoadBitmap(bmpId); bitmap.GetObject(sizeof(BITMAP), &bmp); rcSrcBounds.right = bmp.bmWidth; rcSrcBounds.bottom = bmp.bmHeight; // Create picture and render picHolder.CreateFromBitmap((HBITMAP)bitmap.m_hObject, NULL, FALSE); picHolder.Render(pdc, lpDrawItemStruct->rcItem, rcSrcBounds); break; case ODA_FOCUS: // Just draw focus rect pOldPen = (CPen*)pdc->SelectStockObject(BLACK_PEN); if (lpDrawItemStruct->itemState & ODS_FOCUS) { CopyRect((LPRECT)&rect, (LPRECT)&lpDrawItemStruct->rcItem); inflate = (SHORT)min(3,min(rect.right - rect.left + 1, rect.bottom - rect.top + 1) / 5); InflateRect(&rect, -inflate, -inflate); pdc->DrawFocusRect(&rect); } pdc->SelectObject(pOldPen); break; } }