CustomDrawReportDlg.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:12k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // CustomDrawReportDlg.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "CustomDrawReport.h"
  22. #include "CustomDrawReportDlg.h"
  23. #include "MessageRecord.h"
  24. #include "XTPCustomDrawReportPaintManager.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CCustomDrawReportDlg dialog
  32. CCustomDrawReportDlg::CCustomDrawReportDlg(CWnd* pParent /*=NULL*/)
  33. : CXTResizeDialog(CCustomDrawReportDlg::IDD, pParent)
  34. {
  35. //{{AFX_DATA_INIT(CCustomDrawReportDlg)
  36. // NOTE: the ClassWizard will add member initialization here
  37. //}}AFX_DATA_INIT
  38. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  39. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  40. m_nDrawingMethod = 1;
  41. }
  42. void CCustomDrawReportDlg::DoDataExchange(CDataExchange* pDX)
  43. {
  44. CXTResizeDialog::DoDataExchange(pDX);
  45. //{{AFX_DATA_MAP(CCustomDrawReportDlg)
  46. DDX_Control(pDX, IDC_REPORTCTRL, m_wndReportCtrl);
  47. //}}AFX_DATA_MAP
  48. }
  49. BEGIN_MESSAGE_MAP(CCustomDrawReportDlg, CXTResizeDialog)
  50. //{{AFX_MSG_MAP(CCustomDrawReportDlg)
  51. ON_WM_SYSCOMMAND()
  52. ON_WM_PAINT()
  53. ON_WM_QUERYDRAGICON()
  54. ON_WM_DESTROY()
  55. ON_COMMAND(IDM_USE_DRAWFRAMECONTROL, OnUseDrawframecontrol)
  56. ON_COMMAND(IDM_USE_DRAWSTATE, OnUseDrawstate)
  57. ON_WM_TIMER()
  58. //}}AFX_MSG_MAP
  59. END_MESSAGE_MAP()
  60. /////////////////////////////////////////////////////////////////////////////
  61. // CCustomDrawReportDlg message handlers
  62. enum
  63. {
  64. REPORTCOLUMN_NAME,
  65. REPORTCOLUMN_ATTR1,
  66. REPORTCOLUMN_ATTR2,
  67. REPORTCOLUMN_ATTR3,
  68. };
  69. const int COLUMN_MAIL_ICON   =  0;
  70. const int COLUMN_CHECK_ICON  =  2;
  71. BOOL CCustomDrawReportDlg::OnInitDialog()
  72. {
  73. CXTResizeDialog::OnInitDialog();
  74. // Add "About..." menu item to system menu.
  75. // IDM_ABOUTBOX must be in the system command range.
  76. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  77. ASSERT(IDM_ABOUTBOX < 0xF000);
  78. CMenu* pSysMenu = GetSystemMenu(FALSE);
  79. if (pSysMenu != NULL)
  80. {
  81. CString strAboutMenu;
  82. strAboutMenu.LoadString(IDS_ABOUTBOX);
  83. if (!strAboutMenu.IsEmpty())
  84. {
  85. pSysMenu->AppendMenu(MF_SEPARATOR);
  86. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  87. }
  88. }
  89. // Set the icon for this dialog.  The framework does this automatically
  90. //  when the application's main window is not a dialog
  91. SetIcon(m_hIcon, TRUE); // Set big icon
  92. SetIcon(m_hIcon, FALSE); // Set small icon
  93. //
  94. // create main menu.
  95. //
  96. CMenu* pMenu = GetMenu();
  97. if(pMenu)
  98. {
  99. CMenu* pSubMenu = pMenu->GetSubMenu(0);
  100. if(pSubMenu)
  101. pSubMenu->CheckMenuRadioItem(IDM_USE_DRAWFRAMECONTROL, IDM_USE_DRAWSTATE, IDM_USE_DRAWFRAMECONTROL, MF_BYCOMMAND);
  102. }
  103. //
  104. // create the image lists used by the report control.
  105. //
  106. if (!m_ilControls.Create(14, 14, ILC_COLOR24 | ILC_MASK, 0, 1))
  107. return -1;
  108. //
  109. // load the image bitmap and set the image list for the 
  110. // report control.
  111. //
  112. CBitmap bitmap;
  113. VERIFY(bitmap.LoadBitmap(IDB_CONTROLS));
  114. m_ilControls.Add(&bitmap, RGB(255, 0, 255));
  115. //
  116. //  Add sample columns
  117. //
  118. m_wndReportCtrl.AddColumn(new CXTPReportColumn(REPORTCOLUMN_NAME, _T("Name"), 150));
  119. m_wndReportCtrl.AddColumn(new CXTPReportColumn(REPORTCOLUMN_ATTR1, _T("Attribute 1"), 150));
  120. m_wndReportCtrl.AddColumn(new CXTPReportColumn(REPORTCOLUMN_ATTR2, _T("Attribute 2"), 150));
  121. m_wndReportCtrl.AddColumn(new CXTPReportColumn(REPORTCOLUMN_ATTR3, _T("Attribute 3"), 150));
  122. m_wndReportCtrl.GetColumns()->GetAt(REPORTCOLUMN_ATTR3)->SetAlignment(DT_VCENTER);
  123. //
  124. //  Add sample records in tree
  125. //
  126. CString strName;
  127. CString strProgress;
  128. for(int i = 0; i < 10; i++)
  129. {
  130. strName.Format(_T("Parameter %d"), i);
  131. strProgress.Format(_T("Progress %d: (%d%%)"), i, 0);
  132. m_wndReportCtrl.AddRecord(new CMessageRecord(strName, 4, i, 4, 1 << (i & 3), strProgress, RGB(0, 0, 100), 15, 0, 100, i + 1, 0));
  133. }
  134. //
  135. // define style attributes for the report control.
  136. //
  137. m_wndReportCtrl.GetColumns()->Find(REPORTCOLUMN_NAME)->SetTreeColumn(TRUE);
  138. CXTPCustomDrawReportPaintManager* pPaintManager = new CXTPCustomDrawReportPaintManager(this);
  139. m_wndReportCtrl.SetPaintManager(pPaintManager);
  140. //
  141. // after columns and data have been added call Populate to 
  142. // populate all of the date for the control.
  143. //
  144. m_wndReportCtrl.Populate();
  145. m_wndReportCtrl.EnableDragDrop(_T("CustomDrawReport"), xtpReportAllowDrag | xtpReportAllowDrop);
  146. // Set control resizing.
  147. SetResize(IDC_REPORTCTRL, SZ_TOP_LEFT, SZ_BOTTOM_RIGHT);
  148. SetResize(IDCANCEL, SZ_BOTTOM_RIGHT, SZ_BOTTOM_RIGHT);
  149. SetResize(IDOK, SZ_BOTTOM_RIGHT, SZ_BOTTOM_RIGHT);
  150. // Load window placement
  151. LoadPlacement(_T("CCustomDrawReportDlg"));
  152. // start timer
  153. SetTimer(0, 250, NULL);
  154. return TRUE;  // return TRUE  unless you set the focus to a control
  155. }
  156. void CCustomDrawReportDlg::OnSysCommand(UINT nID, LPARAM lParam)
  157. {
  158. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  159. {
  160. CAboutDlg dlgAbout;
  161. dlgAbout.DoModal();
  162. }
  163. else
  164. {
  165. CXTResizeDialog::OnSysCommand(nID, lParam);
  166. }
  167. }
  168. // If you add a minimize button to your dialog, you will need the code below
  169. //  to draw the icon.  For MFC applications using the document/view model,
  170. //  this is automatically done for you by the framework.
  171. void CCustomDrawReportDlg::OnPaint() 
  172. {
  173. if (IsIconic())
  174. {
  175. CPaintDC dc(this); // device context for painting
  176. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  177. // Center icon in client rectangle
  178. int cxIcon = GetSystemMetrics(SM_CXICON);
  179. int cyIcon = GetSystemMetrics(SM_CYICON);
  180. CRect rect;
  181. GetClientRect(&rect);
  182. int x = (rect.Width() - cxIcon + 1) / 2;
  183. int y = (rect.Height() - cyIcon + 1) / 2;
  184. // Draw the icon
  185. dc.DrawIcon(x, y, m_hIcon);
  186. }
  187. else
  188. {
  189. CXTResizeDialog::OnPaint();
  190. }
  191. }
  192. // The system calls this to obtain the cursor to display while the user drags
  193. //  the minimized window.
  194. HCURSOR CCustomDrawReportDlg::OnQueryDragIcon()
  195. {
  196. return (HCURSOR) m_hIcon;
  197. }
  198. void CCustomDrawReportDlg::OnDestroy() 
  199. {
  200. CXTResizeDialog::OnDestroy();
  201. // Save window placement
  202. SavePlacement(_T("CCustomDrawReportDlg"));
  203. }
  204. unsigned int CCustomDrawReportDlg::GetControlsNumber(CXTPReportRecordItem* pItem)
  205. {
  206. if(pItem && pItem->GetIndex() == 1)
  207. return ((CMessageRecordItemCheckGroup*)pItem)->GetControlsNumber();
  208. else if(pItem && pItem->GetIndex() == 2)
  209. return ((CMessageRecordItemRadioGroup*)pItem)->GetControlsNumber();
  210. return 0;
  211. }
  212. unsigned int CCustomDrawReportDlg::GetControlsNumber(CXTPReportRow* pRow)
  213. {
  214. if(!pRow)
  215. return 0;
  216. unsigned int unControls = 0;
  217. CXTPReportRecordItem* pItem = pRow->GetRecord()->GetItem(1);
  218. unControls = GetControlsNumber(pItem);
  219. pItem = pRow->GetRecord()->GetItem(2);
  220. unControls = max(unControls, GetControlsNumber(pItem));
  221. return unControls;
  222. }
  223. int CCustomDrawReportDlg::GetRowHeight(CDC* /*pDC*/, CXTPReportRow* pRow)
  224. {
  225. unsigned int unControls = 0;
  226. CXTPReportRecordItem* pItem = pRow->GetRecord()->GetItem(1);
  227. if(pItem)
  228. unControls = max(unControls, ((CMessageRecordItemCheckGroup*)pItem)->GetControlsNumber());
  229. pItem = pRow->GetRecord()->GetItem(2);
  230. if(pItem)
  231. unControls = max(unControls, ((CMessageRecordItemRadioGroup*)pItem)->GetControlsNumber());
  232. if (!pRow->IsGroupRow())
  233. {
  234. return unControls * 15 + (m_wndReportCtrl.GetPaintManager()->IsGridVisible(FALSE) ? 1 : 0);
  235. }
  236. if (m_wndReportCtrl.GetPaintManager()->m_bShadeGroupHeadings)
  237. return unControls * 15 + 6;
  238. return unControls * 15 + 16;
  239. }
  240. BOOL CCustomDrawReportDlg::DrawItem(XTP_REPORTRECORDITEM_DRAWARGS* pDrawArgs, XTP_REPORTRECORDITEM_METRICS* /*pMetrics*/)
  241. {
  242. if(pDrawArgs->pColumn->GetIndex() != REPORTCOLUMN_ATTR1 && pDrawArgs->pColumn->GetIndex() != REPORTCOLUMN_ATTR2)
  243. return FALSE;
  244. CRect rc = pDrawArgs->pRow->GetItemRect(pDrawArgs->pItem);
  245. rc.left += 5;
  246.     rc.right = rc.left + 14;
  247.     rc.bottom = rc.top + 14;
  248. for(unsigned int i = 0; i < GetControlsNumber(pDrawArgs->pItem); i++)
  249. {
  250. UINT unFlags;
  251. UINT unIconId;
  252. CString strText;
  253. if(pDrawArgs->pColumn->GetIndex() == 1)
  254. {
  255. strText.Format(_T("%s%d"), _T("T"), i + 1);
  256.             unFlags = DFCS_BUTTONCHECK;
  257. CMessageRecordItemCheckGroup* pRecord = (CMessageRecordItemCheckGroup*)pDrawArgs->pItem;
  258. if(pRecord->GetValue() & (1 << i))
  259. {
  260. unFlags |= DFCS_CHECKED;
  261.                 unIconId = 1;
  262. }
  263. else
  264. {
  265. unFlags &= ~DFCS_CHECKED;
  266.                 unIconId = 0;
  267. }
  268. }
  269. else
  270. {
  271. strText.Format(_T("%s%d"), _T("V"), i + 1);
  272.             unFlags = DFCS_BUTTONRADIO;
  273. CMessageRecordItemRadioGroup* pRecord = (CMessageRecordItemRadioGroup*)pDrawArgs->pItem;
  274. if(pRecord->GetValue() & (1 << i))
  275. {
  276. unFlags |= DFCS_CHECKED;
  277.                 unIconId = 3;
  278. }
  279. else
  280. {
  281. unFlags &= ~DFCS_CHECKED;
  282.                 unIconId = 2;
  283. }
  284. }
  285. if(m_nDrawingMethod == 1)
  286. ::DrawFrameControl(pDrawArgs->pDC->GetSafeHdc(), rc, DFC_BUTTON, unFlags);
  287. else
  288. m_ilControls.Draw(pDrawArgs->pDC, unIconId, rc.TopLeft(), ILD_NORMAL);
  289.         TextOut(pDrawArgs->pDC->GetSafeHdc(), rc.left + 20, rc.top, strText, strText.GetLength());
  290.         rc.top += 15;
  291.         rc.bottom += 15;
  292. }
  293. return TRUE;
  294. }
  295. BOOL CCustomDrawReportDlg::PreTranslateMessage(MSG* pMsg) 
  296. {
  297. if(pMsg->message == WM_LBUTTONDOWN)
  298. {
  299. CPoint pt = pMsg->pt;
  300. m_wndReportCtrl.ScreenToClient(&pt);
  301. CXTPReportRow* pRow = m_wndReportCtrl.HitTest(pt);
  302. if(pRow)
  303. {
  304. CXTPReportRecordItem* pItem = pRow->HitTest(pt);
  305. if(pItem)
  306. {
  307. if(pItem->GetIndex() < 1)
  308. return 0;
  309. unsigned int unControls = GetControlsNumber(pItem);
  310. if(unControls == 0)
  311. return 0;
  312. CRect rc = pRow->GetItemRect(pItem);
  313. rc.right = rc.left + 14 + 25;
  314. rc.bottom = rc.top + 14;
  315. for(unsigned int i = 0; i < unControls; i++)
  316. {
  317. if(rc.PtInRect(pt))
  318. {
  319. if(pItem->GetIndex() == 1)
  320. {
  321. ((CMessageRecordItemCheckGroup*)pItem)->ToggleBit(i);
  322. }
  323. else
  324. {
  325. ((CMessageRecordItemRadioGroup*)pItem)->SetValue(1 << i);
  326. }
  327. }
  328. rc.OffsetRect(0, 15);
  329. }
  330. }
  331. }
  332. }
  333. return CXTResizeDialog::PreTranslateMessage(pMsg);
  334. }
  335. void CCustomDrawReportDlg::OnUseDrawframecontrol() 
  336. {
  337. if(m_nDrawingMethod == 1)
  338. return;
  339. m_nDrawingMethod = 1;
  340. CMenu* pMenu = GetMenu();
  341. if(pMenu)
  342. {
  343. CMenu* pSubMenu = pMenu->GetSubMenu(0);
  344. if(pSubMenu)
  345. pSubMenu->CheckMenuRadioItem(IDM_USE_DRAWFRAMECONTROL, IDM_USE_DRAWSTATE, IDM_USE_DRAWFRAMECONTROL, MF_BYCOMMAND);
  346. }
  347. m_wndReportCtrl.RedrawControl();
  348. }
  349. void CCustomDrawReportDlg::OnUseDrawstate() 
  350. {
  351. if(m_nDrawingMethod == 2)
  352. return;
  353. m_nDrawingMethod = 2;
  354. CMenu* pMenu = GetMenu();
  355. if(pMenu)
  356. {
  357. CMenu* pSubMenu = pMenu->GetSubMenu(0);
  358. if(pSubMenu)
  359. pSubMenu->CheckMenuRadioItem(IDM_USE_DRAWFRAMECONTROL, IDM_USE_DRAWSTATE, IDM_USE_DRAWSTATE, MF_BYCOMMAND);
  360. }
  361. m_wndReportCtrl.RedrawControl();
  362. }
  363. void CCustomDrawReportDlg::OnTimer(UINT_PTR nIDEvent)
  364. {
  365. // advance progresses
  366. for(int i = 0; i < m_wndReportCtrl.GetRecords()->GetCount(); i++)
  367. {
  368. CXTPReportRecordItemProgress* pItem = DYNAMIC_DOWNCAST(CXTPReportRecordItemProgress, m_wndReportCtrl.GetRecords()->GetAt(i)->GetItem(REPORTCOLUMN_ATTR3));
  369. pItem->StepProgressPos();
  370. int nLower, nUpper;
  371. pItem->GetProgressRange(nLower, nUpper);
  372. if(pItem->GetProgressPos() == nLower || pItem->GetProgressPos() == nUpper)
  373. pItem->SetProgressStep(-pItem->GetProgressStep());
  374. CString strProgress;
  375. strProgress.Format(_T("Progress %d: (%d%%)"), i, pItem->GetProgressPosPercent());
  376. pItem->SetValue(strProgress);
  377. }
  378. m_wndReportCtrl.RedrawControl();
  379. CXTResizeDialog::OnTimer(nIDEvent);
  380. }