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

  1. // ThelpCtl.cpp : Implementation of the CTesthelpCtrl OLE control class.
  2.  
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13. #include "stdafx.h"
  14. #include "testhelp.h"
  15. #include "ThelpCtl.h"
  16. #include "ThelpPpg.h"
  17.  
  18.  
  19. #ifdef _DEBUG
  20. #define new DEBUG_NEW
  21. #undef THIS_FILE
  22. static char THIS_FILE[] = __FILE__;
  23. #endif
  24.  
  25.  
  26. // This help id is also defined and used in the
  27. // testhelp.hpj help project file.  It references
  28. // a topic in the testhelp.hlp help file.
  29.  
  30. #define IDH_WHATISTHISTHING 18001
  31.  
  32. IMPLEMENT_DYNCREATE(CTesthelpCtrl, COleControl)
  33.  
  34.  
  35. /////////////////////////////////////////////////////////////////////////////
  36. // Message map
  37.  
  38. BEGIN_MESSAGE_MAP(CTesthelpCtrl, COleControl)
  39.           //{{AFX_MSG_MAP(CTesthelpCtrl)
  40.           ON_WM_CREATE()
  41.           ON_WM_LBUTTONDOWN()
  42.           ON_WM_LBUTTONUP()
  43.           ON_WM_MOUSEMOVE()
  44.  
  45.     //}}AFX_MSG_MAP
  46.           ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
  47.  
  48.           ON_MESSAGE(WM_HELP,OnHelpCommand)  //We'll respond to the WM_HELP message
  49.                                                                                              //to display help for the control
  50.  
  51. END_MESSAGE_MAP()
  52.  
  53.  
  54. /////////////////////////////////////////////////////////////////////////////
  55. // Dispatch map
  56.  
  57. BEGIN_DISPATCH_MAP(CTesthelpCtrl, COleControl)
  58.           //{{AFX_DISPATCH_MAP(CTesthelpCtrl)
  59.           DISP_PROPERTY_NOTIFY(CTesthelpCtrl, "Name1", m_szName1, OnName1Changed, VT_BSTR)
  60.           DISP_PROPERTY_NOTIFY(CTesthelpCtrl, "Name2", m_szName2, OnName2Changed, VT_BSTR)
  61.           DISP_PROPERTY_NOTIFY(CTesthelpCtrl, "Name3", m_szName3, OnName3Changed, VT_BSTR)
  62.           DISP_PROPERTY_NOTIFY(CTesthelpCtrl, "UseMyHelp", m_bUseMyHelp, OnUseMyHelpChanged, VT_BOOL)
  63.           DISP_PROPERTY_NOTIFY(CTesthelpCtrl, "ShowToolTip", m_bShowToolTip, OnShowToolTipChanged, VT_BOOL)
  64.           DISP_PROPERTY_NOTIFY(CTesthelpCtrl, "ToolTipText", m_szToolTipText, OnToolTipTextChanged, VT_BSTR)
  65.           DISP_PROPERTY_NOTIFY(CTesthelpCtrl, "UsePopupHelp", m_nUsePopupHelp, OnUsePopupHelpChanged, VT_I2)
  66.           DISP_STOCKPROP_FONT()
  67.           DISP_STOCKPROP_BACKCOLOR()
  68.           DISP_STOCKPROP_FORECOLOR()
  69.           DISP_STOCKPROP_BORDERSTYLE()
  70.     //}}AFX_DISPATCH_MAP
  71.           DISP_FUNCTION_ID(CTesthelpCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
  72. END_DISPATCH_MAP()
  73.  
  74.  
  75. /////////////////////////////////////////////////////////////////////////////
  76. // Event map
  77.  
  78. BEGIN_EVENT_MAP(CTesthelpCtrl, COleControl)
  79.           //{{AFX_EVENT_MAP(CTesthelpCtrl)
  80.           // NOTE - ClassWizard will add and remove event map entries
  81.           //    DO NOT EDIT what you see in these blocks of generated code !
  82.           //}}AFX_EVENT_MAP
  83. END_EVENT_MAP()
  84.  
  85.  
  86. /////////////////////////////////////////////////////////////////////////////
  87. // Property pages
  88.  
  89. // TODO: Add more property pages as needed.  Remember to increase the count!
  90. BEGIN_PROPPAGEIDS(CTesthelpCtrl, 3)
  91.           PROPPAGEID(CTesthelpPropPage::guid)
  92.           // added stock property pages
  93.           PROPPAGEID(CLSID_CColorPropPage);
  94.           PROPPAGEID(CLSID_CFontPropPage);
  95.  
  96. END_PROPPAGEIDS(CTesthelpCtrl)
  97.  
  98.  
  99. /////////////////////////////////////////////////////////////////////////////
  100. // Initialize class factory and guid
  101.  
  102. IMPLEMENT_OLECREATE_EX(CTesthelpCtrl, "TESTHELP.TesthelpCtrl.1",
  103.     0x31a2b283, 0x8c11, 0x11cf, 0xb3, 0x7f, 0, 0xaa, 0, 0xb9, 0x2b, 0x50)
  104.  
  105.  
  106. /////////////////////////////////////////////////////////////////////////////
  107. // Type library ID and version
  108.  
  109. IMPLEMENT_OLETYPELIB(CTesthelpCtrl, _tlid, _wVerMajor, _wVerMinor)
  110.  
  111.  
  112. /////////////////////////////////////////////////////////////////////////////
  113. // Interface IDs
  114.  
  115. const IID BASED_CODE IID_DTesthelp =
  116.         { 0x31a2b281, 0x8c11, 0x11cf, { 0xb3, 0x7f, 0, 0xaa, 0, 0xb9, 0x2b, 0x50 } };
  117. const IID BASED_CODE IID_DTesthelpEvents =
  118.         { 0x31a2b282, 0x8c11, 0x11cf, { 0xb3, 0x7f, 0, 0xaa, 0, 0xb9, 0x2b, 0x50 } };
  119.  
  120.  
  121. /////////////////////////////////////////////////////////////////////////////
  122. // Control type information
  123.  
  124. static const DWORD BASED_CODE _dwTesthelpOleMisc =
  125.     OLEMISC_ACTIVATEWHENVISIBLE |
  126.     OLEMISC_SETCLIENTSITEFIRST |
  127.     OLEMISC_INSIDEOUT |
  128.     OLEMISC_CANTLINKINSIDE |
  129.     OLEMISC_RECOMPOSEONRESIZE;
  130.  
  131. IMPLEMENT_OLECTLTYPE(CTesthelpCtrl, IDS_TESTHELP, _dwTesthelpOleMisc)
  132.  
  133.  
  134. /////////////////////////////////////////////////////////////////////////////
  135. // CTesthelpCtrl::CTesthelpCtrlFactory::UpdateRegistry -
  136. // Adds or removes system registry entries for CTesthelpCtrl
  137.  
  138. BOOL CTesthelpCtrl::CTesthelpCtrlFactory::UpdateRegistry(BOOL bRegister)
  139. {
  140.     // TODO: Verify that your control follows apartment-model threading rules.
  141.     // Refer to MFC TechNote 64 for more information.
  142.     // If your control does not conform to the apartment-model rules, then
  143.     // you must modify the code below, changing the 6th parameter from
  144.     // afxRegApartmentThreading to 0.
  145.  
  146.     if (bRegister)
  147.         return AfxOleRegisterControlClass(
  148.             AfxGetInstanceHandle(),
  149.             m_clsid,
  150.             m_lpszProgID,
  151.             IDS_TESTHELP,
  152.             IDB_TESTHELP,
  153.             afxRegApartmentThreading,
  154.             _dwTesthelpOleMisc,
  155.             _tlid,
  156.             _wVerMajor,
  157.             _wVerMinor);
  158.     else
  159.         return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
  160. }
  161.  
  162.  
  163. /////////////////////////////////////////////////////////////////////////////
  164. // CTesthelpCtrl::CTesthelpCtrl - Constructor
  165.  
  166. CTesthelpCtrl::CTesthelpCtrl()
  167. {
  168.           InitializeIIDs(&IID_DTesthelp, &IID_DTesthelpEvents);
  169.  
  170. }
  171.  
  172.  
  173. /////////////////////////////////////////////////////////////////////////////
  174. // CTesthelpCtrl::~CTesthelpCtrl - Destructor
  175.  
  176. CTesthelpCtrl::~CTesthelpCtrl()
  177. {
  178.           // TODO: Cleanup your control's instance data here.
  179. }
  180.  
  181.  
  182. /////////////////////////////////////////////////////////////////////////////
  183. // CTesthelpCtrl::OnDraw - Drawing function
  184.  
  185. void CTesthelpCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
  186. {
  187.     // Drawing code, mostly plagiarized from the Circ MFC sample.
  188.     // The only thing done here is setting the border and drawing text
  189.     // specified by our name properties in the control's client area.
  190.         if(!GetBorderStyle())   //Control will always have a border.
  191.                     SetBorderStyle(TRUE);
  192.  
  193.         // Set up variables to use for drawing text background.
  194.         // Use our current BackColor for the background color.
  195.         CBrush* pOldBrush;
  196.         CBrush bkBrush(TranslateColor(GetBackColor()));
  197.         CPen* pOldPen;
  198.         CRect rc = rcBounds;
  199.         CFont* pOldFont;
  200.  
  201.         // Set up background mode and text color.  Use the
  202.         // current ForeColor for the text color.
  203.         pdc->SetTextColor(TranslateColor(GetForeColor()));
  204.         pdc->SetBkMode(TRANSPARENT);
  205.  
  206.         // Fill our window with the current BackColor
  207.         pdc->FillRect(rcBounds, &bkBrush);
  208.  
  209.         // Save off the existing brush and pen so they
  210.         // can be restored when we're done.
  211.         pOldBrush = pdc->SelectObject(&bkBrush);
  212.         pOldPen = (CPen*)pdc->SelectStockObject(BLACK_PEN);
  213.  
  214.         // Save off the current font so we can restore it and
  215.         // select our current stock font into this DC
  216.         pOldFont = SelectStockFont(pdc);
  217.  
  218.         // Draw the text on our window
  219.         pdc->ExtTextOut(rc.left+10, rc.top +2,
  220.             ETO_CLIPPED, rc, m_szName1, m_szName1.GetLength(), NULL);
  221.         pdc->ExtTextOut(rc.left+10, rc.top +22,
  222.             ETO_CLIPPED, rc, m_szName2, m_szName2.GetLength(), NULL);
  223.         pdc->ExtTextOut(rc.left+10, rc.top +42,
  224.             ETO_CLIPPED, rc, m_szName3, m_szName3.GetLength(), NULL);
  225.  
  226.         // Restore our DC to it's original state.
  227.         pdc->SelectObject(pOldFont);
  228.         pdc->SelectObject(pOldPen);
  229.         pdc->SelectObject(pOldBrush);
  230.  
  231. }
  232.  
  233.  
  234. /////////////////////////////////////////////////////////////////////////////
  235. // CTesthelpCtrl::DoPropExchange - Persistence support
  236.  
  237. void CTesthelpCtrl::DoPropExchange(CPropExchange* pPX)
  238. {
  239.           ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
  240.           COleControl::DoPropExchange(pPX);
  241.           // custom DDX
  242.           PX_String(pPX, _T("Name1"), m_szName1);
  243.           PX_String(pPX, _T("Name2"), m_szName2);
  244.           PX_String(pPX, _T("Name3"), m_szName3);
  245.           PX_Bool(pPX, _T("UseMyHelp"),m_bUseMyHelp, TRUE);
  246.           PX_Bool(pPX, _T("ShowToolTip"), m_bShowToolTip,FALSE);
  247.           PX_Short(pPX, _T("UsePopupHelp"), m_nUsePopupHelp,0);
  248.           PX_String(pPX, _T("ToolTipText"),m_szToolTipText,"");
  249.  
  250. }
  251.  
  252.  
  253. /////////////////////////////////////////////////////////////////////////////
  254. // CTesthelpCtrl::OnResetState - Reset control to default state
  255.  
  256. void CTesthelpCtrl::OnResetState()
  257. {
  258.           COleControl::OnResetState();  // Resets defaults found in DoPropExchange
  259.  
  260. }
  261.  
  262.  
  263. /////////////////////////////////////////////////////////////////////////////
  264. // CTesthelpCtrl::AboutBox - Display an "About" box to the user
  265.  
  266. void CTesthelpCtrl::AboutBox()
  267. {
  268.           CDialog dlgAbout(IDD_ABOUTBOX_TESTHELP);
  269.           dlgAbout.DoModal();
  270. }
  271.  
  272.  
  273. /////////////////////////////////////////////////////////////////////////////
  274. // CTesthelpCtrl message handlers
  275.  
  276. void CTesthelpCtrl::OnName1Changed()
  277. {
  278.  
  279.           SetModifiedFlag();
  280.           InvalidateControl();
  281. }
  282.  
  283. void CTesthelpCtrl::OnName2Changed()
  284. {
  285.  
  286.           SetModifiedFlag();
  287.           InvalidateControl();
  288. }
  289.  
  290. void CTesthelpCtrl::OnName3Changed()
  291. {
  292.           SetModifiedFlag();
  293.           InvalidateControl();
  294. }
  295.  
  296. LONG CTesthelpCtrl::OnHelpCommand(UINT wParam, LONG lParam)
  297. {
  298.           LPHELPINFO hi = (LPHELPINFO)lParam;
  299.  
  300.           // If the control is in a running application
  301.           // we'll just show context help.
  302.           if( (AmbientUserMode()||IsWindow(m_hWnd)) && m_bUseMyHelp )
  303.           {
  304.                     if(m_nUsePopupHelp==0)
  305.                     {
  306.                         AfxGetApp()->WinHelp(IDH_WHATISTHISTHING, HELP_CONTEXTPOPUP);
  307.                         return TRUE;
  308.                     }
  309.                     else
  310.                     {
  311.                         AfxGetApp()->WinHelp(0, HELP_CONTENTS);
  312.                         return TRUE;
  313.                     }
  314.  
  315.  
  316.           }
  317.           return Default();
  318.  
  319. }
  320.  
  321. void CTesthelpCtrl::OnUseMyHelpChanged()
  322. {
  323.           // TODO: Add notification handler code
  324.  
  325.           SetModifiedFlag();
  326. }
  327.  
  328.  
  329. void CTesthelpCtrl::RelayEvent(UINT message, WPARAM wParam, LPARAM lParam)
  330. {
  331.           // This function will create a MSG structure, fill it in a pass it to
  332.           // the ToolTip control, m_ttip.  Note that we ensure the point is in window
  333.           // coordinates (relative to the control's window).
  334.           if(NULL != m_ttip.m_hWnd)
  335.           {
  336.                     MSG msg;
  337.                     msg.hwnd = m_hWnd;
  338.                     msg.message = message;
  339.                     msg.wParam = wParam;
  340.                     msg.lParam = lParam;
  341.                     msg.time = 0;
  342.                     msg.pt.x = LOWORD(lParam);
  343.                     msg.pt.y = HIWORD(lParam);
  344.  
  345.                     m_ttip.RelayEvent(&msg);
  346.           }
  347.  
  348. }
  349.  
  350. int CTesthelpCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
  351. {
  352.           if (COleControl::OnCreate(lpCreateStruct) == -1)
  353.                     return -1;
  354.           // The following code will create a the ToolTip control
  355.           // once the ocx's window is created.
  356.           if(!m_ttip.Create(this))
  357.              TRACE(_T("Unable to Create ToolTip"));
  358.           else
  359.              if(!m_ttip.AddTool(this, LPCTSTR(m_szToolTipText)))
  360.                  TRACE(_T("Unable to add tip for the control window"));
  361.              else
  362.                  m_ttip.Activate(m_bShowToolTip);
  363.  
  364.  
  365.           return 0;
  366. }
  367.  
  368. void CTesthelpCtrl::OnLButtonDown(UINT nFlags, CPoint point)
  369. {
  370.           // pass this message to the ToolTip control
  371.           RelayEvent(WM_LBUTTONDOWN, (WPARAM)nFlags,
  372.                     MAKELPARAM(LOWORD(point.x), LOWORD(point.y)));
  373.           COleControl::OnLButtonDown(nFlags, point);
  374. }
  375.  
  376. void CTesthelpCtrl::OnLButtonUp(UINT nFlags, CPoint point)
  377. {
  378.           // pass this message to the ToolTip control
  379.           RelayEvent(WM_LBUTTONUP, (WPARAM)nFlags,
  380.                     MAKELPARAM(LOWORD(point.x), LOWORD(point.y)));
  381.  
  382.           COleControl::OnLButtonUp(nFlags, point);
  383. }
  384.  
  385. void CTesthelpCtrl::OnMouseMove(UINT nFlags, CPoint point)
  386. {
  387.           // pass this message to the ToolTip control
  388.           RelayEvent(WM_MOUSEMOVE, (WPARAM)nFlags,
  389.                     MAKELPARAM(LOWORD(point.x), LOWORD(point.y)));
  390.  
  391.           COleControl::OnMouseMove(nFlags, point);
  392. }
  393.  
  394. void CTesthelpCtrl::OnShowToolTipChanged()
  395. {
  396.           // Activate or DeActivate the ToolTip
  397.           if(m_ttip.m_hWnd && AmbientUserMode())
  398.           {
  399.               m_ttip.Activate(m_bShowToolTip);
  400.               SetModifiedFlag();
  401.           }
  402. }
  403.  
  404. void CTesthelpCtrl::OnToolTipTextChanged()
  405. {
  406.           // Change the ToolTip's text
  407.           if(m_ttip.m_hWnd && AmbientUserMode())
  408.           {
  409.               m_ttip.UpdateTipText((LPCTSTR)m_szToolTipText,this);
  410.               SetModifiedFlag();
  411.           }
  412.  
  413. }
  414.  
  415.  
  416. void CTesthelpCtrl::OnUsePopupHelpChanged()
  417. {
  418.     // TODO: Add notification handler code
  419.  
  420.     SetModifiedFlag();
  421. }
  422.