smilectl.cpp
上传用户:biuytresa
上传日期:2007-12-07
资源大小:721k
文件大小:9k
源码类别:

DNA

开发平台:

Visual C++

  1. // SmileCtl.cpp : Implementation of the CSmileCtrl OLE control class.
  2. #include "stdafx.h"
  3. #include "Smile.h"
  4. #include "SmileCtl.h"
  5. #include "SmilePpg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. IMPLEMENT_DYNCREATE(CSmileCtrl, COleControl)
  12. /////////////////////////////////////////////////////////////////////////////
  13. // Message map
  14. BEGIN_MESSAGE_MAP(CSmileCtrl, COleControl)
  15. //{{AFX_MSG_MAP(CSmileCtrl)
  16. ON_WM_LBUTTONDOWN()
  17. //}}AFX_MSG_MAP
  18. ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
  19. END_MESSAGE_MAP()
  20. /////////////////////////////////////////////////////////////////////////////
  21. // Dispatch map
  22. BEGIN_DISPATCH_MAP(CSmileCtrl, COleControl)
  23. //{{AFX_DISPATCH_MAP(CSmileCtrl)
  24. DISP_PROPERTY_NOTIFY(CSmileCtrl, "Sad", m_bSad, OnSadChanged, VT_BOOL)
  25. DISP_FUNCTION(CSmileCtrl, "Beep", Beep, VT_EMPTY, VTS_NONE)
  26. DISP_FUNCTION(CSmileCtrl, "Wink", Wink, VT_EMPTY, VTS_BOOL)
  27. DISP_STOCKPROP_BACKCOLOR()
  28. DISP_STOCKPROP_FONT()
  29. DISP_STOCKPROP_FORECOLOR()
  30. DISP_STOCKPROP_CAPTION()
  31. DISP_STOCKPROP_BORDERSTYLE()
  32. //}}AFX_DISPATCH_MAP
  33. #ifndef _RUNTIME
  34. DISP_FUNCTION_ID(CSmileCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
  35. #endif
  36. END_DISPATCH_MAP()
  37. /////////////////////////////////////////////////////////////////////////////
  38. // Event map
  39. BEGIN_EVENT_MAP(CSmileCtrl, COleControl)
  40. //{{AFX_EVENT_MAP(CSmileCtrl)
  41. EVENT_CUSTOM("Outside", FireOutside, VTS_NONE)
  42. EVENT_CUSTOM("Inside", FireInside, VTS_XPOS_PIXELS  VTS_YPOS_PIXELS)
  43. //}}AFX_EVENT_MAP
  44. END_EVENT_MAP()
  45. /////////////////////////////////////////////////////////////////////////////
  46. // Property pages
  47. // TODO: Add more property pages as needed.  Remember to increase the count!
  48. #ifndef _RUNTIME
  49. BEGIN_PROPPAGEIDS(CSmileCtrl, 3)
  50. PROPPAGEID(CSmilePropPage::guid)
  51. #ifdef _USRDLL
  52. PROPPAGEID(CSmileColorPropPage::guid)
  53. PROPPAGEID(CSmileFontPropPage::guid)
  54. #else
  55. PROPPAGEID(CLSID_CColorPropPage)
  56. PROPPAGEID(CLSID_CFontPropPage)
  57. #endif
  58. END_PROPPAGEIDS(CSmileCtrl)
  59. #endif
  60. /////////////////////////////////////////////////////////////////////////////
  61. // Initialize class factory and guid
  62. IMPLEMENT_OLECREATE_EX(CSmileCtrl, "SMILE.SmileCtrl.1",
  63. 0x175cb003, 0xbeed, 0x11ce, 0x96, 0x11, 0, 0xaa, 0, 0x4a, 0x75, 0xcf)
  64. /////////////////////////////////////////////////////////////////////////////
  65. // Type library ID and version
  66. IMPLEMENT_OLETYPELIB(CSmileCtrl, _tlid, _wVerMajor, _wVerMinor)
  67. /////////////////////////////////////////////////////////////////////////////
  68. // Interface IDs
  69. const IID BASED_CODE IID_DSmile =
  70. { 0x175cb001, 0xbeed, 0x11ce, { 0x96, 0x11, 0, 0xaa, 0, 0x4a, 0x75, 0xcf } };
  71. const IID BASED_CODE IID_DSmileEvents =
  72. { 0x175cb002, 0xbeed, 0x11ce, { 0x96, 0x11, 0, 0xaa, 0, 0x4a, 0x75, 0xcf } };
  73. /////////////////////////////////////////////////////////////////////////////
  74. // Control type information
  75. static const DWORD BASED_CODE _dwSmileOleMisc =
  76. OLEMISC_ACTIVATEWHENVISIBLE |
  77. OLEMISC_SETCLIENTSITEFIRST |
  78. OLEMISC_INSIDEOUT |
  79. OLEMISC_CANTLINKINSIDE |
  80. OLEMISC_RECOMPOSEONRESIZE;
  81. IMPLEMENT_OLECTLTYPE(CSmileCtrl, IDS_Smile, _dwSmileOleMisc)
  82. /////////////////////////////////////////////////////////////////////////////
  83. // CSmileCtrl::CSmileCtrlFactory::UpdateRegistry -
  84. // Adds or removes system registry entries for CSmileCtrl
  85. BOOL CSmileCtrl::CSmileCtrlFactory::UpdateRegistry(BOOL bRegister)
  86. {
  87. if (bRegister)
  88. return AfxOleRegisterControlClass(
  89. AfxGetInstanceHandle(),
  90. m_clsid,
  91. m_lpszProgID,
  92. IDS_Smile,
  93. IDB_Smile,
  94. FALSE,                      //  Not insertable
  95. _dwSmileOleMisc,
  96. _tlid,
  97. _wVerMajor,
  98. _wVerMinor);
  99. else
  100. return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
  101. }
  102. /////////////////////////////////////////////////////////////////////////////
  103. // CSmileCtrl::CSmileCtrl - Constructor
  104. CSmileCtrl::CSmileCtrl()
  105. {
  106. InitializeIIDs(&IID_DSmile, &IID_DSmileEvents);
  107. m_bWink = FALSE;
  108. }
  109. /////////////////////////////////////////////////////////////////////////////
  110. // CSmileCtrl::~CSmileCtrl - Destructor
  111. CSmileCtrl::~CSmileCtrl()
  112. {
  113. // TODO: Cleanup your control's instance data here.
  114. }
  115. /////////////////////////////////////////////////////////////////////////////
  116. // CSmileCtrl::OnDraw - Drawing function
  117. #define X(x) (int)(xLeft + (x)*xScale/100)  // Scaling macros
  118. #define Y(y) (int)(yTop + (y)*yScale/100)   // so scale is 0 - 100
  119. #define CX(x) (int)((x)*xScale/100)
  120. #define CY(y) (int)((y)*yScale/100)
  121. void CSmileCtrl::OnDraw(
  122. CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
  123. {
  124. long xLeft = rcBounds.left;         // Use with scaling macros
  125. long yTop = rcBounds.top;
  126. long xScale = rcBounds.Width();
  127. long yScale = rcBounds.Height();
  128. int iPenWidth = max(CX(5), CY(5)); // Pen width based on control size
  129. CBrush brushBack;                  // Background brush
  130. CBrush brushBlack;
  131. CBrush brushYellow;
  132. CPen penBlack(PS_SOLID, iPenWidth, RGB(0x00,0x00,0x00));
  133. CPen penNull(PS_NULL, 0, (COLORREF)0);  // Null pen for drawing filled ellipses
  134. COLORREF crBack = TranslateColor(GetBackColor());   //Use BackColor
  135. brushBack.CreateSolidBrush(crBack);                 //Stock Property
  136. brushBlack.CreateSolidBrush(RGB(0x00,0x00,0x00));
  137. brushYellow.CreateSolidBrush(RGB(0xff,0xff,0x00));
  138. pdc->FillRect(rcBounds, &brushBack);                // Clear background
  139. CPen* pPenSave = pdc->SelectObject(&penBlack);
  140. CBrush* pBrushSave = pdc->SelectObject(&brushYellow);
  141. pdc->Ellipse(X(10), Y(15), X(90), Y(95));           // Head
  142. if (m_bSad)                                         // Use Sad
  143. {                                                   // Custom Property
  144. pdc->Arc(X(25), Y(70), X(75), Y(140),           // Sad Mouth
  145.    X(65), Y(75), X(35), Y(75));
  146. }
  147. else
  148. {
  149. pdc->Arc(X(25), Y(10), X(75), Y(80),            // Smile mouth
  150.    X(35), Y(70), X(65), Y(70));
  151. }
  152. pdc->SelectObject(&penNull);                        // No draw width
  153. pdc->SelectObject(&brushBlack);
  154. if (m_bWink)                                        // Left Eye
  155. {
  156. iPenWidth = max(CX(1), CY(1));
  157. CPen penThin(PS_SOLID, iPenWidth, RGB(0x00,0x00,0x00));
  158. CPen* pThick = pdc->SelectObject(&penThin);
  159. pdc->MoveTo(X(57), Y(35));
  160. pdc->LineTo(X(65), Y(50));
  161. pdc->MoveTo(X(57), Y(50));
  162. pdc->LineTo(X(65), Y(35));
  163. pdc->SelectObject(pThick);
  164. }
  165. else
  166. {
  167. pdc->Ellipse(X(57), Y(35), X(65), Y(50));
  168. }
  169. pdc->Ellipse(X(35), Y(35), X(43), Y(50));           // Right eye
  170. pdc->Ellipse(X(46), Y(43), X(54), Y(58));           // Nose
  171. pdc->SetBkMode(TRANSPARENT);                        // Use ForeColor
  172. pdc->SetTextColor(TranslateColor(GetForeColor()));  // Stock Property
  173. SelectStockFont(pdc);                               // Use Font
  174. // Stock Property
  175. CRect rect = rcBounds;
  176. pdc->DrawText(InternalGetText(), -1, rect,          // Use Caption
  177. DT_SINGLELINE | DT_CENTER | DT_TOP);            // Stock Propery
  178. pdc->SelectObject(pBrushSave);
  179. pdc->SelectObject(pPenSave);
  180. }
  181. /////////////////////////////////////////////////////////////////////////////
  182. // CSmileCtrl::DoPropExchange - Persistence support
  183. void CSmileCtrl::DoPropExchange(CPropExchange* pPX)
  184. {
  185. ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
  186. COleControl::DoPropExchange(pPX);
  187. PX_Bool(pPX, _T("Sad"), m_bSad, FALSE);
  188. }
  189. /////////////////////////////////////////////////////////////////////////////
  190. // CSmileCtrl::OnResetState - Reset control to default state
  191. void CSmileCtrl::OnResetState()
  192. {
  193. COleControl::OnResetState();  // Resets defaults found in DoPropExchange
  194. // TODO: Reset any other control state here.
  195. }
  196. /////////////////////////////////////////////////////////////////////////////
  197. // CSmileCtrl::AboutBox - Display an "About" box to the user
  198. #ifndef _RUNTIME
  199. void CSmileCtrl::AboutBox()
  200. {
  201. CDialog dlgAbout(IDD_ABOUTBOX_Smile);
  202. dlgAbout.DoModal();
  203. }
  204. #endif
  205. /////////////////////////////////////////////////////////////////////////////
  206. // CSmileCtrl message handlers
  207. void CSmileCtrl::OnLButtonDown(UINT nFlags, CPoint point)
  208. {
  209. CRect rcBounds;
  210. GetClientRect(&rcBounds);
  211. long xLeft = rcBounds.left; //Required by X() and Y() macros
  212. long yTop = rcBounds.top;
  213. long xScale = rcBounds.Width();
  214. long yScale = rcBounds.Height();
  215. if (InEllipse(point, X(10), Y(15), X(90), Y(95)))
  216. FireInside((short)point.x, (short)point.y);
  217. else
  218. FireOutside();
  219. COleControl::OnLButtonDown(nFlags, point);
  220. }
  221. //Simple Ellipse Hit-Testing
  222. BOOL CSmileCtrl::InEllipse(const CPoint& pt,
  223. int x1, int y1, int x2, int y2)
  224. {
  225. // Determine radii
  226. double a = (x2 - x1) / 2;
  227. double b = (y2 - y1) / 2;
  228. // Determine x, y
  229. double x = pt.x - (x1 + x2) / 2;
  230. double y = pt.y - (y1 + y2) / 2;
  231. // Apply ellipse formula
  232. return ((x * x) / (a * a) + (y * y) / (b * b) <= 1);
  233. }
  234. void CSmileCtrl::OnSadChanged()
  235. {
  236. InvalidateControl();
  237. }
  238. void CSmileCtrl::Beep()
  239. {
  240. MessageBeep(0);
  241. }
  242. void CSmileCtrl::Wink(BOOL bWink)
  243. {
  244. m_bWink = bWink;
  245. InvalidateControl();
  246. }