|
|
// HMTabViewCtl.cpp : Implementation of the CHMTabViewCtrl ActiveX Control class.
#include "stdafx.h"
#include "HMTabView.h"
#include "HMTabViewCtl.h"
#include "HMTabViewPpg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
IMPLEMENT_DYNCREATE(CHMTabViewCtrl, COleControl)
/////////////////////////////////////////////////////////////////////////////
// Message map
BEGIN_MESSAGE_MAP(CHMTabViewCtrl, COleControl) //{{AFX_MSG_MAP(CHMTabViewCtrl)
ON_WM_CREATE() ON_WM_SIZE() //}}AFX_MSG_MAP
ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties) END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Dispatch map
BEGIN_DISPATCH_MAP(CHMTabViewCtrl, COleControl) //{{AFX_DISPATCH_MAP(CHMTabViewCtrl)
DISP_FUNCTION(CHMTabViewCtrl, "InsertItem", InsertItem, VT_BOOL, VTS_I4 VTS_I4 VTS_BSTR VTS_I4 VTS_I4) DISP_FUNCTION(CHMTabViewCtrl, "DeleteItem", DeleteItem, VT_BOOL, VTS_I4) DISP_FUNCTION(CHMTabViewCtrl, "DeleteAllItems", DeleteAllItems, VT_BOOL, VTS_NONE) DISP_FUNCTION(CHMTabViewCtrl, "CreateControl", CreateControl, VT_BOOL, VTS_I4 VTS_BSTR) DISP_FUNCTION(CHMTabViewCtrl, "GetControl", GetControl, VT_UNKNOWN, VTS_I4) //}}AFX_DISPATCH_MAP
DISP_FUNCTION_ID(CHMTabViewCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE) END_DISPATCH_MAP()
/////////////////////////////////////////////////////////////////////////////
// Event map
BEGIN_EVENT_MAP(CHMTabViewCtrl, COleControl) //{{AFX_EVENT_MAP(CHMTabViewCtrl)
// 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(CHMTabViewCtrl, 1) PROPPAGEID(CHMTabViewPropPage::guid) END_PROPPAGEIDS(CHMTabViewCtrl)
/////////////////////////////////////////////////////////////////////////////
// Initialize class factory and guid
IMPLEMENT_OLECREATE_EX(CHMTabViewCtrl, "HMTABVIEW.HMTabViewCtrl.1", 0x4fffc38c, 0x2f1e, 0x11d3, 0xbe, 0x10, 0, 0, 0xf8, 0x7a, 0x39, 0x12)
/////////////////////////////////////////////////////////////////////////////
// Type library ID and version
IMPLEMENT_OLETYPELIB(CHMTabViewCtrl, _tlid, _wVerMajor, _wVerMinor)
/////////////////////////////////////////////////////////////////////////////
// Interface IDs
const IID BASED_CODE IID_DHMTabView = { 0x4fffc38a, 0x2f1e, 0x11d3, { 0xbe, 0x10, 0, 0, 0xf8, 0x7a, 0x39, 0x12 } }; const IID BASED_CODE IID_DHMTabViewEvents = { 0x4fffc38b, 0x2f1e, 0x11d3, { 0xbe, 0x10, 0, 0, 0xf8, 0x7a, 0x39, 0x12 } };
/////////////////////////////////////////////////////////////////////////////
// Control type information
static const DWORD BASED_CODE _dwHMTabViewOleMisc = OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC_SETCLIENTSITEFIRST | OLEMISC_INSIDEOUT | OLEMISC_CANTLINKINSIDE | OLEMISC_RECOMPOSEONRESIZE;
IMPLEMENT_OLECTLTYPE(CHMTabViewCtrl, IDS_HMTABVIEW, _dwHMTabViewOleMisc)
/////////////////////////////////////////////////////////////////////////////
// CHMTabViewCtrl::CHMTabViewCtrlFactory::UpdateRegistry -
// Adds or removes system registry entries for CHMTabViewCtrl
BOOL CHMTabViewCtrl::CHMTabViewCtrlFactory::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_HMTABVIEW, IDB_HMTABVIEW, afxRegApartmentThreading, _dwHMTabViewOleMisc, _tlid, _wVerMajor, _wVerMinor); else return AfxOleUnregisterClass(m_clsid, m_lpszProgID); }
/////////////////////////////////////////////////////////////////////////////
// Licensing strings
static const TCHAR BASED_CODE _szLicFileName[] = _T("HMTabView.lic");
static const WCHAR BASED_CODE _szLicString[] = L"Copyright (c) 1999 Microsoft";
/////////////////////////////////////////////////////////////////////////////
// CHMTabViewCtrl::CHMTabViewCtrlFactory::VerifyUserLicense -
// Checks for existence of a user license
BOOL CHMTabViewCtrl::CHMTabViewCtrlFactory::VerifyUserLicense() { return AfxVerifyLicFile(AfxGetInstanceHandle(), _szLicFileName, _szLicString); }
/////////////////////////////////////////////////////////////////////////////
// CHMTabViewCtrl::CHMTabViewCtrlFactory::GetLicenseKey -
// Returns a runtime licensing key
BOOL CHMTabViewCtrl::CHMTabViewCtrlFactory::GetLicenseKey(DWORD dwReserved, BSTR FAR* pbstrKey) { if (pbstrKey == NULL) return FALSE;
*pbstrKey = SysAllocString(_szLicString); return (*pbstrKey != NULL); }
/////////////////////////////////////////////////////////////////////////////
// CHMTabViewCtrl::CHMTabViewCtrl - Constructor
CHMTabViewCtrl::CHMTabViewCtrl() { InitializeIIDs(&IID_DHMTabView, &IID_DHMTabViewEvents);
// TODO: Initialize your control's instance data here.
}
/////////////////////////////////////////////////////////////////////////////
// CHMTabViewCtrl::~CHMTabViewCtrl - Destructor
CHMTabViewCtrl::~CHMTabViewCtrl() { // TODO: Cleanup your control's instance data here.
}
/////////////////////////////////////////////////////////////////////////////
// CHMTabViewCtrl::OnDraw - Drawing function
void CHMTabViewCtrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) { pdc->FillSolidRect(rcBounds, GetSysColor(COLOR_3DFACE)); }
/////////////////////////////////////////////////////////////////////////////
// CHMTabViewCtrl::DoPropExchange - Persistence support
void CHMTabViewCtrl::DoPropExchange(CPropExchange* pPX) { ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor)); COleControl::DoPropExchange(pPX);
// TODO: Call PX_ functions for each persistent custom property.
}
/////////////////////////////////////////////////////////////////////////////
// CHMTabViewCtrl::OnResetState - Reset control to default state
void CHMTabViewCtrl::OnResetState() { COleControl::OnResetState(); // Resets defaults found in DoPropExchange
// TODO: Reset any other control state here.
}
/////////////////////////////////////////////////////////////////////////////
// CHMTabViewCtrl::AboutBox - Display an "About" box to the user
void CHMTabViewCtrl::AboutBox() { CDialog dlgAbout(IDD_ABOUTBOX_HMTABVIEW); dlgAbout.DoModal(); }
/////////////////////////////////////////////////////////////////////////////
// Operations
void CHMTabViewCtrl::OnSelChangeTabs(int iItem) { CCtrlWnd* pWnd = NULL; for( int i = 0; i < m_Controls.GetSize(); i++ ) { if( i == iItem ) { pWnd = m_Controls[i]; } else { m_Controls[i]->ShowWindow(SW_HIDE); } }
if( pWnd ) { pWnd->ShowWindow(SW_SHOW); pWnd->Invalidate(TRUE); pWnd->UpdateWindow(); } }
/////////////////////////////////////////////////////////////////////////////
// CHMTabViewCtrl message handlers
int CHMTabViewCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; m_TabCtrl.Create( TCS_TABS | TCS_FLATBUTTONS | WS_CHILD | WS_VISIBLE, CRect(0,0,10,10), this, 0x1006);
// init position for the window
int cx=-1; int cy=-1; GetControlSize(&cx,&cy);
m_TabCtrl.SetWindowPos(NULL,0,0,cx,cy-2,SWP_NOZORDER|SWP_SHOWWINDOW);
return 0; }
void CHMTabViewCtrl::OnSize(UINT nType, int cx, int cy) { COleControl::OnSize(nType, cx, cy); if( GetSafeHwnd() ) { CRect rcControl; GetClientRect(rcControl); m_TabCtrl.SetWindowPos(NULL,0,0,rcControl.Width(),rcControl.Height()-2,SWP_NOZORDER|SWP_SHOWWINDOW);
CRect rcDisplay; m_TabCtrl.GetWindowRect(rcDisplay); ScreenToClient(rcDisplay); m_TabCtrl.AdjustRect(FALSE,rcDisplay); rcDisplay.top += 4; rcDisplay.bottom -= 8; for( int i = 0; i < m_Controls.GetSize(); i++ ) { m_Controls[i]->SetWindowPos(NULL,rcDisplay.left,rcDisplay.top,rcDisplay.Width(),rcDisplay.Height(),SWP_NOZORDER); if( m_TabCtrl.GetCurSel() != i ) { m_Controls[i]->ShowWindow(SW_HIDE); } } } }
BOOL CHMTabViewCtrl::InsertItem(long lMask, long lItem, LPCTSTR lpszItem, long lImage, long lParam) { CCtrlWnd* pCtrlWnd = new CCtrlWnd; if( ! pCtrlWnd->Create(NULL,NULL,WS_CHILD,CRect(0,0,10,10),&m_TabCtrl,500+lItem) ) { delete pCtrlWnd; return FALSE; }
m_Controls.InsertAt(lItem,pCtrlWnd); CRect rcDisplay; GetClientRect(rcDisplay); m_TabCtrl.AdjustRect(FALSE,rcDisplay); pCtrlWnd->SetWindowPos(NULL,rcDisplay.left,rcDisplay.top,rcDisplay.Width(),rcDisplay.Height(),SWP_NOZORDER);
if( lItem == 0 ) { pCtrlWnd->ShowWindow(SW_SHOW); } else { pCtrlWnd->ShowWindow(SW_HIDE); m_Controls[0]->Invalidate(); m_Controls[0]->UpdateWindow(); }
return m_TabCtrl.InsertItem(lMask,lItem,lpszItem,lImage,lParam); }
BOOL CHMTabViewCtrl::DeleteItem(long lItem) { if( lItem >= m_Controls.GetSize() || lItem < 0 ) { return FALSE; }
m_Controls[lItem]->DestroyWindow(); m_Controls.RemoveAt(lItem); return m_TabCtrl.DeleteItem(lItem); }
BOOL CHMTabViewCtrl::DeleteAllItems() { for( int i = 0; i < m_Controls.GetSize(); i++ ) { m_Controls[i]->DestroyWindow(); } return m_TabCtrl.DeleteAllItems(); }
BOOL CHMTabViewCtrl::CreateControl(long lItem, LPCTSTR lpszControlID) { if( lItem >= m_Controls.GetSize() || lItem < 0 ) { return FALSE; }
CCtrlWnd* pCtrlWnd = m_Controls[lItem]; if( pCtrlWnd == NULL ) { return FALSE; }
BOOL bResult = pCtrlWnd->CreateControl(lpszControlID); pCtrlWnd->ShowWindow(SW_SHOW); pCtrlWnd->Invalidate(); pCtrlWnd->UpdateWindow();
return bResult; }
LPUNKNOWN CHMTabViewCtrl::GetControl(long lItem) { if( lItem >= m_Controls.GetSize() || lItem < 0 ) { return NULL; }
return m_Controls[lItem]->GetControlIUnknown(); }
|