home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
msdn_vcb
/
samples
/
vc98
/
mfc
/
ole
/
ipdrive
/
ipdrivw.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-03-26
|
7KB
|
305 lines
// ipdrivw.cpp : implementation of the CDriverView 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 "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;
#if (_MFC_VER > 0x300)
str.Format(m_strCurrentCount, pDoc->m_map.GetCount());
#else
wsprintf(str.GetBuffer(256), m_strCurrentCount,
pDoc->m_map.GetCount());
str.ReleaseBuffer();
#endif
SetDlgItemText(IDC_CURRENT_COUNT, str);
}
VARIANT CDriverView::GetFromVariant()
{
CString strValue;
m_ctrlValue.GetWindowText(strValue);
// we can just throw it in as a string, then coerce to chosen type
VARIANT va;
VariantInit(&va);
va.vt = VT_BSTR;
va.bstrVal = strValue.AllocSysString();
VARTYPE vt = max(0, m_ctrlType.GetCurSel());
VARIANT vaTemp;
VariantInit(&vaTemp);
if (FAILED(VariantChangeType(&vaTemp, &va, 0, vt)))
{
AfxMessageBox(IDP_INCOMPATIBLE_TYPE_VALUE);
AfxThrowUserException();
}
VariantClear(&va);
return vaTemp;
}
VARIANT CDriverView::GetToVariant()
{
CString strValue;
m_toValue.GetWindowText(strValue);
// we can just throw it in as a string, then coerce to chosen type
VARIANT va;
VariantInit(&va);
va.vt = VT_BSTR;
va.bstrVal = strValue.AllocSysString();
VARTYPE vt = max(0, m_toType.GetCurSel());
VARIANT vaTemp;
VariantInit(&vaTemp);
if (FAILED(VariantChangeType(&vaTemp, &va, 0, vt)))
{
AfxMessageBox(IDP_INCOMPATIBLE_TYPE_VALUE);
AfxThrowUserException();
}
VariantClear(&va);
return vaTemp;
}
void CDriverView::UpdateCurrentVariant(VARIANT& va)
{
m_toType.SetCurSel(va.vt);
VARIANT vaTemp;
VariantInit(&vaTemp);
CString str;
if (FAILED(VariantChangeType(&vaTemp, &va, 0, VT_BSTR)))
str.LoadString(IDS_UNKNOWN);
else
str = vaTemp.bstrVal;
m_toValue.SetWindowText(str);
VariantClear(&vaTemp);
}
void CDriverView::OnLookup()
{
CDriverDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
VARIANT vaFrom = GetFromVariant();
VARIANT vaTo = pDoc->m_map.GetItem(vaFrom);
UpdateCurrentVariant(vaTo);
VariantClear(&vaTo);
VariantClear(&vaFrom);
}
void CDriverView::OnRemove()
{
CDriverDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
VARIANT vaFrom = GetFromVariant();
pDoc->m_map.RemoveKey(vaFrom);
VariantClear(&vaFrom);
UpdateToNothing();
UpdateCurrentCount();
}
void CDriverView::OnAdd()
{
CDriverDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
VARIANT vaFrom = GetFromVariant();
VARIANT vaTo = GetToVariant();
pDoc->m_map.SetAt(vaFrom, vaTo);
VariantClear(&vaFrom);
VariantClear(&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.SetStr1(_T("Hello, World"));
++nCount;
}
}
else
{
while (GetTickCount() - dwThen < 5000)
{
pDoc->m_map.SetI1(1);
++nCount;
}
}
CString str, strFormat;
strFormat.LoadString(IDP_TIMING_RESULT);
#if (_MFC_VER > 0x300)
str.Format(strFormat, nCount);
#else
wsprintf(str.GetBuffer(256), strFormat, nCount);
str.ReleaseBuffer();
#endif
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.SetStr2(_T("Hello, World"));
++nCount;
}
}
else
{
while (GetTickCount() - dwThen < 5000)
{
pDoc->m_map.SetI2(1);
++nCount;
}
}
CString str, strFormat;
strFormat.LoadString(IDP_TIMING_RESULT);
#if (_MFC_VER > 0x300)
str.Format(strFormat, nCount);
#else
wsprintf(str.GetBuffer(256), strFormat, nCount);
str.ReleaseBuffer();
#endif
AfxMessageBox(str);
}