home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
msdn_vcb
/
samples
/
vc98
/
com
/
inproc
/
ipdrive
/
ipdrivw.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-04-02
|
7KB
|
281 lines
// ipdrivw.cpp : implementation of the CDriverView class
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1995 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 "ipdrive.h"
#include "ipdridoc.h"
#include "ipdrivw.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDriverView
IMPLEMENT_DYNCREATE(CDriverView, CFormView)
BEGIN_MESSAGE_MAP(CDriverView, CFormView)
//{{AFX_MSG_MAP(CDriverView)
ON_BN_CLICKED(ID_LOOKUP, OnLookup)
ON_BN_CLICKED(ID_REMOVE, OnRemove)
ON_BN_CLICKED(ID_ADD, OnAdd)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDriverView construction/destruction
CDriverView::CDriverView()
: CFormView(CDriverView::IDD)
{
//{{AFX_DATA_INIT(CDriverView)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_bInitialized = FALSE;
}
CDriverView::~CDriverView()
{
}
void CDriverView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDriverView)
DDX_Control(pDX, IDC_EDIT2, m_toValue);
DDX_Control(pDX, IDC_COMBO3, m_toType);
DDX_Control(pDX, IDC_EDIT1, m_ctrlValue);
DDX_Control(pDX, IDC_COMBO2, m_ctrlType);
//}}AFX_DATA_MAP
}
/////////////////////////////////////////////////////////////////////////////
// CDriverView diagnostics
#ifdef _DEBUG
void CDriverView::AssertValid() const
{
CFormView::AssertValid();
}
void CDriverView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CDriverDoc* CDriverView::GetDocument() // non-debug version is inline
{
return STATIC_DOWNCAST(CDriverDoc, m_pDocument);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDriverView message handlers
void CDriverView::OnInitialUpdate()
{
GetParentFrame()->RecalcLayout();
ResizeParentToFit(FALSE);
CFormView::OnInitialUpdate();
if (!m_bInitialized)
{
m_bInitialized = TRUE;
GetDlgItem(IDC_CURRENT_COUNT)->GetWindowText(m_strCurrentCount);
}
// initialize the form
m_ctrlType.SetCurSel(0);
UpdateToNothing();
}
void CDriverView::UpdateToNothing()
{
UpdateCurrentCount();
m_toType.SetCurSel(-1);
CString str;
str.LoadString(IDS_NOTHING);
m_toValue.SetWindowText(str);
}
void CDriverView::UpdateCurrentCount()
{
CDriverDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CString str;
str.Format(m_strCurrentCount, pDoc->m_map->Count);
SetDlgItemText(IDC_CURRENT_COUNT, str);
}
_variant_t CDriverView::GetFromVariant()
{
CString strValue;
m_ctrlValue.GetWindowText(strValue);
// we can just throw it in as a string, then coerce to chosen type
_variant_t va = (LPCTSTR) strValue, vaTemp;
try
{
vaTemp.ChangeType(max(0, m_ctrlType.GetCurSel()), &va);
}
catch (_com_error& e)
{
dump_com_error(e);
AfxMessageBox(IDP_INCOMPATIBLE_TYPE_VALUE);
}
return vaTemp;
}
_variant_t CDriverView::GetToVariant()
{
CString strValue;
m_toValue.GetWindowText(strValue);
// we can just throw it in as a string, then coerce to chosen type
_variant_t va = (LPCTSTR) strValue, vaTemp;
try
{
vaTemp.ChangeType(max(0, m_toType.GetCurSel()), &va);
}
catch (_com_error& e)
{
dump_com_error(e);
AfxMessageBox(IDP_INCOMPATIBLE_TYPE_VALUE);
}
return vaTemp;
}
void CDriverView::UpdateCurrentVariant(const _variant_t& va)
{
m_toType.SetCurSel(va.vt);
_variant_t vaTemp;
CString str;
try
{
vaTemp.ChangeType(VT_BSTR, &va);
str = (LPCTSTR) (_bstr_t) vaTemp;
}
catch (...)
{
str.LoadString(IDS_UNKNOWN);
}
m_toValue.SetWindowText(str);
}
void CDriverView::OnLookup()
{
CDriverDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
_variant_t vaFrom = GetFromVariant();
_variant_t vaTo = pDoc->m_map->Item[vaFrom];
UpdateCurrentVariant(vaTo);
}
void CDriverView::OnRemove()
{
CDriverDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
_variant_t vaFrom = GetFromVariant();
pDoc->m_map->RemoveKey(vaFrom);
UpdateToNothing();
UpdateCurrentCount();
}
void CDriverView::OnAdd()
{
CDriverDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
_variant_t vaFrom = GetFromVariant();
_variant_t vaTo = GetToVariant();
pDoc->m_map->SetAt(vaFrom, vaTo);
OnLookup();
UpdateCurrentCount();
}
void CDriverView::OnButton1()
{
CDriverDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
long nCount = 0;
DWORD dwThen = GetTickCount();
if (GetKeyState(VK_CONTROL) >= 0)
{
while (GetTickCount() - dwThen < 5000)
{
pDoc->m_map->str1 = _T("Hello, World");
++nCount;
}
}
else
{
while (GetTickCount() - dwThen < 5000)
{
pDoc->m_map->i1 = 1;
++nCount;
}
}
CString str, strFormat;
strFormat.LoadString(IDP_TIMING_RESULT);
str.Format(strFormat, nCount);
AfxMessageBox(str);
}
void CDriverView::OnButton2()
{
CDriverDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
long nCount = 0;
DWORD dwThen = GetTickCount();
if (GetKeyState(VK_CONTROL) >= 0)
{
while (GetTickCount() - dwThen < 5000)
{
pDoc->m_map->str2 = _T("Hello, World");
++nCount;
}
}
else
{
while (GetTickCount() - dwThen < 5000)
{
pDoc->m_map->i2 = 1;
++nCount;
}
}
CString str, strFormat;
strFormat.LoadString(IDP_TIMING_RESULT);
str.Format(strFormat, nCount);
AfxMessageBox(str);
}