home *** CD-ROM | disk | FTP | other *** search
/ Building OCXs / Building_OCXs_Que_1995.iso / code / ch04 / quotectl.cpp < prev    next >
C/C++ Source or Header  |  1994-12-17  |  9KB  |  301 lines

  1. //------------------------------------------------------------------//
  2. // Implementation of CQuoteCtrl OLE control class                    //
  3. //                                                                    //
  4. // System:    Simple first control.                                   //
  5. //            Developing Applications with OCX                        //
  6. // Module:    CQuoteCtrl class implementation                            //
  7. // Date:    1/11/1994                                                //
  8. // Rev:        1.0                                                           //
  9. //                                                                       //
  10. // Author:    John Toohey                                                   //
  11. //                                                                       //
  12. //------------------------------------------------------------------//
  13.  
  14. #include "stdafx.h"
  15. #include "quote.h"
  16. #include "quotectl.h"
  17. #include "quoteppg.h"
  18.  
  19.  
  20. #ifdef _DEBUG
  21. #undef THIS_FILE
  22. static char BASED_CODE THIS_FILE[] = __FILE__;
  23. #endif
  24.  
  25.  
  26. IMPLEMENT_DYNCREATE(CQuoteCtrl, COleControl)
  27.  
  28.  
  29. /////////////////////////////////////////////////////////////////////////////
  30. // Message map
  31.  
  32. BEGIN_MESSAGE_MAP(CQuoteCtrl, COleControl)
  33.     //{{AFX_MSG_MAP(CQuoteCtrl)
  34.     ON_WM_LBUTTONDBLCLK()
  35.     //}}AFX_MSG_MAP
  36.     ON_OLEVERB(AFX_IDS_VERB_EDIT, OnEdit)
  37.     ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
  38. END_MESSAGE_MAP()
  39.  
  40.  
  41. /////////////////////////////////////////////////////////////////////////////
  42. // Dispatch map
  43. //
  44. BEGIN_DISPATCH_MAP(CQuoteCtrl, COleControl)
  45.     //{{AFX_DISPATCH_MAP(CQuoteCtrl)
  46.     DISP_PROPERTY_NOTIFY(CQuoteCtrl, "ShowAuthor", m_showAuthor, OnShowAuthorChanged, VT_BOOL)
  47.     DISP_STOCKPROP_BACKCOLOR()
  48.     DISP_STOCKPROP_FORECOLOR()
  49.     DISP_STOCKPROP_FONT()
  50.     //}}AFX_DISPATCH_MAP
  51.     DISP_FUNCTION_ID(CQuoteCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
  52. END_DISPATCH_MAP()
  53.  
  54.  
  55. /////////////////////////////////////////////////////////////////////////////
  56. // Event map
  57. //
  58. BEGIN_EVENT_MAP(CQuoteCtrl, COleControl)
  59.     //{{AFX_EVENT_MAP(CQuoteCtrl)
  60.     EVENT_STOCK_DBLCLICK()
  61.     //}}AFX_EVENT_MAP
  62. END_EVENT_MAP()
  63.  
  64.  
  65. /////////////////////////////////////////////////////////////////////////////
  66. // Property pages
  67. //  Remember to increase the count!
  68. BEGIN_PROPPAGEIDS(CQuoteCtrl, 3)
  69.     PROPPAGEID(CQuotePropPage::guid)
  70.     PROPPAGEID(CLSID_CColorPropPage)
  71.     PROPPAGEID(CLSID_CFontPropPage)
  72. END_PROPPAGEIDS(CQuoteCtrl)
  73.  
  74. /////////////////////////////////////////////////////////////////////////////
  75. // Initialize class factory and guid
  76. //
  77. IMPLEMENT_OLECREATE_EX(CQuoteCtrl, "QUOTE.QuoteCtrl.1",
  78.     0x7c647080, 0xf1cb, 0x101b, 0x81, 0xec, 0xb2, 0x31, 0x69, 0x42, 0x46, 0x30)
  79.  
  80.  
  81. /////////////////////////////////////////////////////////////////////////////
  82. // Type library ID and version
  83. //
  84. IMPLEMENT_OLETYPELIB(CQuoteCtrl, _tlid, _wVerMajor, _wVerMinor)
  85.  
  86.  
  87. /////////////////////////////////////////////////////////////////////////////
  88. // Interface IDs
  89. //
  90. const IID BASED_CODE IID_DQuote =
  91.         { 0x7c647081, 0xf1cb, 0x101b, { 0x81, 0xec, 0xb2, 0x31, 0x69, 0x42, 0x46, 0x30 } };
  92. const IID BASED_CODE IID_DQuoteEvents =
  93.         { 0x7c647082, 0xf1cb, 0x101b, { 0x81, 0xec, 0xb2, 0x31, 0x69, 0x42, 0x46, 0x30 } };
  94.  
  95.  
  96. /////////////////////////////////////////////////////////////////////////////
  97. // Control type information
  98. //
  99. static const DWORD BASED_CODE _dwQuoteOleMisc =
  100.     OLEMISC_ACTIVATEWHENVISIBLE |
  101.     OLEMISC_SETCLIENTSITEFIRST |
  102.     OLEMISC_INSIDEOUT |
  103.     OLEMISC_CANTLINKINSIDE |
  104.     OLEMISC_RECOMPOSEONRESIZE;
  105.  
  106. IMPLEMENT_OLECTLTYPE(CQuoteCtrl, IDS_QUOTE, _dwQuoteOleMisc)
  107.  
  108.  
  109. /////////////////////////////////////////////////////////////////////////////
  110. // CQuoteCtrl::CQuoteCtrlFactory::UpdateRegistry -
  111. // Adds or removes system registry entries for CQuoteCtrl
  112. //
  113. BOOL CQuoteCtrl::CQuoteCtrlFactory::UpdateRegistry(BOOL bRegister)
  114. {
  115.     if (bRegister)
  116.         return AfxOleRegisterControlClass(
  117.             AfxGetInstanceHandle(),
  118.             m_clsid,
  119.             m_lpszProgID,
  120.             IDS_QUOTE,
  121.             IDB_QUOTE,
  122.             TRUE,                       //  Insertable
  123.             _dwQuoteOleMisc,
  124.             _tlid,
  125.             _wVerMajor,
  126.             _wVerMinor);
  127.     else
  128.         return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
  129. }
  130.  
  131.  
  132. /////////////////////////////////////////////////////////////////////////////
  133. // Licensing strings
  134.  
  135. static const TCHAR BASED_CODE _szLicFileName[] = _T("QUOTE.LIC");
  136.  
  137. static const TCHAR BASED_CODE _szLicString[] =
  138.     _T("Copyright (c) 1994 Tangent Software");
  139.  
  140.  
  141. /////////////////////////////////////////////////////////////////////////////
  142. // CQuoteCtrl::CQuoteCtrlFactory::VerifyUserLicense -
  143. // Checks for existence of a user license
  144.  
  145. BOOL CQuoteCtrl::CQuoteCtrlFactory::VerifyUserLicense()
  146. {
  147.     return AfxVerifyLicFile(AfxGetInstanceHandle(), _szLicFileName,
  148.         _szLicString);
  149.  
  150.     BOOL bfound = AfxVerifyLicFile(AfxGetInstanceHandle(), _szLicFileName,
  151.                                         _szLicString);
  152.  
  153.     if (bfound)
  154.         AfxMessageBox(_T("Found license file"));
  155.     else
  156.         AfxMessageBox(_T("License file NOT found"));
  157.  
  158.     return (bfound);
  159. }
  160.  
  161.  
  162. /////////////////////////////////////////////////////////////////////////////
  163. // CQuoteCtrl::CQuoteCtrlFactory::GetLicenseKey -
  164. // Returns a runtime licensing key
  165.  
  166. BOOL CQuoteCtrl::CQuoteCtrlFactory::GetLicenseKey(DWORD dwReserved,
  167.     BSTR FAR* pbstrKey)
  168. {
  169.     if (pbstrKey == NULL)
  170.         return FALSE;
  171.  
  172.     *pbstrKey = SysAllocString(_szLicString);
  173.     return (*pbstrKey != NULL);
  174. }
  175.  
  176.  
  177. /////////////////////////////////////////////////////////////////////////////
  178. // CQuoteCtrl::CQuoteCtrl - Constructor
  179. //
  180. CQuoteCtrl::CQuoteCtrl()
  181. {
  182.     InitializeIIDs(&IID_DQuote, &IID_DQuoteEvents);
  183.  
  184.     m_bstrQuote[0] = SysAllocString(_T("If a headline ends in a question mark, the answer is no"));
  185.     m_bstrQuote[1] = SysAllocString(_T("Nothings is ever so bad that it can't get worse"));
  186.     m_bstrQuote[2] = SysAllocString(_T("A crisis is when you can't say, Let's forget the whole thing."));
  187.     m_bstrQuote[3] = SysAllocString(_T("If you mess with a thing long enough, it will break."));
  188.     m_bstrQuote[4] = SysAllocString(_T("It is easier to get forgiveness than permission."));
  189.     m_bstrQuote[5] = SysAllocString(_T("If you can't fix it, feature it"));
  190.  
  191.     m_bstrAuthor[0] = SysAllocString(_T("Davis' Law"));
  192.     m_bstrAuthor[1] = SysAllocString(_T("Murphy"));
  193.     m_bstrAuthor[2] = SysAllocString(_T("Ferguson"));
  194.     m_bstrAuthor[3] = SysAllocString(_T("Schmidt's Law"));
  195.     m_bstrAuthor[4] = SysAllocString(_T("Stewart's Law of Retroaction"));
  196.     m_bstrAuthor[5] = SysAllocString(_T("Last Law of Product Design"));
  197.  
  198.     m_nQID = 0;
  199.  
  200.     SetInitialSize(400,50);
  201.  
  202.     //----
  203.     // Set the default values to the 
  204.     // current ambient properties.
  205.     SetForeColor(AmbientForeColor());
  206.     SetBackColor(AmbientBackColor());
  207. }
  208.  
  209. /////////////////////////////////////////////////////////////////////////////
  210. // CQuoteCtrl::~CQuoteCtrl - Destructor
  211. //
  212. CQuoteCtrl::~CQuoteCtrl()
  213. {
  214.     for(int i = 0; i < MAXQUOTES;i++)
  215.     {
  216.         SysFreeString(m_bstrQuote[i]);
  217.     }
  218. }
  219. /////////////////////////////////////////////////////////////////////////////
  220. // CQuoteCtrl::OnDraw - Drawing function
  221. //
  222. void CQuoteCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
  223. {
  224.  
  225.     CFont* pOldFont;
  226.  
  227.     //---
  228.     // Get stock properties - foreground & background colour & Font.
  229.  
  230.     CBrush bkBrush(TranslateColor(GetBackColor()));
  231.     pdc->SetTextColor(TranslateColor(GetForeColor()));
  232.     pdc->SetBkColor(TranslateColor(GetBackColor()));
  233.     pOldFont = SelectStockFont(pdc);
  234.     pdc->SetBkMode(TRANSPARENT);
  235.     
  236.  
  237.     pdc->FillRect(rcBounds, &bkBrush);
  238.     if(m_showAuthor)
  239.     {
  240.         CString s =  m_bstrQuote[m_nQID];
  241.         s += "\n ";
  242.         s += m_bstrAuthor[m_nQID];
  243.         pdc->DrawText(s,-1,rcBounds,DT_CENTER);
  244.     }
  245.     else
  246.         pdc->DrawText(m_bstrQuote[m_nQID],-1,rcBounds,DT_CENTER|DT_VCENTER);
  247.  
  248.     //---
  249.     // Clean up.
  250.     pdc->SelectObject(pOldFont);
  251. }
  252. /////////////////////////////////////////////////////////////////////////////
  253. // CQuoteCtrl::DoPropExchange - Persistence support
  254. //
  255. void CQuoteCtrl::DoPropExchange(CPropExchange* pPX)
  256. {
  257.     ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
  258.     
  259.     //---
  260.     // Set the default values for our custom properties.
  261.     PX_Bool(pPX, _T("ShowAuthor"), m_showAuthor,TRUE);
  262.  
  263.     COleControl::DoPropExchange(pPX);
  264. }
  265. /////////////////////////////////////////////////////////////////////////////
  266. // CQuoteCtrl::OnResetState - Reset control to default state
  267. //
  268. void CQuoteCtrl::OnResetState()
  269. {
  270.     COleControl::OnResetState();  // Resets defaults found in DoPropExch