home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / atl / atlduck / duckdoer.cpp < prev    next >
C/C++ Source or Header  |  1998-03-26  |  3KB  |  90 lines

  1. // DuckDoer.cpp : Implementation of CDuckDoer
  2. //
  3. // This is a part of the Active Template Library.
  4. // Copyright (C) 1996-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Active Template Library Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Active Template Library product.
  12.  
  13. #include "stdafx.h"
  14. #include "atlduck.h"
  15. #include "DuckDoer.h"
  16.  
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CDuckDoer
  19.  
  20. const IID IID_IDuckInt = {0x120B72AE,0x65BF,0x11D0,{0x9D,0xDC,0x00,0xA0,0xC9,0x03,0x48,0x92}};
  21.  
  22. // static class members
  23. CDuckDoerDlg* CDuckDoer::m_pDlg = NULL;
  24.  
  25.  
  26. STDMETHODIMP CDuckDoer::Advise(IUnknown* pUnk, DWORD* pdwCookie)
  27. {
  28.     if (!m_bLocked)  // lock the server on the first advise received
  29.     {
  30.         ((IDuckDoer*)this)->AddRef();
  31.         m_bLocked = TRUE;
  32.     }
  33.  
  34.     HRESULT hr = CProxyIDuckInt<CDuckDoer>::Advise(pUnk, pdwCookie);
  35.     if (SUCCEEDED(hr))
  36.     {
  37.         TCHAR szCookieItem[50];
  38.         _stprintf(szCookieItem, _T("Cookie %9d.\t(pUnk = %p)"), *pdwCookie, *pUnk);
  39.         _ASSERT(m_pDlg != NULL);
  40.  
  41.         if (!m_pDlg->IsWindowVisible())
  42.             m_pDlg->ShowWindow(SW_SHOWNORMAL);
  43.  
  44.         HWND hwndListBox = m_pDlg->GetDlgItem(IDC_LISTCONNPTS);
  45.         SendMessage(hwndListBox, LB_ADDSTRING, 0, (LPARAM)(TCHAR*)szCookieItem);
  46.  
  47.         m_pDlg->RecalcListboxExtent(szCookieItem);
  48.  
  49.         // enable all the dialog buttons for connection points
  50.         _ASSERT(m_pDlg != NULL);
  51.         ::EnableWindow(m_pDlg->GetDlgItem(IDC_QUACK), TRUE);
  52.         ::EnableWindow(m_pDlg->GetDlgItem(IDC_FLAP), TRUE);
  53.         ::EnableWindow(m_pDlg->GetDlgItem(IDC_PADDLE), TRUE);
  54.         ::EnableWindow(m_pDlg->GetDlgItem(IDC_WALK), TRUE);
  55.         ::EnableWindow(m_pDlg->GetDlgItem(IDOK), FALSE);
  56.     }
  57.  
  58.     return hr;
  59. }
  60.  
  61. STDMETHODIMP CDuckDoer::Unadvise(DWORD dwCookie)
  62. {
  63.     HRESULT hr = CProxyIDuckInt<CDuckDoer>::Unadvise(dwCookie);
  64.     if (SUCCEEDED(hr))
  65.     {
  66.         TCHAR szCookieItem[50];
  67.         _stprintf(szCookieItem, _T("Cookie %9d."), dwCookie);
  68.         _ASSERT(m_pDlg != NULL);
  69.         HWND hwndListBox = m_pDlg->GetDlgItem(IDC_LISTCONNPTS);
  70.         int nIndex = SendMessage(hwndListBox, LB_FINDSTRING, -1, (LPARAM)szCookieItem);
  71.         _ASSERT(nIndex != LB_ERR);  // the entry has to be in the listbox.
  72.         SendMessage(hwndListBox, LB_GETTEXT, nIndex, (LPARAM)szCookieItem);
  73.         SendMessage(hwndListBox, LB_DELETESTRING, nIndex, 0);
  74.         m_pDlg->RecalcListboxExtent(szCookieItem, FALSE/*bAdded*/);
  75.         int nItems = SendMessage(hwndListBox, LB_GETCOUNT, 0, 0);
  76.         _ASSERT(nItems != LB_ERR);
  77.         if (nItems == 0)  // the listbox is empty change button settings
  78.         {
  79.             _ASSERT(m_pDlg != NULL);
  80.             ::EnableWindow(m_pDlg->GetDlgItem(IDC_QUACK), FALSE);
  81.             ::EnableWindow(m_pDlg->GetDlgItem(IDC_FLAP), FALSE);
  82.             ::EnableWindow(m_pDlg->GetDlgItem(IDC_PADDLE), FALSE);
  83.             ::EnableWindow(m_pDlg->GetDlgItem(IDC_WALK), FALSE);
  84.             ::EnableWindow(m_pDlg->GetDlgItem(IDOK), TRUE);
  85.         }
  86.     }
  87.  
  88.     return hr;
  89. }
  90.