FontCurveCtl.cpp
上传用户:sz81710966
上传日期:2013-03-01
资源大小:409k
文件大小:16k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. /*******************************************************************************
  2. 注意:
  3. 1. 此控件是以传入数据的各个bit位是否为1,来组建Grid队列;然后通过Grid队列对
  4.    矩形区域进行绘图;
  5. 2. 目前支持可变的属性有:背景色的变换、GRID网格颜色的变换、Grid边线颜色的变换、
  6.     Grid水平个数变换、Grid垂直个数变换、显示方向的变换(水平还是垂直)、
  7. 显示图像形状(是矩形还是圆形);
  8. ********************************************************************************/
  9. #include "stdafx.h"
  10. #include "FontCurve.h"
  11. #include "FontCurveCtl.h"
  12. #include "FontCurvePpg.h"
  13. #include "..includeMemDC.h"
  14. #ifdef _DEBUG
  15. #define new DEBUG_NEW
  16. #undef THIS_FILE
  17. static char THIS_FILE[] = __FILE__;
  18. #endif
  19. IMPLEMENT_DYNCREATE(CFontCurveCtrl, COleControl)
  20. /////////////////////////////////////////////////////////////////////////////
  21. // Message map
  22. BEGIN_MESSAGE_MAP(CFontCurveCtrl, COleControl)
  23. //{{AFX_MSG_MAP(CFontCurveCtrl)
  24. ON_WM_NCCALCSIZE()
  25. ON_WM_SIZE()
  26. //}}AFX_MSG_MAP
  27. ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
  28. END_MESSAGE_MAP()
  29. /////////////////////////////////////////////////////////////////////////////
  30. // Dispatch map
  31. BEGIN_DISPATCH_MAP(CFontCurveCtrl, COleControl)
  32. //{{AFX_DISPATCH_MAP(CFontCurveCtrl)
  33. DISP_FUNCTION(CFontCurveCtrl, "SetBackColor", SetBackColor, VT_EMPTY, VTS_COLOR)
  34. DISP_FUNCTION(CFontCurveCtrl, "SetGridLineColor", SetGridLineColor, VT_EMPTY, VTS_COLOR)
  35. DISP_FUNCTION(CFontCurveCtrl, "SetGridColor", SetGridColor, VT_EMPTY, VTS_COLOR)
  36. DISP_FUNCTION(CFontCurveCtrl, "SetGridHoriNum", SetGridHoriNum, VT_EMPTY, VTS_I2)
  37. DISP_FUNCTION(CFontCurveCtrl, "SetGridVerNum", SetGridVerNum, VT_EMPTY, VTS_I2)
  38. DISP_FUNCTION(CFontCurveCtrl, "SetGridShowType", SetGridShowType, VT_EMPTY, VTS_I2)
  39. DISP_FUNCTION(CFontCurveCtrl, "SetGridDrawType", SetGridDrawType, VT_EMPTY, VTS_I2)
  40. DISP_FUNCTION(CFontCurveCtrl, "ShowGridData", ShowGridData, VT_BOOL, VTS_PBSTR VTS_I2 VTS_I2 VTS_I2)
  41. //}}AFX_DISPATCH_MAP
  42. END_DISPATCH_MAP()
  43. /////////////////////////////////////////////////////////////////////////////
  44. // Event map
  45. BEGIN_EVENT_MAP(CFontCurveCtrl, COleControl)
  46. //{{AFX_EVENT_MAP(CFontCurveCtrl)
  47. // NOTE - ClassWizard will add and remove event map entries
  48. //    DO NOT EDIT what you see in these blocks of generated code !
  49. //}}AFX_EVENT_MAP
  50. END_EVENT_MAP()
  51. /////////////////////////////////////////////////////////////////////////////
  52. // Property pages
  53. // TODO: Add more property pages as needed.  Remember to increase the count!
  54. BEGIN_PROPPAGEIDS(CFontCurveCtrl, 1)
  55. PROPPAGEID(CFontCurvePropPage::guid)
  56. END_PROPPAGEIDS(CFontCurveCtrl)
  57. /////////////////////////////////////////////////////////////////////////////
  58. // Initialize class factory and guid
  59. IMPLEMENT_OLECREATE_EX(CFontCurveCtrl, "FONTCURVE.FontCurveCtrl.1",
  60. 0x39ca78cf, 0xecfe, 0x4e88, 0x8b, 0x44, 0x51, 0xe9, 0x60, 0x18, 0x3a, 0x22)
  61. /////////////////////////////////////////////////////////////////////////////
  62. // Type library ID and version
  63. IMPLEMENT_OLETYPELIB(CFontCurveCtrl, _tlid, _wVerMajor, _wVerMinor)
  64. /////////////////////////////////////////////////////////////////////////////
  65. // Interface IDs
  66. const IID BASED_CODE IID_DFontCurve =
  67. { 0x680ae108, 0xf7ef, 0x45a1, { 0xbf, 0xdc, 0xfc, 0x29, 0xd0, 0xfb, 0xc6, 0x5c } };
  68. const IID BASED_CODE IID_DFontCurveEvents =
  69. { 0x7e93f453, 0xe502, 0x4f31, { 0xb7, 0xff, 0x8, 0xb3, 0x35, 0xb6, 0xc3, 0xa6 } };
  70. /////////////////////////////////////////////////////////////////////////////
  71. // Control type information
  72. static const DWORD BASED_CODE _dwFontCurveOleMisc =
  73. OLEMISC_ACTIVATEWHENVISIBLE |
  74. OLEMISC_SETCLIENTSITEFIRST |
  75. OLEMISC_INSIDEOUT |
  76. OLEMISC_CANTLINKINSIDE |
  77. OLEMISC_RECOMPOSEONRESIZE;
  78. IMPLEMENT_OLECTLTYPE(CFontCurveCtrl, IDS_FONTCURVE, _dwFontCurveOleMisc)
  79. /////////////////////////////////////////////////////////////////////////////
  80. // CFontCurveCtrl::CFontCurveCtrlFactory::UpdateRegistry -
  81. // Adds or removes system registry entries for CFontCurveCtrl
  82. BOOL CFontCurveCtrl::CFontCurveCtrlFactory::UpdateRegistry(BOOL bRegister)
  83. {
  84. // TODO: Verify that your control follows apartment-model threading rules.
  85. // Refer to MFC TechNote 64 for more information.
  86. // If your control does not conform to the apartment-model rules, then
  87. // you must modify the code below, changing the 6th parameter from
  88. // afxRegApartmentThreading to 0.
  89. if (bRegister)
  90. return AfxOleRegisterControlClass(
  91. AfxGetInstanceHandle(),
  92. m_clsid,
  93. m_lpszProgID,
  94. IDS_FONTCURVE,
  95. IDB_FONTCURVE,
  96. afxRegApartmentThreading,
  97. _dwFontCurveOleMisc,
  98. _tlid,
  99. _wVerMajor,
  100. _wVerMinor);
  101. else
  102. return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
  103. }
  104. /////////////////////////////////////////////////////////////////////////////
  105. // Licensing strings
  106. static const TCHAR BASED_CODE _szLicFileName[] = _T("FontCurve.lic");
  107. static const WCHAR BASED_CODE _szLicString[] =
  108. L"Copyright (c) 2004";
  109. /////////////////////////////////////////////////////////////////////////////
  110. // CFontCurveCtrl::CFontCurveCtrlFactory::VerifyUserLicense -
  111. // Checks for existence of a user license
  112. BOOL CFontCurveCtrl::CFontCurveCtrlFactory::VerifyUserLicense()
  113. {
  114. return AfxVerifyLicFile(AfxGetInstanceHandle(), _szLicFileName,
  115. _szLicString);
  116. }
  117. /////////////////////////////////////////////////////////////////////////////
  118. // CFontCurveCtrl::CFontCurveCtrlFactory::GetLicenseKey -
  119. // Returns a runtime licensing key
  120. BOOL CFontCurveCtrl::CFontCurveCtrlFactory::GetLicenseKey(DWORD dwReserved,
  121. BSTR FAR* pbstrKey)
  122. {
  123. if (pbstrKey == NULL)
  124. return FALSE;
  125. *pbstrKey = SysAllocString(_szLicString);
  126. return (*pbstrKey != NULL);
  127. }
  128. /////////////////////////////////////////////////////////////////////////////
  129. // CFontCurveCtrl::CFontCurveCtrl - Constructor
  130. CFontCurveCtrl::CFontCurveCtrl()
  131. {
  132. InitializeIIDs(&IID_DFontCurve, &IID_DFontCurveEvents);
  133. m_colorBackGround = RGB(0xFF, 0xFF, 0xFF);
  134. m_colorGridLine = RGB(0xC0, 0xC0, 0xC0);         //灰色
  135. m_colorGrid = RGB(0x00, 0x00, 0x00);
  136. m_nGridHeightNum = GRID_LENGTH_16;
  137. m_nGridWidthNum = GRID_LENGTH_16;
  138. m_nGridLineWidth = WIDTH_GRID_LINE_INIT;
  139. memset(m_byShowBuf, 0x00, GRID_SHOW_BUF_LEN*sizeof(BYTE));
  140. m_nGridShowType = GRID_SHOW_POS_HORI;
  141. m_nGridDrawType = GRID_DRAW_RECT;
  142. m_nGridShowWidth = GRID_LENGTH_16;
  143. m_nGridShowHeight = GRID_LENGTH_16;
  144. }
  145. /////////////////////////////////////////////////////////////////////////////
  146. // CFontCurveCtrl::~CFontCurveCtrl - Destructor
  147. CFontCurveCtrl::~CFontCurveCtrl()
  148. {
  149. FreeAllResource();
  150. }
  151. /////////////////////////////////////////////////////////////////////////////
  152. // CFontCurveCtrl::OnDraw - Drawing function
  153. void CFontCurveCtrl::OnDraw(
  154. CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
  155. {
  156. //调整显示矩形区域
  157. int nWidth = rcBounds.Width();
  158. int nHeight = rcBounds.Height();
  159. if(nWidth < GRID_LENGTH_MIN) 
  160. nWidth = GRID_LENGTH_MIN;
  161. if(nHeight < GRID_LENGTH_MIN)
  162. nHeight = GRID_LENGTH_MIN;
  163. if(nWidth > nHeight)
  164. nWidth = nHeight;
  165. else
  166. nHeight = nWidth;
  167. int nGridWidth = (nWidth - m_nGridLineWidth * (m_nGridWidthNum + 1))/m_nGridWidthNum;
  168. int nWidthResidue = (nWidth - m_nGridLineWidth * (m_nGridWidthNum + 1))%m_nGridWidthNum;
  169. CRect rc(0,0,0,0);
  170. CMemDC memDC(pdc);
  171. CBrush * pBrush = NULL; 
  172. if(nWidthResidue != 0)
  173. {
  174. rc = CRect(rcBounds.left, rcBounds.top, rcBounds.left+nWidth - nWidthResidue, 
  175. rcBounds.top+nHeight - nWidthResidue);
  176. CBrush bkBrush(m_colorBackGround);
  177. pBrush = memDC.SelectObject(&bkBrush);
  178. memDC.FillRect(CRect(rc.left+rc.Width(), rc.top, rcBounds.right, rcBounds.bottom), &bkBrush);
  179. memDC.FillRect(CRect(rc.left, rc.top+rc.Height(), rcBounds.right, rcBounds.bottom), &bkBrush);
  180. memDC.SelectObject(pBrush);
  181. }
  182. {
  183. rc = CRect(rcBounds.left, rcBounds.top, rcBounds.left+nWidth, rcBounds.top+nHeight);
  184. }
  185. //填充背景色
  186. CBrush backBrush(m_colorBackGround);
  187. pBrush = memDC.SelectObject(&backBrush);
  188. memDC.FillRect(rc, &backBrush);
  189. //memDC.DrawEdge(rc,EDGE_ETCHED, BF_RECT);
  190. memDC.SelectObject(pBrush);
  191. //画背景网格
  192. DrawGrid(&memDC, rc);
  193. //利用数据填充指定网格
  194. FillGrid(&memDC, rc, m_colorGrid, m_nGridDrawType);
  195. }
  196. /////////////////////////////////////////////////////////////////////////////
  197. // CFontCurveCtrl::DoPropExchange - Persistence support
  198. void CFontCurveCtrl::DoPropExchange(CPropExchange* pPX)
  199. {
  200. ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
  201. COleControl::DoPropExchange(pPX);
  202. // TODO: Call PX_ functions for each persistent custom property.
  203. }
  204. /////////////////////////////////////////////////////////////////////////////
  205. // CFontCurveCtrl::OnResetState - Reset control to default state
  206. void CFontCurveCtrl::OnResetState()
  207. {
  208. COleControl::OnResetState();   
  209. }
  210. /////////////////////////////////////////////////////////////////////////////
  211. // CFontCurveCtrl message handlers
  212. /////////////////////////////////////////////////////////////////////////////
  213. bool CFontCurveCtrl::DrawGrid(CDC * pDC, CRect &rc)
  214. {
  215. ASSERT(pDC != NULL);
  216. CPen linePen(PS_SOLID, m_nGridLineWidth, m_colorGridLine);
  217. CPen * pPen = pDC ->SelectObject(&linePen);
  218. CPoint pt(rc.left, rc.top);
  219. int nWidth = rc.Width();
  220. int nHeight = rc.Height();
  221. int nGridWidth = (nWidth-m_nGridLineWidth*(m_nGridWidthNum+1))/m_nGridWidthNum;
  222. int nGridHeight = (nHeight-m_nGridLineWidth*(m_nGridHeightNum+1))/m_nGridHeightNum;
  223. //画垂直线
  224. for(int i = (pt.x + nGridWidth); i < (pt.x+nWidth); i = i + nGridWidth+m_nGridLineWidth)
  225. {
  226. pDC ->MoveTo(i, pt.y);
  227. pDC ->LineTo(i, pt.y + m_nGridHeightNum*(nGridHeight+m_nGridLineWidth));
  228. }
  229. //画水平线
  230. for(int j = (pt.y+nGridHeight); j < (pt.y+nHeight); j = j+nGridHeight+m_nGridLineWidth)
  231. {
  232. pDC ->MoveTo(pt.x, j);
  233. pDC ->LineTo(pt.x + m_nGridWidthNum*(nGridWidth+m_nGridLineWidth), j);
  234. }
  235. pDC ->SelectObject(pPen);
  236.  
  237. return true; 
  238. }
  239. /*
  240. 注意:
  241. 根据提供的数据缓冲来组建Grid信息显示队列,然后根据Grid信息显示队列进行绘图
  242. 显示顺序:
  243. 水平显示:比如 8*8的点阵
  244. 1  2  3  4  5  6  7  8
  245. 9 10  11 12 13 14 15 16
  246. .......................
  247. 57 58 59 60 61 62 63 64
  248. 垂直显示:比如 8*8的点阵
  249. 1  9   .  57
  250. 2  10  .  58
  251. 3  11  .  59
  252. 4  12  .  60
  253. 5  13  .  61
  254. 6  14  .  62
  255. 7  15  .  63
  256. 8  16  .  64
  257. */
  258. bool CFontCurveCtrl::FillGrid(CDC * pDC, CRect &rc, COLORREF color, int nDrawType)
  259. {
  260. ASSERT(pDC != NULL);
  261. bool bIsEmpty = true;
  262. for(int i = 0; i <= GRID_SHOW_BUF_LEN; i++)
  263. {
  264. if(m_byShowBuf[i] != 0x00)
  265. bIsEmpty = false;
  266. }
  267. if(bIsEmpty)
  268. return true;
  269. int x = 0, y = 0;
  270. bool bDraw = false;
  271. CURVE_SHOW_INFO * pNewInfo = NULL;
  272. int nOneGridWidth = (rc.Width() - (m_nGridWidthNum+1)*m_nGridLineWidth)/m_nGridWidthNum;
  273. int nOneGridHeight = (rc.Height() - (m_nGridHeightNum+1)*m_nGridLineWidth)/m_nGridHeightNum;
  274. int nWidth8Count = m_nGridShowWidth/8;
  275. for(y = 0; y < m_nGridShowHeight; y++)
  276. {
  277. for(x = 0; x < m_nGridShowWidth; x++)
  278. {
  279. bDraw = (m_byShowBuf[nWidth8Count*y + x/8]>>(7-x%8)%8) & 0x01;
  280. if(bDraw)
  281. {
  282. pNewInfo = new CURVE_SHOW_INFO;
  283. if(m_nGridShowType == GRID_SHOW_POS_HORI)         //水平扫描
  284. {
  285. pNewInfo ->gridRect.left = rc.left+(x+1)*m_nGridLineWidth+x*nOneGridWidth;
  286. pNewInfo ->gridRect.top = rc.top+(y+1)*m_nGridLineWidth+y*nOneGridHeight;
  287. pNewInfo ->gridRect.right = rc.left+(x+1)*m_nGridLineWidth+(x+1)*nOneGridWidth;;
  288. pNewInfo ->gridRect.bottom = rc.top+(y+1)*m_nGridLineWidth+(y+1)*nOneGridHeight;;
  289. pNewInfo ->gridX = x+1;
  290. pNewInfo ->gridY = y+1;
  291. }
  292. else if(m_nGridShowType == GRID_SHOW_POS_VER)   //垂直扫描
  293. {
  294. pNewInfo ->gridRect.left = rc.left+(y+1)*m_nGridLineWidth+y*nOneGridHeight;
  295. pNewInfo ->gridRect.top = rc.top+(x+1)*m_nGridLineWidth+x*nOneGridWidth;
  296. pNewInfo ->gridRect.right = rc.left+(y+1)*m_nGridLineWidth+(y+1)*nOneGridHeight;
  297. pNewInfo ->gridRect.bottom = rc.top+(x+1)*m_nGridLineWidth+(x+1)*nOneGridWidth;
  298. pNewInfo ->gridX = y+1;
  299. pNewInfo ->gridY = x+1;
  300. }
  301. m_gridList.AddTail(pNewInfo);
  302. }
  303. }
  304. }
  305. CBrush backBrush(color);
  306. CBrush *pBrush = pDC ->SelectObject(&backBrush);
  307. POSITION pos = m_gridList.GetHeadPosition();
  308. while(pos)
  309. {
  310. CURVE_SHOW_INFO *pInfo = m_gridList.GetNext(pos);
  311.  
  312. if(nDrawType == GRID_DRAW_RECT)
  313. pDC ->FillRect(pInfo ->gridRect, &backBrush);
  314. else if(nDrawType == GRID_DRAW_CIR) 
  315. pDC ->FillRect(pInfo ->gridRect, &backBrush);
  316. }
  317. pDC ->SelectObject(pBrush);
  318. //释放所有队列资源
  319. FreeAllResource();
  320. return true;
  321. }
  322. bool CFontCurveCtrl::FreeAllResource()
  323. {
  324. POSITION pos = m_gridList.GetHeadPosition();
  325. while(pos)
  326. {
  327. CURVE_SHOW_INFO  * pInfo = m_gridList.GetNext(pos);
  328. delete pInfo;
  329. }
  330. m_gridList.RemoveAll();
  331. return true;
  332. }
  333. bool CFontCurveCtrl::ShowData(BYTE * pInData, int nWidth, int nHeight, int nShowType)
  334. {
  335. if(pInData == NULL)
  336. return false;
  337. if((nWidth == 0) || (nHeight == 0))
  338. return false;
  339. memset(m_byShowBuf, 0x00, GRID_SHOW_BUF_LEN*sizeof(BYTE));
  340. memcpy(m_byShowBuf, pInData, nWidth*nHeight*sizeof(BYTE));
  341. m_nGridShowType = nShowType;
  342.  
  343. m_nGridShowWidth = nWidth;
  344. m_nGridShowHeight = nHeight;
  345. InvalidateControl();
  346. SetModifiedFlag();
  347. return true;
  348. }
  349. bool CFontCurveCtrl::JudgeGridNum()
  350. {
  351. if(m_nGridWidthNum <= GRID_LENGTH_8)
  352. m_nGridWidthNum = GRID_LENGTH_8;
  353. else if(m_nGridWidthNum <= GRID_LENGTH_16)
  354. m_nGridWidthNum = GRID_LENGTH_16;
  355. else if(m_nGridWidthNum <= GRID_LENGTH_24)
  356. m_nGridWidthNum = GRID_LENGTH_24;
  357. else if(m_nGridWidthNum <= GRID_LENGTH_32)
  358. m_nGridWidthNum = GRID_LENGTH_32;
  359. if(m_nGridHeightNum <= GRID_LENGTH_8)
  360. m_nGridHeightNum = GRID_LENGTH_8;
  361. else if(m_nGridHeightNum <= GRID_LENGTH_16)
  362. m_nGridHeightNum = GRID_LENGTH_16;
  363. else if(m_nGridHeightNum <= GRID_LENGTH_24)
  364. m_nGridHeightNum = GRID_LENGTH_24;
  365. else if(m_nGridHeightNum <= GRID_LENGTH_32)
  366. m_nGridHeightNum = GRID_LENGTH_32;
  367. if(m_nGridWidthNum > m_nGridHeightNum)
  368. m_nGridWidthNum = m_nGridHeightNum;
  369. else
  370. m_nGridHeightNum = m_nGridWidthNum;
  371. return true;
  372. }
  373. void CFontCurveCtrl::SetBackColor(OLE_COLOR backColor) 
  374. {
  375.  m_colorBackGround = TranslateColor(backColor);
  376.  InvalidateControl();
  377.  SetModifiedFlag();
  378. }
  379. void CFontCurveCtrl::SetGridLineColor(OLE_COLOR gridlineColor) 
  380. {
  381. m_colorGridLine = TranslateColor(gridlineColor);
  382. InvalidateControl();
  383. SetModifiedFlag();
  384. }
  385. void CFontCurveCtrl::SetGridColor(OLE_COLOR gridColor) 
  386. {
  387. m_colorGrid = TranslateColor(gridColor);
  388. InvalidateControl();
  389. SetModifiedFlag();
  390. }
  391. void CFontCurveCtrl::SetGridHoriNum(short horiNum) 
  392. {
  393. m_nGridWidthNum = horiNum;
  394. InvalidateControl();
  395. SetModifiedFlag();
  396. }
  397. void CFontCurveCtrl::SetGridVerNum(short verNum) 
  398. {
  399. m_nGridHeightNum = verNum;
  400. InvalidateControl();
  401. SetModifiedFlag();
  402. }
  403. void CFontCurveCtrl::SetGridShowType(short showType) 
  404. {
  405. m_nGridShowType = showType;
  406. InvalidateControl();
  407. SetModifiedFlag();
  408. }
  409. void CFontCurveCtrl::SetGridDrawType(short drawType) 
  410. {
  411. m_nGridDrawType = drawType;
  412. InvalidateControl();
  413. SetModifiedFlag();
  414. }
  415. void CFontCurveCtrl::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) 
  416. {
  417. if((lpncsp ->rgrc[0].bottom - lpncsp ->rgrc[0].top) > (lpncsp ->rgrc[0].right - lpncsp ->rgrc[0].left))
  418. lpncsp ->rgrc[0].right = lpncsp ->rgrc[0].left+(lpncsp ->rgrc[0].bottom - lpncsp ->rgrc[0].top);
  419. else
  420. lpncsp ->rgrc[0].bottom = lpncsp ->rgrc[0].top + (lpncsp ->rgrc[0].right - lpncsp ->rgrc[0].left);
  421. COleControl::OnNcCalcSize(bCalcValidRects, lpncsp);
  422. }
  423. void CFontCurveCtrl::OnSize(UINT nType, int cx, int cy) 
  424. {
  425. COleControl::OnSize(nType, cx, cy);
  426. }
  427. BOOL CFontCurveCtrl::ShowGridData(BSTR FAR* pInData, short nWidth, short nHeight, short nShowType) 
  428. {
  429.  return ShowData((BYTE *)pInData, nWidth, nHeight, nShowType);
  430. }