Dlg_Report.cpp 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600
  1. // Dlg_Report.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "StoneuReport.h"
  5. #include "Dlg_Report.h"
  6. #include ".\dlg_report.h"
  7. #include "Dlg_ChangeReport.h"
  8. #include "excel9.h"
  9. #include "DateFun.h"
  10. #include "global.h"
  11. #include "SysLib.h"
  12. #include "MainFrm.h"
  13. #include "StoneuReportDoc.h"
  14. #include "StoneuReportView.h"
  15. #define WM_SAVEPIC ( WM_USER+60000 )
  16. extern HANDLE g_hRunObject;
  17. // CDlg_Report 对话框
  18. IMPLEMENT_DYNAMIC(CDlg_Report, CDialog)
  19. CDlg_Report::CDlg_Report(CWnd* pParent /*=NULL*/)
  20. : CDialog(CDlg_Report::IDD, pParent)
  21. {
  22. m_sReportTitle = "日报表";
  23. m_sPrintDate = "打印日期:";
  24. m_sChooseDate = "时间段:";
  25. m_sCheckPeople = "复核人:";
  26. m_sMakePeople = "制表人:";
  27. m_sMakeUnit = "编制单位:";
  28. m_sMakeUnitName = "";
  29. m_sAddress = "地点:";
  30. m_sAddressName = "";
  31. m_sCheckPeopleName = "";
  32. m_sMakePeopleName = "";
  33. m_sPageShow = "0/0 页";
  34. m_TitleBrush.CreateSolidBrush( RGB(189,184,238) );
  35. m_PanelBrush.CreateSolidBrush( RGB(255,255,255) );
  36. m_ContentBrush.CreateSolidBrush( RGB(204,255,255) );
  37. m_WhileBrush.CreateSolidBrush( RGB(255,255,255) );
  38. m_FontTitle.CreateFont(30,0,0,0,FW_BOLD,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
  39. OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"宋体");
  40. m_FontDate.CreateFont(18,0,0,0,FW_BOLD,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
  41. OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"宋体");
  42. m_nDateType = REPORT_DAY;
  43. m_nListOneRowHeight = 30;
  44. m_nListPageRowSize = 1;
  45. m_nMaxPage = 1;
  46. m_nCurPage = 1;
  47. m_nToPage = 0;
  48. m_nReportType = 0;
  49. }
  50. CDlg_Report::~CDlg_Report()
  51. {
  52. }
  53. void CDlg_Report::DoDataExchange(CDataExchange* pDX)
  54. {
  55. CDialog::DoDataExchange(pDX);
  56. DDX_Control(pDX, IDC_STA_REPORT, m_ReportFrame);
  57. DDX_Control(pDX, IDC_LIST_REPORT, m_List_Report);
  58. DDX_Control(pDX, IDC_STA_CHECKPEOPLENAME, m_Sta_CheckPeopleName);
  59. DDX_Control(pDX, IDC_STA_MAKEPEOPLENAME, m_Sta_MakePeopleName);
  60. DDX_Control(pDX, IDC_STA_REPORTTITLE, m_Sta_ReportTitle);
  61. DDX_Control(pDX, IDC_STA_MAKEUNIT, m_Sta_MakeUnit);
  62. DDX_Control(pDX, IDC_STA_ADDRESS, m_Sta_Address);
  63. DDX_Control(pDX, IDC_SCOPE, m_wndScope);
  64. }
  65. BEGIN_MESSAGE_MAP(CDlg_Report, CDialog)
  66. ON_WM_CTLCOLOR()
  67. ON_WM_ERASEBKGND()
  68. ON_WM_PAINT()
  69. ON_WM_LBUTTONDBLCLK()
  70. ON_WM_LBUTTONDOWN()
  71. ON_MESSAGE(WM_BEGIN_PRINTING,OnBeginPrinting)
  72. ON_MESSAGE(WM_END_PRINTING,OnEndPrinting)
  73. ON_MESSAGE(WM_MY_PRINT,OnMyPrint)
  74. ON_WM_TIMER()
  75. END_MESSAGE_MAP()
  76. // CDlg_Report 消息处理程序
  77. BOOL CDlg_Report::OnInitDialog()
  78. {
  79. CDialog::OnInitDialog();
  80. //// TODO: 在此添加额外的初始化
  81. //m_List_Report.SetHeaderBKColor(79,129,189,0);//(204,255,255,0); //设置头部背景色
  82. ////m_List_Report.SetFontHW(50,0); //设置字体高度,和宽度,0表示缺省宽度
  83. //m_List_Report.SetHeaderTextColor( RGB(255,255,255) );
  84. ////m_List_Rule.SetColTextColor(2,RGB(255,255,100)); //设置列文本颜色
  85. ////m_List_Rule.SetItemTextColor(3,1,RGB(255,0,0)); //设置单元格字体颜色
  86. //int screenx=GetSystemMetrics(SM_CXSCREEN);
  87. //int screeny=GetSystemMetrics(SM_CYSCREEN);
  88. //int n=0;
  89. //m_List_Report.InsertColumn(n++,"编号",LVCFMT_CENTER,60);
  90. ////m_List_Report.InsertColumn(n++,"区域",LVCFMT_CENTER,110);
  91. //m_List_Report.InsertColumn(n++,"名称",LVCFMT_CENTER,130);
  92. //m_List_Report.InsertColumn(n++,"时间",LVCFMT_CENTER,130);
  93. //m_List_Report.InsertColumn(n++,"最小值",LVCFMT_CENTER,70 );
  94. //m_List_Report.InsertColumn(n++,"最大值",LVCFMT_CENTER,70);
  95. //m_List_Report.InsertColumn(n++,"平均值",LVCFMT_CENTER,70);
  96. //m_List_Report.InsertColumn(n++,"报警次数",LVCFMT_CENTER,80);
  97. ////m_List_Report.InsertColumn(n++,"原因",LVCFMT_CENTER,340);
  98. ////m_List_Report.InsertColumn(n++,"处理",LVCFMT_CENTER,150);
  99. //m_List_Report.InsertColumn(n++,"备注",LVCFMT_CENTER,110);
  100. //m_List_Report.SetExtendedStyle(m_List_Report.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
  101. ////m_List_Report.SetBkColor( RGB( 204,232,207 ) );
  102. ////SetWindowLong(m_ctrlList.m_hWnd ,GWL_EXSTYLE,WS_EX_CLIENTEDGE);
  103. ////m_ctrlList.SetExtendedStyle(LVS_EX_GRIDLINES); //设置扩展风格为网格
  104. ////::SendMessage(m_ctrlList.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
  105. //m_List_Report.SetRowHeigt( m_nListOneRowHeight );
  106. SYSTEMTIME st;
  107. GetLocalTime( &st );
  108. CString s;
  109. s.Format( "%d-%02d-%02d",st.wYear,st.wMonth,st.wDay );
  110. m_sPrintDate += s;
  111. CString sTemp;
  112. g_IniFile.GetVarStr( "report","ReportTitle",sTemp );
  113. if( sTemp!="" )
  114. m_sReportTitle = sTemp;
  115. g_IniFile.GetVarStr( "report","UnitName",sTemp );
  116. if( sTemp=="" )
  117. m_sMakeUnitName = "双击修改";
  118. else
  119. m_sMakeUnitName = sTemp;
  120. g_IniFile.GetVarStr( "report","Address",sTemp );
  121. if( sTemp=="" )
  122. m_sAddressName = "双击修改";
  123. else
  124. m_sAddressName = sTemp;
  125. g_IniFile.GetVarStr( "report","CheckPeople",sTemp );
  126. if( sTemp=="" )
  127. m_sCheckPeopleName = "双击修改";
  128. else
  129. m_sCheckPeopleName = sTemp;
  130. g_IniFile.GetVarStr( "report","MakePeople",sTemp );
  131. if( sTemp=="" )
  132. m_sMakePeopleName = "双击修改";
  133. else
  134. m_sMakePeopleName = sTemp;
  135. UpdateData( false );
  136. //SetTimer( 1,1000,NULL );
  137. //SetTimer( 2,1000,NULL );
  138. m_hSavePic = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadSavePic,this,0,NULL);
  139. return TRUE; // return TRUE unless you set the focus to a control
  140. // 异常: OCX 属性页应返回 FALSE
  141. }
  142. HBRUSH CDlg_Report::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  143. {
  144. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  145. // TODO: 在此更改 DC 的任何属性
  146. // TODO: 如果默认的不是所需画笔,则返回另一个画笔
  147. return hbr;
  148. }
  149. BOOL CDlg_Report::OnEraseBkgnd(CDC* pDC)
  150. {
  151. // TODO: 在此添加消息处理程序代码和/或调用默认值
  152. CRect rect, rect2,rect3;
  153. this->GetWindowRect(&rect);
  154. ScreenToClient(&rect);
  155. pDC->FillRect(rect,&m_PanelBrush);
  156. m_ReportFrame.GetWindowRect( rect2 );
  157. ScreenToClient(&rect2);
  158. pDC->FillRect(rect2,&m_ContentBrush);
  159. rect3.left = rect2.left;
  160. rect3.right = rect2.right;
  161. rect3.top = rect2.top;
  162. rect3.bottom = rect3.top+65;
  163. pDC->FillRect(rect3,&m_TitleBrush);
  164. return TRUE;
  165. //return CDialog::OnEraseBkgnd(pDC);
  166. }
  167. void CDlg_Report::OnPaint()
  168. {
  169. CPaintDC dc(this); // device context for painting
  170. // TODO: 在此处添加消息处理程序代码
  171. // 不为绘图消息调用 CDialog::OnPaint()m_sPrintDate
  172. if( m_nReportType==0 )
  173. {
  174. CRect rc;
  175. CRect rcFrame;
  176. m_ReportFrame.GetWindowRect( rcFrame );
  177. ScreenToClient( &rcFrame );
  178. CRect rcReportList;
  179. m_List_Report.GetWindowRect( rcReportList );
  180. ScreenToClient( &rcReportList );
  181. CFont *pFont;
  182. pFont = dc.SelectObject(&m_FontTitle);
  183. dc.SetTextAlign(TA_CENTER|TA_TOP);
  184. dc.SetBkMode(TRANSPARENT);
  185. dc.SetTextColor( RGB( 0,0,255 ) );
  186. //报表标题
  187. dc.TextOut( rcFrame.left+rcFrame.Width()/2,rcFrame.top+5,m_sReportTitle );
  188. pFont = dc.SelectObject(&m_FontDate);
  189. dc.SetTextAlign(TA_LEFT|TA_BOTTOM);
  190. //打印时间
  191. dc.TextOut( rcFrame.left+5,rcReportList.top-28,m_sPrintDate );
  192. //时间段
  193. dc.TextOut( rcFrame.left+5+19,rcReportList.top-5,m_sChooseDate );
  194. //制表单位
  195. dc.SetTextAlign(TA_LEFT|TA_BOTTOM);
  196. dc.TextOut( rcFrame.left+rcFrame.Width()/2+100,rcReportList.top-28,m_sMakeUnit );
  197. m_Sta_MakeUnit.GetWindowRect( rc );
  198. ScreenToClient( &rc );
  199. dc.SetTextAlign(TA_LEFT|TA_TOP);
  200. dc.TextOut( rc.left,rc.top,m_sMakeUnitName );
  201. //地点
  202. dc.SetTextAlign(TA_LEFT|TA_BOTTOM);
  203. dc.TextOut( rcFrame.left+rcFrame.Width()/2+100+38,rcReportList.top-5,m_sAddress );
  204. m_Sta_Address.GetWindowRect( rc );
  205. ScreenToClient( &rc );
  206. dc.SetTextAlign(TA_LEFT|TA_TOP);
  207. dc.TextOut( rc.left,rc.top,m_sAddressName );
  208. dc.SetTextAlign(TA_LEFT|TA_TOP);
  209. //复核人
  210. dc.TextOut( rcFrame.left+5,rcReportList.bottom+5,m_sCheckPeople );
  211. m_Sta_CheckPeopleName.GetWindowRect( rc );
  212. ScreenToClient( &rc );
  213. dc.TextOut( rc.left,rc.top,m_sCheckPeopleName );
  214. //制表人
  215. dc.TextOut( rcFrame.left+rcFrame.Width()/2+100,rcReportList.bottom+5,m_sMakePeople );
  216. m_Sta_MakePeopleName.GetWindowRect( rc );
  217. ScreenToClient( &rc );
  218. dc.TextOut( rc.left,rc.top,m_sMakePeopleName );
  219. if( m_nCurPage+1>m_nMaxPage )
  220. m_nCurPage--;
  221. m_sPageShow.Format( "%d/%d 页",m_nCurPage+1,m_nMaxPage );
  222. dc.TextOut( rcFrame.left+rcFrame.Width()-100,rcReportList.bottom+5,m_sPageShow );
  223. dc.SelectObject(pFont);
  224. }
  225. }
  226. void CDlg_Report::GetListRowHeightAndPageRowSize( int iListHeight,int &iListRowHeight,int &iListPageRowSize )
  227. {
  228. iListHeight -= 1;
  229. int nRowHeight1=30,nRowHeight2=29,nRowHeight3=28,nRowHeight4=27,nRowHeight5=26,nRowHeight6=25,nRowHeight7=24;
  230. int n1,n2,n3,n4,n5,n6,n7;
  231. n1 = iListHeight % nRowHeight1;
  232. n2 = iListHeight % nRowHeight2;
  233. n3 = iListHeight % nRowHeight3;
  234. n4 = iListHeight % nRowHeight4;
  235. n5 = iListHeight % nRowHeight5;
  236. n6 = iListHeight % nRowHeight6;
  237. n7 = iListHeight % nRowHeight7;
  238. int nMin = n1;
  239. if( nMin>n2 ) nMin = n2;
  240. if( nMin>n3 ) nMin = n3;
  241. if( nMin>n4 ) nMin = n4;
  242. if( nMin>n5 ) nMin = n5;
  243. if( nMin>n6 ) nMin = n6;
  244. if( nMin>n7 ) nMin = n7;
  245. if( nMin==n1 )
  246. {
  247. iListRowHeight = nRowHeight1;
  248. iListPageRowSize = iListHeight / iListRowHeight;
  249. }
  250. else if( nMin==n2 )
  251. {
  252. iListRowHeight = nRowHeight2;
  253. iListPageRowSize = iListHeight / iListRowHeight;
  254. }
  255. else if( nMin==n3 )
  256. {
  257. iListRowHeight = nRowHeight3;
  258. iListPageRowSize = iListHeight / iListRowHeight;
  259. }
  260. else if( nMin==n4 )
  261. {
  262. iListRowHeight = nRowHeight4;
  263. iListPageRowSize = iListHeight / iListRowHeight;
  264. }
  265. else if( nMin==n5 )
  266. {
  267. iListRowHeight = nRowHeight5;
  268. iListPageRowSize = iListHeight / iListRowHeight;
  269. }
  270. else if( nMin==n6 )
  271. {
  272. iListRowHeight = nRowHeight6;
  273. iListPageRowSize = iListHeight / iListRowHeight;
  274. }
  275. else if( nMin==n7 )
  276. {
  277. iListRowHeight = nRowHeight7;
  278. iListPageRowSize = iListHeight / iListRowHeight;
  279. }
  280. }
  281. void CDlg_Report::SetPos( CRect rect )
  282. {
  283. CRect rc1;
  284. rc1.left = 0;
  285. rc1.right = rc1.left+rect.Width();
  286. rc1.top = 0;
  287. rc1.bottom = rc1.top+rect.Height()-4;
  288. this->MoveWindow( rc1 );
  289. CRect rcReportFrame;
  290. rcReportFrame.left = rc1.left+0;
  291. rcReportFrame.right = rc1.right-0;
  292. rcReportFrame.top = rc1.top+0;
  293. rcReportFrame.bottom = rc1.bottom-0;
  294. m_ReportFrame.MoveWindow( rcReportFrame );
  295. m_wndScope.MoveWindow( rcReportFrame );
  296. CRect rcReportTitle;
  297. rcReportTitle.left = rcReportFrame.left+rcReportFrame.Width()/2 - 100;
  298. rcReportTitle.right = rcReportTitle.left+200;
  299. rcReportTitle.top = rcReportFrame.top+5;
  300. rcReportTitle.bottom = rcReportTitle.top+25;
  301. m_Sta_ReportTitle.MoveWindow( rcReportTitle );
  302. int bottom = rcReportFrame.bottom-35;
  303. int top = rcReportFrame.top+120;
  304. int H = bottom - top - 23;
  305. GetListRowHeightAndPageRowSize( H,m_nListOneRowHeight,m_nListPageRowSize);
  306. //m_nListPageRowSize = H/m_nListOneRowHeight;
  307. //if( H%m_nListOneRowHeight + 5>=m_nListOneRowHeight )
  308. //{
  309. // m_nListPageRowSize++;
  310. // m_nListOneRowHeight--;
  311. //}
  312. //bottom -= H%m_nListOneRowHeight;
  313. CRect rcReportList;
  314. rcReportList.left = rcReportFrame.left+0;
  315. rcReportList.right = rcReportFrame.right-0;
  316. rcReportList.top = top;
  317. rcReportList.bottom = bottom;
  318. m_List_Report.MoveWindow( rcReportList );
  319. CRect rcStaCheckPeople;
  320. rcStaCheckPeople.left = rcReportFrame.left+80;
  321. rcStaCheckPeople.right = rcStaCheckPeople.left+100;
  322. rcStaCheckPeople.top = rcReportList.bottom+3;
  323. rcStaCheckPeople.bottom = rcStaCheckPeople.top+20;
  324. m_Sta_CheckPeopleName.MoveWindow( rcStaCheckPeople );
  325. CRect rcStaMakePeople;
  326. rcStaMakePeople.left = rcReportFrame.left+rcReportFrame.Width()/2+100+80;
  327. rcStaMakePeople.right = rcStaMakePeople.left+100;
  328. rcStaMakePeople.top = rcReportList.bottom+3;
  329. rcStaMakePeople.bottom = rcStaMakePeople.top+20;
  330. m_Sta_MakePeopleName.MoveWindow( rcStaMakePeople );
  331. CRect rcMakeUnit;
  332. rcMakeUnit.left = rcReportFrame.left+rcReportFrame.Width()/2+100+100;
  333. rcMakeUnit.right = rcMakeUnit.left+200;
  334. rcMakeUnit.top = rcReportList.top-48;
  335. rcMakeUnit.bottom = rcMakeUnit.top+25;
  336. m_Sta_MakeUnit.MoveWindow( rcMakeUnit );
  337. CRect rcAddress;
  338. rcAddress.left = rcReportFrame.left+rcReportFrame.Width()/2+100+100;
  339. rcAddress.right = rcAddress.left+200;
  340. rcAddress.top = rcReportList.top-22;
  341. rcAddress.bottom = rcAddress.top+25;
  342. m_Sta_Address.MoveWindow( rcAddress );
  343. //////////////////////////////////////////////////////////////////////////////////////////////
  344. // TODO: 在此添加额外的初始化
  345. m_List_Report.SetHeaderBKColor(79,129,189,0);//(204,255,255,0); //设置头部背景色
  346. //m_List_Report.SetFontHW(50,0); //设置字体高度,和宽度,0表示缺省宽度
  347. m_List_Report.SetHeaderTextColor( RGB(255,255,255) );
  348. //m_List_Rule.SetColTextColor(2,RGB(255,255,100)); //设置列文本颜色
  349. //m_List_Rule.SetItemTextColor(3,1,RGB(255,0,0)); //设置单元格字体颜色
  350. int W = (rcReportList.Width()-6)/8;
  351. int nMod = rcReportList.Width()%8;
  352. int n=0;
  353. m_List_Report.InsertColumn(n++,"编号",LVCFMT_CENTER,W-30);
  354. //m_List_Report.InsertColumn(n++,"区域",LVCFMT_CENTER,110);
  355. m_List_Report.InsertColumn(n++,"名称",LVCFMT_RIGHT,W+30);
  356. m_List_Report.InsertColumn(n++,"时间",LVCFMT_CENTER,W);
  357. m_List_Report.InsertColumn(n++,"最小值",LVCFMT_CENTER,W );
  358. m_List_Report.InsertColumn(n++,"最大值",LVCFMT_CENTER,W);
  359. m_List_Report.InsertColumn(n++,"平均值",LVCFMT_CENTER,W);
  360. m_List_Report.InsertColumn(n++,"报警次数",LVCFMT_CENTER,W);
  361. //m_List_Report.InsertColumn(n++,"原因",LVCFMT_CENTER,340);
  362. //m_List_Report.InsertColumn(n++,"处理",LVCFMT_CENTER,150);
  363. m_List_Report.InsertColumn(n++,"备注",LVCFMT_CENTER,W+nMod);
  364. m_List_Report.SetExtendedStyle(m_List_Report.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
  365. //m_List_Report.SetBkColor( RGB( 204,232,207 ) );
  366. //SetWindowLong(m_ctrlList.m_hWnd ,GWL_EXSTYLE,WS_EX_CLIENTEDGE);
  367. //m_ctrlList.SetExtendedStyle(LVS_EX_GRIDLINES); //设置扩展风格为网格
  368. //::SendMessage(m_ctrlList.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
  369. m_List_Report.SetRowHeigt( m_nListOneRowHeight );
  370. //////////////////////////////////////////////////////////////////////////////////////////////////
  371. }
  372. void CDlg_Report::OnLButtonDown(UINT nFlags, CPoint point)
  373. {
  374. // TODO: 在此添加消息处理程序代码和/或调用默认值
  375. SetListRowNoChoose();
  376. CDialog::OnLButtonDown(nFlags, point);
  377. }
  378. void CDlg_Report::OnLButtonDblClk(UINT nFlags, CPoint point)
  379. {
  380. // TODO: 在此添加消息处理程序代码和/或调用默认值
  381. CRect rect[10];
  382. m_Sta_ReportTitle.GetWindowRect( rect[0] ); ScreenToClient( &rect[0] );
  383. m_Sta_CheckPeopleName.GetWindowRect( rect[1] ); ScreenToClient( &rect[1] );
  384. m_Sta_MakePeopleName.GetWindowRect( rect[2] ); ScreenToClient( &rect[2] );
  385. m_Sta_MakeUnit.GetWindowRect( rect[3] ); ScreenToClient( &rect[3] );
  386. m_Sta_Address.GetWindowRect( rect[4] ); ScreenToClient( &rect[4] );
  387. int nIndex = -1;
  388. for( int i=0;i<10;i++ )
  389. {
  390. if( rect[i].PtInRect( point ) )
  391. {
  392. nIndex = i;
  393. break;
  394. }
  395. }
  396. if( nIndex!=-1 )
  397. {
  398. CDlg_ChangeReport dlg;
  399. switch( nIndex )
  400. {
  401. case 0: dlg.m_sEdit_Content = m_sReportTitle; break;
  402. case 1: dlg.m_sEdit_Content = m_sCheckPeopleName; break;
  403. case 2: dlg.m_sEdit_Content = m_sMakePeopleName; break;
  404. case 3: dlg.m_sEdit_Content = m_sMakeUnitName; break;
  405. case 4: dlg.m_sEdit_Content = m_sAddressName; break;
  406. }
  407. if( dlg.DoModal()==IDOK )
  408. {
  409. switch( nIndex )
  410. {
  411. case 0:
  412. {
  413. m_sReportTitle = dlg.m_sEdit_Content;
  414. g_IniFile.SetVarStr( "report","ReportTitle",m_sReportTitle );
  415. break;
  416. }
  417. case 1:
  418. {
  419. m_sCheckPeopleName = dlg.m_sEdit_Content;
  420. g_IniFile.SetVarStr( "report","CheckPeople",m_sCheckPeopleName );
  421. break;
  422. }
  423. case 2:
  424. {
  425. m_sMakePeopleName = dlg.m_sEdit_Content;
  426. g_IniFile.SetVarStr( "report","MakePeople",m_sMakePeopleName );
  427. break;
  428. }
  429. case 3:
  430. {
  431. m_sMakeUnitName = dlg.m_sEdit_Content;
  432. g_IniFile.SetVarStr( "report","UnitName",m_sMakeUnitName );
  433. break;
  434. }
  435. case 4:
  436. {
  437. m_sAddressName = dlg.m_sEdit_Content;
  438. g_IniFile.SetVarStr( "report","Address",m_sAddressName );
  439. break;
  440. }
  441. }
  442. Invalidate( );
  443. }
  444. }
  445. CDialog::OnLButtonDblClk(nFlags, point);
  446. }
  447. void CDlg_Report::InsertToList( CString sVarName,CString sTime,CString sMinValue,CString sMaxValue,CString sAverageValue,
  448. CString sAlarmTimes,CString sCause,CString sDealWith,CString sRemarks,bool bColor )
  449. {
  450. CString sIndex;
  451. int nSize = m_List_Report.GetItemCount();
  452. sIndex.Format( "%d",nSize+m_nCurPage*m_nListPageRowSize+1 );
  453. m_List_Report.InsertItem(nSize, sIndex);
  454. m_List_Report.SetItemText(nSize, 1, sVarName );
  455. m_List_Report.SetItemText(nSize, 2, sTime);
  456. m_List_Report.SetItemText(nSize, 3, sMinValue);
  457. m_List_Report.SetItemText(nSize, 4, sMaxValue);
  458. m_List_Report.SetItemText(nSize, 5, sAverageValue );
  459. m_List_Report.SetItemText(nSize, 6, sAlarmTimes );
  460. m_List_Report.SetItemText(nSize, 7, sCause );
  461. m_List_Report.SetItemText(nSize, 8, sDealWith );
  462. m_List_Report.SetItemText(nSize, 9, sRemarks );
  463. COLORREF color1 = RGB(219,229,239);//RGB(181,202,227);
  464. COLORREF color2 = RGB(230,249,249);
  465. if( nSize%2==1 )//if( bColor )//
  466. {
  467. m_List_Report.SetItemColor( 0,nSize,color1 );
  468. m_List_Report.SetItemColor( 1,nSize,color1 );
  469. m_List_Report.SetItemColor( 2,nSize,color1 );
  470. m_List_Report.SetItemColor( 3,nSize,color1 );
  471. m_List_Report.SetItemColor( 4,nSize,color1 );
  472. m_List_Report.SetItemColor( 5,nSize,color1 );
  473. m_List_Report.SetItemColor( 6,nSize,color1 );
  474. m_List_Report.SetItemColor( 7,nSize,color1 );
  475. m_List_Report.SetItemColor( 8,nSize,color1 );
  476. m_List_Report.SetItemColor( 9,nSize,color1 );
  477. //m_List_Report.SetItemTextColor( 0,nSize,RGB(255,255,255) );
  478. //m_List_Report.SetItemTextColor( 1,nSize,RGB(255,255,255) );
  479. //m_List_Report.SetItemTextColor( 2,nSize,RGB(255,255,255) );
  480. //m_List_Report.SetItemTextColor( 3,nSize,RGB(255,255,255) );
  481. //m_List_Report.SetItemTextColor( 4,nSize,RGB(255,255,255) );
  482. //m_List_Report.SetItemTextColor( 5,nSize,RGB(255,255,255) );
  483. }
  484. else
  485. {
  486. m_List_Report.SetItemColor( 0,nSize,color2 );
  487. m_List_Report.SetItemColor( 1,nSize,color2 );
  488. m_List_Report.SetItemColor( 2,nSize,color2 );
  489. m_List_Report.SetItemColor( 3,nSize,color2 );
  490. m_List_Report.SetItemColor( 4,nSize,color2 );
  491. m_List_Report.SetItemColor( 5,nSize,color2 );
  492. m_List_Report.SetItemColor( 6,nSize,color2 );
  493. m_List_Report.SetItemColor( 7,nSize,color2 );
  494. m_List_Report.SetItemColor( 8,nSize,color2 );
  495. m_List_Report.SetItemColor( 9,nSize,color2 );
  496. }
  497. }
  498. void CDlg_Report::InsertDataToReport()
  499. {
  500. if( g_OperateFlag.bReportOperate )
  501. return;
  502. g_OperateFlag.bReportOperate = true;
  503. for( int i=0;i<m_nVarNumber;i++ )
  504. m_ValueList[i].clear();
  505. m_nVarNumber = 0;
  506. CString sVarID,sDevName,sTime,sVarName,sVarDesc,sValue;
  507. CString strStartDate, strEndDate,sTemp;
  508. CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
  509. CStoneuReportView* pView = (CStoneuReportView*)(pFrame->GetActiveView());
  510. if( !pView->GetCtrlTime( strStartDate,strEndDate ) )
  511. return;
  512. m_nDateType = pView->m_pDlg_DateFilt->m_nDateType;
  513. GetReportTitle();
  514. m_wndScope.Clear();
  515. m_wndScope.m_nDateUnit = pView->m_pDlg_DateFilt->m_nDateType;
  516. m_wndScope.SetStartEndTime( strStartDate,strEndDate );
  517. int nMinValue=1000,nMaxValue=0;
  518. int nYear1,nMonth1,nDay1;
  519. int nYear2,nMonth2,nDay2;
  520. int nH,nM,nS;
  521. sscanf(strStartDate,"%d-%d-%d %d:%d:%d",&nYear1,&nMonth1,&nDay1,&nH,&nM,&nS);
  522. sscanf(strEndDate,"%d-%d-%d %d:%d:%d",&nYear2,&nMonth2,&nDay2,&nH,&nM,&nS);
  523. m_sChooseDate.Format( "时间段:%d-%02d-%02d 至 %d-%02d-%02d",nYear1,nMonth1,nDay1,nYear2,nMonth2,nDay2 );
  524. int nSize = pView->m_VarInfoList.size();
  525. std::list<VAR_INFO>::iterator value_it = pView->m_VarInfoList.begin();
  526. for( int m=0;m<nSize;m++)
  527. {
  528. sVarID = (*value_it).sVarID;
  529. sDevName = (*value_it).sDevName;
  530. sTime = (*value_it).sTime;
  531. sVarName = (*value_it).sVarName;
  532. sVarDesc = (*value_it).sVarDesc;
  533. sValue = (*value_it).sVarValue;
  534. if( sTime.Left(2)!="20" )
  535. sTime = "20"+sTime;
  536. DATA_STRUCT tmp;
  537. tmp.sDevName = sDevName;
  538. tmp.sVarDesc = sVarDesc;
  539. tmp.sTime = sTime;
  540. tmp.dValue = atof( sValue );
  541. int nIndex = GetVarIndex( sVarDesc );
  542. if( nIndex>=VAR_MAX_SIZE )
  543. continue;
  544. m_ValueList[nIndex].push_back(tmp);
  545. m_nVarNumber = m_nVarNumber<nIndex+1 ? nIndex+1 : m_nVarNumber;
  546. value_it++;
  547. }
  548. m_ListItem.clear();
  549. int INDEX=0;
  550. CString sMinValue,sMaxValue,sAverageValue;
  551. CString sAlarmTimes,sCause,sDealWith,sRemarks;
  552. double dMinValueCurve=1000,dMaxValueCurve=0;
  553. for( int i=0;i<m_nVarNumber;i++ )
  554. {
  555. int nCount = 0;//在单位时间段内数据个数,为了得到平均值
  556. int nYear1,nMonth1,nDay1;
  557. int nH,nM,nS;
  558. sscanf(strStartDate,"%d-%d-%d %d:%d:%d",&nYear1,&nMonth1,&nDay1,&nH,&nM,&nS);
  559. sTemp.Format( "%04d%02d%02d",nYear1,nMonth1,nDay1 );
  560. int nTimeS = atoi( sTemp );
  561. int nTimeE = 0;
  562. CString sTimeInsert = g_NextTime( m_nDateType,nTimeS,nTimeE,false );
  563. double dMinValue=1000,dMaxValue=0;
  564. double dValueSum = 0;
  565. CString sTimeOld;//保留上一次数据的时间,为了得到这个平均值是那个时间段的
  566. int nSize = m_ValueList[i].size();
  567. std::list<DATA_STRUCT>::iterator value_it = m_ValueList[i].begin();
  568. for( int m=0;m<nSize;m++)
  569. {
  570. double dValue = (*value_it).dValue;
  571. sTime = (*value_it).sTime;
  572. sVarDesc = (*value_it).sVarDesc;
  573. value_it++;
  574. int nYear,nMonth,nDay;
  575. sscanf(sTime,"%d-%d-%d %d:%d:%d",&nYear,&nMonth,&nDay,&nH,&nM,&nS);
  576. sTemp.Format( "%04d%02d%02d",nYear,nMonth,nDay );
  577. int nTimeN = atoi( sTemp );
  578. if( nTimeN>=nTimeS && nTimeN<=nTimeE )
  579. {
  580. nCount++;
  581. dValueSum += dValue;//和
  582. dMinValue = dMinValue<dValue ? dMinValue : dValue;//最小值
  583. dMaxValue = dMaxValue>dValue ? dMaxValue : dValue;//最大值
  584. }
  585. else if( nCount>1 )
  586. {
  587. sVarName = sVarDesc;
  588. sMinValue.Format( "%.1f",dMinValue );
  589. sMaxValue.Format( "%.1f",dMaxValue );
  590. sAverageValue.Format( "%.1f",dValueSum/nCount );
  591. //sAlarmTimes.Format( "%d",nCount );//测试
  592. //InsertToList( sVarName,sTimeInsert,sMinValue,sMaxValue,sAverageValue,sAlarmTimes,sCause,sDealWith,sRemarks,bColor );
  593. INDEX++;
  594. LIST_ITEM tag;
  595. tag.sID.Format( "%d",INDEX );
  596. tag.sVarDesc = sVarName;
  597. tag.sTime = sTimeInsert;
  598. tag.sValueMin = sMinValue;
  599. tag.sValueMax = sMaxValue;
  600. tag.sValueAverage = sAverageValue;
  601. tag.sAlarmTimes = sAlarmTimes;
  602. tag.sCause = sCause;
  603. tag.sDealWith = sDealWith;
  604. tag.sRemarks = sRemarks;
  605. m_ListItem.push_back(tag);
  606. /////////////////////////////////////////////////////////////////////////////////
  607. m_wndScope.AddValue( sDevName,sVarDesc,g_DateCentreTime( m_nDateType,sTimeOld ),atof(sAverageValue) );
  608. dMinValueCurve = dMinValueCurve>atoi(sAverageValue) ? atoi(sAverageValue) : dMinValueCurve;
  609. dMaxValueCurve = dMaxValueCurve<atoi(sAverageValue) ? atoi(sAverageValue) : dMaxValueCurve;
  610. /////////////////////////////////////////////////////////////////////////////////
  611. nCount = 1;
  612. dMinValue = dValue;
  613. dMaxValue = dValue;
  614. dValueSum = dValue;
  615. sTimeInsert = g_NextTime( m_nDateType,nTimeS,nTimeE );
  616. }
  617. else
  618. {
  619. nCount = 1;
  620. dMinValue = dValue;
  621. dMaxValue = dValue;
  622. dValueSum = dValue;
  623. sTimeInsert = g_NextTime( m_nDateType,nTimeS,nTimeE );
  624. }
  625. sTimeOld = sTime;
  626. if( m==nSize-1 && nCount>1 )
  627. {
  628. sVarName = sVarDesc;
  629. sMinValue.Format( "%.1f",dMinValue );
  630. sMaxValue.Format( "%.1f",dMaxValue );
  631. sAverageValue.Format( "%.1f",dValueSum/nCount );
  632. //sAlarmTimes.Format( "%d",nCount );//测试
  633. //InsertToList( sVarName,sTimeInsert,sMinValue,sMaxValue,sAverageValue,sAlarmTimes,sCause,sDealWith,sRemarks,bColor );
  634. INDEX++;
  635. LIST_ITEM tag;
  636. tag.sID.Format( "%d",INDEX );
  637. tag.sVarDesc = sVarName;
  638. tag.sTime = sTimeInsert;
  639. tag.sValueMin = sMinValue;
  640. tag.sValueMax = sMaxValue;
  641. tag.sValueAverage = sAverageValue;
  642. tag.sAlarmTimes = sAlarmTimes;
  643. tag.sCause = sCause;
  644. tag.sDealWith = sDealWith;
  645. tag.sRemarks = sRemarks;
  646. m_ListItem.push_back(tag);
  647. /////////////////////////////////////////////////////////////////////////////////
  648. m_wndScope.AddValue( sDevName,sVarDesc,g_DateCentreTime( m_nDateType,sTimeOld ),atof(sAverageValue) );
  649. dMinValueCurve = dMinValueCurve>atoi(sAverageValue) ? atoi(sAverageValue) : dMinValueCurve;
  650. dMaxValueCurve = dMaxValueCurve<atoi(sAverageValue) ? atoi(sAverageValue) : dMaxValueCurve;
  651. /////////////////////////////////////////////////////////////////////////////////
  652. nCount = 1;
  653. dMinValue = dValue;
  654. dMaxValue = dValue;
  655. dValueSum = dValue;
  656. sTimeInsert = g_NextTime( m_nDateType,nTimeS,nTimeE );
  657. }
  658. }
  659. }
  660. m_wndScope.SetMaxMinData( dMinValueCurve,dMaxValueCurve );
  661. Invalidate();
  662. m_nCurPage = 1;
  663. nSize = m_ListItem.size();
  664. m_nMaxPage = nSize/m_nListPageRowSize;
  665. if( nSize%m_nListPageRowSize!=0 )
  666. m_nMaxPage++;
  667. HomePage();
  668. pView->m_pDlg_Schedule->m_nShowType = 0;
  669. pView->m_pDlg_Schedule->ShowWindow( SW_HIDE );
  670. //m_List_Report.SetColumnWidth( 1,LVSCW_AUTOSIZE );
  671. return ;
  672. }
  673. int CDlg_Report::GetVarIndex( CString sVarDesc )
  674. {
  675. int nRet=0;
  676. for( int i=0;i<VAR_MAX_SIZE;i++ )
  677. {
  678. if( m_ValueList[i].empty() )
  679. {
  680. nRet = i;
  681. break;
  682. }
  683. std::list<DATA_STRUCT>::iterator value_it = m_ValueList[i].begin();
  684. if( (*value_it).sVarDesc==sVarDesc )
  685. {
  686. nRet = i;
  687. break;
  688. }
  689. }
  690. return nRet;
  691. }
  692. void CDlg_Report::GetReportTitle()
  693. {
  694. switch( m_nDateType )
  695. {
  696. case REPORT_DAY: m_sReportTitle = "日报表"; break;
  697. case REPORT_WEEK: m_sReportTitle = "周报表"; break;
  698. case REPORT_MONTH: m_sReportTitle = "月报表"; break;
  699. case REPORT_YEAR: m_sReportTitle = "年报表"; break;
  700. }
  701. }
  702. void CDlg_Report::SetListRowNoChoose()
  703. {
  704. m_List_Report.SetItemState( -1,0,LVIS_SELECTED|LVIS_FOCUSED );
  705. }
  706. void CDlg_Report::SavePic( )
  707. {
  708. SetListRowNoChoose();
  709. DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
  710. LPSTR lpszFilter = "JPG Files (*.jpg)|*.jpg||";
  711. CString sFilePath,sFileName;
  712. CFileDialog dlg(FALSE,NULL,m_sReportTitle,dwFlags,lpszFilter);
  713. //dlg.m_pOFN->nFilterIndex = INDEX;
  714. if(dlg.DoModal()==IDOK)
  715. {
  716. sFilePath = dlg.GetPathName();
  717. sFileName = dlg.GetFileName();
  718. if( sFilePath.Right(4)!=".jpg" )
  719. {
  720. sFilePath += ".jpg";
  721. sFileName += ".jpg";
  722. }
  723. }
  724. else
  725. return;
  726. Sleep( 500 );
  727. m_sFileSavePath = sFilePath;
  728. m_sFileSaveName = sFileName;
  729. //SendMessage( WM_SAVEPIC,*(LPARAM*)&sFilePath,0 );
  730. //SavePic( rect );
  731. }
  732. // 将当前屏幕保存成为jpg图片
  733. // 参数 xs = 图象x岽笮? ys = 图象y轴大小, quality = jpeg图象质量
  734. void CDlg_Report::SaveJpg(LPCWSTR pszFileName, int iX,int iY, int iW, int iH, int quality)
  735. {
  736. //HWND hwnd = ::GetDesktopWindow();
  737. //HDC hdc = GetWindowDC(NULL);
  738. /* int x = GetDeviceCaps(hdc, HORZRES);
  739. int y = GetDeviceCaps(hdc, VERTRES); */
  740. //Invalidate();
  741. HDC hdc = ::GetDC( this->GetSafeHwnd() );
  742. HBITMAP hbmp = ::CreateCompatibleBitmap(hdc, iW, iH), hold;
  743. HDC hmemdc = ::CreateCompatibleDC(hdc);
  744. hold = (HBITMAP)::SelectObject(hmemdc, hbmp);
  745. BitBlt(hmemdc, 0, 0, iW, iH, hdc, iX, iY, SRCCOPY);
  746. SelectObject(hmemdc, hold);
  747. Bitmap bit(iW, iH), bit2(hbmp, NULL);
  748. Graphics g(&bit);
  749. g.ScaleTransform( 1,1 );//(float)xs/x, (float)ys/y);
  750. g.DrawImage(&bit2, 0, 0);
  751. CLSID encoderClsid;
  752. EncoderParameters encoderParameters;
  753. encoderParameters.Count = 1;
  754. encoderParameters.Parameter[0].Guid = EncoderQuality;
  755. encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
  756. encoderParameters.Parameter[0].NumberOfValues = 1;
  757. encoderParameters.Parameter[0].Value = &quality;
  758. GetEncoderClsid(L"image/jpeg", &encoderClsid);
  759. bit.Save(pszFileName, &encoderClsid, &encoderParameters);
  760. DeleteObject( hdc );
  761. ::DeleteObject(hbmp);
  762. ::DeleteObject(hmemdc);
  763. return;
  764. }
  765. int CDlg_Report::GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
  766. {
  767. UINT num = 0; // number of image encoders
  768. UINT size = 0; // size of the image encoder array in bytes
  769. ImageCodecInfo* pImageCodecInfo = NULL;
  770. GetImageEncodersSize(&num, &size);
  771. if(size == 0)
  772. return -1; // Failure
  773. pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
  774. if(pImageCodecInfo == NULL)
  775. return -1; // Failure
  776. GetImageEncoders(num, size, pImageCodecInfo);
  777. for(UINT j = 0; j < num; ++j)
  778. {
  779. if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
  780. {
  781. *pClsid = pImageCodecInfo[j].Clsid;
  782. free(pImageCodecInfo);
  783. return j; // Success
  784. }
  785. }
  786. free(pImageCodecInfo);
  787. return -1; // Failure
  788. }
  789. void CDlg_Report::Print( )
  790. {
  791. if( m_nReportType==0 )
  792. {
  793. PrintList();
  794. }
  795. else
  796. {
  797. CRect rect;
  798. m_ReportFrame.GetWindowRect( rect );
  799. ScreenToClient( &rect );
  800. PrintCurve( rect );
  801. }
  802. }
  803. void CDlg_Report::PrintList( )
  804. {
  805. SetListRowNoChoose();
  806. CRect rect;
  807. m_ReportFrame.GetWindowRect( rect );
  808. ScreenToClient( &rect );
  809. //PrintPic( rect );
  810. CPrintFrame *pFrame = new CPrintFrame;
  811. pFrame->m_pCallerDlg = this;
  812. pFrame->Create(NULL,"Curvefdfd Print",WS_POPUP,CRect(0,0,100,100));
  813. //pFrame->ShowWindow( SW_HIDE );
  814. //pFrame->MoveWindow( CRect(-100,-100,100,20) );//WS_OVERLAPPEDWINDOW
  815. pFrame->m_pView->OnMyPrint();
  816. }
  817. void CDlg_Report::PrintCurve( CRect Rect )
  818. {
  819. CPrintDialog dlg(FALSE, PD_NOPAGENUMS|PD_NOSELECTION, this);
  820. CPaintDC pDC(this);
  821. int m_nClientWidth = Rect.Width();//
  822. int m_nClientHeight = Rect.Height()-6;//
  823. CDC memDC ;
  824. CBitmap memBitmap ;
  825. CBitmap* oldBitmap ; // bitmap originally found in CMemDC
  826. BITMAP bm;
  827. memDC.CreateCompatibleDC(&pDC) ;
  828. memBitmap.CreateCompatibleBitmap(&pDC, m_nClientWidth, m_nClientHeight) ;
  829. oldBitmap = (CBitmap *)memDC.SelectObject(&memBitmap) ;
  830. memBitmap.GetObject(sizeof(bm),&bm);
  831. memDC.StretchBlt(0, 0, m_nClientWidth+30, m_nClientHeight, &pDC, Rect.left, Rect.top, m_nClientWidth+30, m_nClientHeight, SRCCOPY);
  832. if (dlg.DoModal() == IDOK)
  833. {
  834. CDC dc;
  835. dc.Attach(dlg.GetPrinterDC());//把打印设备环境附加到DC对象
  836. DEVMODE* dm = dlg.GetDevMode(); // 提取缺省打印机的DEVMODE数据
  837. dm->dmOrientation = DMORIENT_LANDSCAPE; // 重新修改纸张的打印方向(横向打印)
  838. //dm-> dmOrientation = DMORIENT_PORTRAIT; // 重新修改纸张的打印方向(纵向打印)
  839. dc.ResetDC(dm);
  840. //int xPrintDPI = GetDeviceCaps(dc,LOGPIXELSX);//屏幕DPI(沿屏幕宽度每逻辑英寸的像素数,在多显示器系统中,该值对所显示器相同)
  841. //int yPrintDPI = GetDeviceCaps(dc,LOGPIXELSY);//屏幕DPI(沿屏幕高度每逻辑英寸的像素数,在多显示器系统中,该值对所显示器相同)
  842. //int xPrintWidth = GetDeviceCaps(dc,HORZSIZE);//物理屏幕的宽度(毫米)
  843. //int yPrintHight = GetDeviceCaps(dc,VERTSIZE);//物理屏幕的高度(毫米)
  844. int xPrint = GetDeviceCaps(dc,HORZRES);//屏幕宽(像素)
  845. int yPrint = GetDeviceCaps(dc,VERTRES);//屏幕高(像素)
  846. DOCINFO di;
  847. di.cbSize = sizeof(DOCINFO);
  848. di.lpszDocName = "SimplePrintDoc";
  849. di.lpszOutput = NULL;
  850. di.lpszDatatype = NULL;
  851. di.fwType = 0;
  852. dc.StartDoc(&di); //通知打印机驱动程序执行一新的打印任务
  853. dc.StartPage();//通知打印机驱动程序打印新页
  854. dc.SetMapMode(MM_TEXT);//设置当前影射模式为:单位0.001英寸,X方向向右增加,Y方向向上增加
  855. //CRect rectPrint(0, 0,
  856. // dc.GetDeviceCaps(HORZRES),//返回设备的.以毫米为单位的物理显示宽度
  857. // dc.GetDeviceCaps(VERTRES));//返回设备的.以毫米为单位的物理显示高度
  858. dc.DPtoLP(&Rect);//设备物理单位转化为逻辑单位
  859. //dc.SetWindowOrg(-rect.left, -rect.top);//设置原点
  860. int spaceWidth = (xPrint%m_nClientWidth)/2;
  861. int spacehight = (yPrint%m_nClientHeight)/2;
  862. //dc.SetWindowOrg(-spaceWidth, -spacehight);//设置原点
  863. dc.SetWindowOrg(-spaceWidth-500, -spacehight-300);//设置原点
  864. if (memDC.GetSafeHdc() != NULL)
  865. {
  866. //memDC.BitBlt(0, 0, m_nClientWidth+30, m_nClientHeight,&pDC, -3, -30, SRCCOPY); //通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并
  867. //dc.BitBlt(0,0,m_nClientWidth, m_nClientHeight,&memDC, 0, 0, SRCCOPY);
  868. dc.StretchBlt(0,0,(m_nClientWidth+30)*((xPrint)/(m_nClientWidth+30)), m_nClientHeight*((xPrint)/(m_nClientWidth+30)), &memDC, 0, 0, m_nClientWidth+30, m_nClientHeight, SRCCOPY);
  869. memDC.SelectObject(oldBitmap) ;
  870. }
  871. else
  872. {
  873. memDC.SelectObject(oldBitmap) ;
  874. }
  875. dc.EndPage(); //通知打印机驱动程序页结束
  876. dc.EndDoc();//通知打印机驱动程序打印完毕
  877. DeleteDC(dc.Detach());
  878. }
  879. else
  880. {
  881. memDC.SelectObject(oldBitmap) ;
  882. }
  883. }
  884. void CDlg_Report::PrintPreview()
  885. {
  886. CPrintFrame *pFrame = new CPrintFrame;
  887. pFrame->m_pCallerDlg = this;
  888. pFrame->Create(NULL,"Curve Print Preview",WS_OVERLAPPEDWINDOW,CRect(0,0,0,0));
  889. pFrame->m_pView->OnMyPrintPreview();
  890. }
  891. bool CDlg_Report::IsCanHomePage()
  892. {
  893. bool bRet=true;
  894. if( m_nCurPage==0 )
  895. bRet = false;
  896. return bRet;
  897. }
  898. bool CDlg_Report::IsCanPrePage()
  899. {
  900. bool bRet=true;
  901. if( m_nCurPage==0 )
  902. bRet = false;
  903. return bRet;
  904. }
  905. bool CDlg_Report::IsCanNextPage()
  906. {
  907. bool bRet=true;
  908. if( m_nCurPage>=m_nMaxPage-1 )
  909. bRet = false;
  910. return bRet;
  911. }
  912. bool CDlg_Report::IsCanLastPage()
  913. {
  914. bool bRet=true;
  915. if( m_nCurPage>=m_nMaxPage-1 )
  916. bRet = false;
  917. return bRet;
  918. }
  919. void CDlg_Report::HomePage()
  920. {
  921. if( !IsCanHomePage() )
  922. return;
  923. m_nCurPage = 0;
  924. ShowPage( m_nCurPage );
  925. }
  926. void CDlg_Report::PrePage()
  927. {
  928. if( !IsCanPrePage() )
  929. return;
  930. m_nCurPage--;
  931. ShowPage( m_nCurPage );
  932. }
  933. void CDlg_Report::NextPage()
  934. {
  935. if( !IsCanNextPage() )
  936. return;
  937. m_nCurPage++;
  938. ShowPage( m_nCurPage );
  939. }
  940. void CDlg_Report::LastPage()
  941. {
  942. if( !IsCanLastPage() )
  943. return;
  944. m_nCurPage = m_nMaxPage-1;
  945. ShowPage( m_nCurPage );
  946. }
  947. void CDlg_Report::ShowPage( int iPageIndex )
  948. {
  949. m_List_Report.DeleteAllItems();
  950. int nSize = m_ListItem.size();
  951. std::list<LIST_ITEM>::iterator value_it = m_ListItem.begin();
  952. int nIndexStart = m_nListPageRowSize * iPageIndex;
  953. int nIndexEnd = m_nListPageRowSize * ( iPageIndex+1);
  954. nIndexEnd = nIndexEnd<nSize?nIndexEnd:nSize;
  955. for( int m=0;m<nIndexEnd;m++)
  956. {
  957. if( m>=nIndexStart )
  958. {
  959. InsertToList( (*value_it).sVarDesc,(*value_it).sTime,(*value_it).sValueMin,(*value_it).sValueMax,(*value_it).sValueAverage,
  960. (*value_it).sAlarmTimes,(*value_it).sCause,(*value_it).sDealWith,(*value_it).sRemarks,true );
  961. }
  962. value_it++;
  963. }
  964. CRect rc;
  965. CRect rcFrame;
  966. m_ReportFrame.GetWindowRect( rcFrame );
  967. ScreenToClient( &rcFrame );
  968. CRect rcReportList;
  969. m_List_Report.GetWindowRect( rcReportList );
  970. ScreenToClient( &rcReportList );
  971. CRect rect( rcFrame.left+rcFrame.Width()-100,rcReportList.bottom,rcFrame.right,rcFrame.bottom );
  972. InvalidateRect( rect );//();//
  973. }
  974. /////////////////////////////////////////////////////////////////// 打印函数 ///////////////////////////////////////////////////////////
  975. void CDlg_Report::PrintPageHeader(CDC* pDC, UINT nPageNumber, CPrintInfo* pInfo)
  976. {
  977. CFont *pOldFont;
  978. CFont fontHeader;
  979. fontHeader.CreatePointFont(100,"FixedSys",pDC);
  980. pOldFont=(CFont *)(pDC->SelectObject(&fontHeader));
  981. int nPosY,nPosX;
  982. nPosY=3*m_cyPrinter;
  983. nPosX=m_cxOffset;
  984. pDC->TextOut(nPosX,nPosY,CString("南京航空航天大学"));
  985. CString str;
  986. str.Format("第 %d 页 / 共 %d 页",nPageNumber,pInfo->GetMaxPage());
  987. CSize size=pDC->GetTextExtent(str);
  988. nPosX=m_cxOffset+m_cxWidth-size.cx;
  989. pDC->TextOut(nPosX,nPosY,str);
  990. pDC->MoveTo(m_cxOffset,4*m_cyPrinter);
  991. pDC->LineTo(m_cxOffset+m_cxWidth,4*m_cyPrinter);
  992. pDC->SelectObject(pOldFont);
  993. fontHeader.DeleteObject();
  994. }
  995. LRESULT CDlg_Report::OnBeginPrinting(WPARAM wParam,LPARAM lParam)
  996. {
  997. CDC* pDC = (CDC*)wParam;
  998. CPrintInfo* pInfo = (CPrintInfo *)lParam;
  999. if(m_fontPrinter.m_hObject==NULL)
  1000. m_fontPrinter.CreatePointFont(120,"FixedSys",pDC);
  1001. TEXTMETRIC tm;
  1002. CFont* pOldFont = pDC->SelectObject (&m_fontPrinter);
  1003. pDC->GetTextMetrics (&tm);
  1004. m_cyPrinter = tm.tmHeight + tm.tmExternalLeading;
  1005. CSize size = pDC->GetTextExtent (_T ("---------1---------2---------" \
  1006. "3---------4---------5---------6---------7---------8---"), 81);
  1007. pDC->SelectObject (pOldFont);
  1008. m_cxWidth = size.cx;
  1009. m_nLinesPerPage = (pDC->GetDeviceCaps (VERTRES) -
  1010. (m_cyPrinter * (3 + (2 * PRINTMARGIN)))) / m_cyPrinter;
  1011. pInfo->SetMaxPage (2);
  1012. m_cxOffset = 0;//(pDC->GetDeviceCaps (HORZRES) - size.cx) / 2;
  1013. return TRUE;
  1014. }
  1015. LRESULT CDlg_Report::OnEndPrinting(WPARAM wParam,LPARAM lParam)
  1016. {
  1017. if(m_fontPrinter.m_hObject!=NULL)
  1018. m_fontPrinter.DeleteObject ();
  1019. return TRUE;
  1020. }
  1021. LRESULT CDlg_Report::OnMyPrint(WPARAM wParam,LPARAM lParam)
  1022. {
  1023. UINT gl_uNumOfPoints = 52;
  1024. CDC* pPrintDC = (CDC*)wParam;
  1025. CPrintInfo* pInfo = (CPrintInfo *)lParam;
  1026. int nPageNumber = pInfo->m_nCurPage;
  1027. int i,j;
  1028. CFont *pOldFont;
  1029. CFont DataFont;
  1030. //DataFont.CreatePointFont(120,"宋体",pPrintDC);
  1031. CRect Rect;
  1032. m_ReportFrame.GetWindowRect( Rect );
  1033. ScreenToClient( &Rect );
  1034. //ShowPage( nPageNumber-1 );
  1035. //Sleep( 1000 );
  1036. //if(nPageNumber==1)
  1037. {
  1038. int nClientWidth = Rect.Width();//
  1039. int nClientHeight = Rect.Height()-6;//
  1040. CDC memDC ;
  1041. CBitmap memBitmap ;
  1042. CBitmap* oldBitmap ; // bitmap originally found in CMemDC
  1043. BITMAP bm;
  1044. CPaintDC pDC2(this);
  1045. memDC.CreateCompatibleDC(&pDC2) ;
  1046. memBitmap.CreateCompatibleBitmap(&pDC2, nClientWidth, nClientHeight) ;
  1047. oldBitmap = (CBitmap *)memDC.SelectObject(&memBitmap) ;
  1048. memBitmap.GetObject(sizeof(bm),&bm);
  1049. memDC.StretchBlt(0, 0, nClientWidth+30, nClientHeight, &pDC2, Rect.left, Rect.top, nClientWidth+30, nClientHeight, SRCCOPY);
  1050. pPrintDC->SetMapMode(MM_TEXT);//设置当前影射模式为:单位0.001英寸,X方向向右增加,Y方向向上增加
  1051. pPrintDC->DPtoLP(&Rect);//设备物理单位转化为逻辑单位
  1052. int xPrint = GetDeviceCaps(pPrintDC->GetSafeHdc(),HORZRES);//屏幕宽(像素)
  1053. int yPrint = GetDeviceCaps(pPrintDC->GetSafeHdc(),VERTRES);//屏幕高(像素)
  1054. //dc.SetWindowOrg(-rect.left, -rect.top);//设置原点
  1055. int spaceWidth = (xPrint%(nClientWidth*1))/2;
  1056. int spacehight = (yPrint%(nClientHeight*1))/2;
  1057. pPrintDC->SetWindowOrg(-spaceWidth-500, -spacehight-300);//设置原点
  1058. if (memDC.GetSafeHdc() != NULL)
  1059. {
  1060. //memDC.BitBlt(0, 0, m_nClientWidth+30, m_nClientHeight,&pDC, -3, -30, SRCCOPY); //通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并
  1061. //dc.BitBlt(0,0,m_nClientWidth, m_nClientHeight,&memDC, 0, 0, SRCCOPY);
  1062. pPrintDC->StretchBlt(0,0,(nClientWidth+30)*((xPrint)/(nClientWidth+30)), nClientHeight*((xPrint)/(nClientWidth+30)),
  1063. &memDC, 0, 0, nClientWidth+30, nClientHeight, SRCCOPY);
  1064. //pPrintDC->MoveTo( 0,0 );
  1065. //pPrintDC->LineTo( (nClientWidth+30)*((xPrint)/(nClientWidth+30)), nClientHeight*((xPrint)/(nClientWidth+30)) );
  1066. memDC.SelectObject(oldBitmap) ;
  1067. }
  1068. else
  1069. {
  1070. memDC.SelectObject(oldBitmap) ;
  1071. }
  1072. m_nCurPage++;
  1073. if( m_nCurPage<m_nMaxPage && m_nCurPage<m_nToPage )
  1074. ShowPage( m_nCurPage );
  1075. //TCHAR *pszTitle[7]={"Time","数值1","数值2","数值3","数值4","数值5","数值6"};
  1076. //pOldFont=pDC->SelectObject(&DataFont);
  1077. //pDC->Rectangle(m_cxOffset,(int)((2.5 + PRINTMARGIN)*m_cyPrinter),m_cxOffset+m_cxWidth,(m_nLinesPerPage+3 + PRINTMARGIN)*m_cyPrinter+20);
  1078. //for(i=1;i<7;i++)
  1079. //{
  1080. // pDC->MoveTo(m_cxOffset+i*m_cxWidth/7,(int)((2.5 + PRINTMARGIN)*m_cyPrinter));
  1081. // pDC->LineTo(m_cxOffset+i*m_cxWidth/7,(3 +m_nLinesPerPage+PRINTMARGIN)*m_cyPrinter+20);
  1082. //}
  1083. //pDC->MoveTo(m_cxOffset,(4 + PRINTMARGIN)*m_cyPrinter);
  1084. //pDC->LineTo(m_cxOffset+m_cxWidth,(4 + PRINTMARGIN)*m_cyPrinter);
  1085. //for(i=0;i<7;i++)
  1086. //{
  1087. // pDC->TextOut(m_cxOffset+50+i*m_cxWidth/7,(int)((2.8 + PRINTMARGIN)*m_cyPrinter),CString(pszTitle[i]));
  1088. //}
  1089. //for(i=0;i<(int)m_nLinesPerPage-1;i++)
  1090. //{
  1091. // CString str[7];
  1092. // int nIndex = (nPageNumber-1)*(m_nLinesPerPage-1)+i;
  1093. // if(nIndex<(int)gl_uNumOfPoints)
  1094. // {
  1095. // str[0].Format("%.3f",(double)(i+1));
  1096. // str[1].Format("%.3f",1+sin((float)i));
  1097. // str[2].Format("%.3f",1+cos((float)i));
  1098. // str[3].Format("%.3f",1+sin(0.5*i));
  1099. //
  1100. // str[4].Format("%.3f",1+cos(0.5*i));
  1101. // str[5].Format("%.3f",1+sin(0.1*i));
  1102. // str[6].Format("%.3f",1+cos(0.1*i));
  1103. //
  1104. //
  1105. // for(j=0;j<7;j++)
  1106. // {
  1107. // pDC->TextOut(m_cxOffset+50+j*m_cxWidth/7,(4 + PRINTMARGIN+i)*m_cyPrinter+5,str[j]);
  1108. // }
  1109. // }
  1110. //}
  1111. //pDC->SelectObject (pOldFont);
  1112. }
  1113. //if(nPageNumber==2)
  1114. //{
  1115. // HBITMAP hBitmap=::LoadBitmap(AfxGetInstanceHandle(),(LPCTSTR)IDB_BITMAP1);
  1116. // BITMAP bitmap;
  1117. // ::GetObject(hBitmap,sizeof(BITMAP),&bitmap);
  1118. // double dScale=(double)m_cxWidth/bitmap.bmWidth;
  1119. // int nScaledWidth=m_cxWidth;
  1120. // int nScaledHeight=(int)(bitmap.bmHeight*dScale);
  1121. //
  1122. // HDC dcMem;
  1123. // dcMem=::CreateCompatibleDC(pDC->m_hDC);
  1124. // HBITMAP hOldBmp=(HBITMAP)::SelectObject(dcMem,hBitmap);
  1125. //
  1126. // int nVertCenterPos = pDC->GetDeviceCaps (VERTRES) / 2;
  1127. // ::StretchBlt(pDC->m_hDC,m_cxOffset,(4 + PRINTMARGIN)*m_cyPrinter,nScaledWidth,nScaledHeight,dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
  1128. //
  1129. //
  1130. // ::SelectObject(dcMem,hOldBmp);
  1131. // ::DeleteDC(dcMem);
  1132. // ::DeleteObject(hBitmap);
  1133. //}
  1134. //if(m_bPrintHead)
  1135. // PrintPageHeader(pPrintDC,pInfo->m_nCurPage, pInfo);
  1136. return TRUE;
  1137. }
  1138. /////////////////////////////////////////////////////////////// 打印函数 结束 /////////////////////////////////////////////////////////////
  1139. LRESULT CDlg_Report::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  1140. {
  1141. // TODO: 在此添加专用代码和/或调用基类
  1142. switch( message )
  1143. {
  1144. case WM_SAVEPIC:
  1145. {
  1146. CString sFilePath;
  1147. sFilePath = *(CString*)(WPARAM*)&wParam;
  1148. CRect rect;
  1149. m_ReportFrame.GetWindowRect( rect );
  1150. ScreenToClient( &rect );
  1151. LPCWSTR p = CA2W( sFilePath );
  1152. SaveJpg( p,rect.left,rect.top,rect.Width(),rect.Height()-6,100 );
  1153. }
  1154. }
  1155. return CDialog::WindowProc(message, wParam, lParam);
  1156. }
  1157. void CDlg_Report::OnTimer(UINT nIDEvent)
  1158. {
  1159. // TODO: 在此添加消息处理程序代码和/或调用默认值
  1160. if( nIDEvent==1 )
  1161. {
  1162. //if( m_sFileSavePath!="" )
  1163. //{
  1164. // CRect rect;
  1165. // m_ReportFrame.GetWindowRect( rect );
  1166. // ScreenToClient( &rect );
  1167. // for( int i=0;i<m_nMaxPage;i++ )
  1168. // {
  1169. // CString sFileIndex;
  1170. // sFileIndex.Format( "(第%d页)",i+1 );
  1171. // CString sFileName = m_sFileSaveName;
  1172. // sFileName.Insert( sFileName.GetLength()-4,sFileIndex );
  1173. // CString sFilePath = m_sFileSavePath;
  1174. // sFilePath.Replace( m_sFileSaveName,sFileName );
  1175. // LPCWSTR p = CA2W( sFilePath );
  1176. // SaveJpg( p,rect.left,rect.top,rect.Width(),rect.Height()-6,100 );
  1177. //
  1178. // m_nCurPage = i;
  1179. // ShowPage( m_nCurPage );
  1180. // //Sleep( 4000 );
  1181. // }
  1182. //
  1183. // m_sFileSavePath = "";
  1184. //
  1185. //}
  1186. }
  1187. CDialog::OnTimer(nIDEvent);
  1188. }
  1189. DWORD WINAPI CDlg_Report::ThreadSavePic( CDlg_Report *pDlg )
  1190. {
  1191. do
  1192. {
  1193. if( pDlg->m_sFileSavePath!="" )
  1194. {
  1195. CRect rect;
  1196. pDlg->m_ReportFrame.GetWindowRect( rect );
  1197. pDlg->ScreenToClient( &rect );
  1198. for( int i=0;i<pDlg->m_nMaxPage;i++ )
  1199. {
  1200. pDlg->m_nCurPage = i;
  1201. pDlg->ShowPage( pDlg->m_nCurPage );
  1202. Sleep( 500 );
  1203. CString sFileIndex;
  1204. sFileIndex.Format( "(第%d页)",i+1 );
  1205. CString sFileName = pDlg->m_sFileSaveName;
  1206. sFileName.Insert( sFileName.GetLength()-4,sFileIndex );
  1207. CString sFilePath = pDlg->m_sFileSavePath;
  1208. sFilePath.Replace( pDlg->m_sFileSaveName,sFileName );
  1209. LPCWSTR p = CA2W( sFilePath );
  1210. pDlg->SaveJpg( p,rect.left,rect.top,rect.Width(),rect.Height()-6,100 );
  1211. }
  1212. pDlg->m_sFileSavePath = "";
  1213. pDlg->MessageBox( "保存图片完成","提示" );
  1214. }
  1215. Sleep( 1000 );
  1216. }while( WaitForSingleObject( g_hRunObject, 1000L ) == WAIT_TIMEOUT );
  1217. return 0;
  1218. }
  1219. void CDlg_Report::Save()
  1220. {
  1221. SetListRowNoChoose();
  1222. DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
  1223. LPSTR lpszFilter = "JPG Files (*.jpg)|*.jpg|XLS Files (*.xls)|*.xls||";
  1224. char Filter[][9] = {".jpg",".xls",""};//文件类型数组
  1225. CString sFilePath,sFileName;
  1226. CFileDialog dlg(FALSE,NULL,m_sReportTitle,dwFlags,lpszFilter);
  1227. //dlg.m_pOFN->nFilterIndex = INDEX;
  1228. if(dlg.DoModal()==IDOK)
  1229. {
  1230. DWORD filter_num = dlg.m_ofn.nFilterIndex;//返回的是当前选择的文件类型是第几个
  1231. CString file_ext = Filter[filter_num-1];//获得文件类型的名称
  1232. sFilePath = dlg.GetPathName();
  1233. sFileName = dlg.GetFileName();
  1234. if( sFilePath.Right(4)!=file_ext )
  1235. {
  1236. sFilePath += file_ext;
  1237. sFileName += file_ext;
  1238. }
  1239. }
  1240. else
  1241. return;
  1242. if( -1 != sFilePath.Find( ".jpg" ) )
  1243. {
  1244. Sleep( 500 );
  1245. m_sFileSavePath = sFilePath;
  1246. m_sFileSaveName = sFileName;
  1247. }
  1248. else
  1249. SaveExcel( sFilePath );
  1250. }
  1251. void CDlg_Report::SaveExcel( CString sExcelPath )
  1252. {
  1253. //ExportListToExcel( &m_List_Report,sExcelPath );return;
  1254. _Application ExcelApp;
  1255. Workbooks wbsMyBooks;
  1256. _Workbook wbMyBook;
  1257. Worksheets wssMysheets;
  1258. _Worksheet wsMysheet;
  1259. Range rgMyRge;
  1260. //创建Excel 2000服务器(启动Excel)
  1261. if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
  1262. {
  1263. ExportListToExcel( &m_List_Report,sExcelPath );
  1264. return;
  1265. //AfxMessageBox("创建Excel服务失败!");
  1266. //exit(1);
  1267. }
  1268. ExcelApp.SetVisible(false);
  1269. //利用模板文件建立新文档
  1270. CString strModelPath;
  1271. strModelPath.Format( "%s\\%s\\report.xlt", g_strDirectory,REPORT_TEMPLATE );
  1272. wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);
  1273. wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t(strModelPath)));
  1274. //得到Worksheets
  1275. wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true);
  1276. //得到sheet1
  1277. wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("报表")),true);
  1278. //添加模板个数
  1279. //for(int i=0;i<1;i++)
  1280. //{
  1281. // wsMysheet.Copy(vtMissing,_variant_t(wsMysheet));
  1282. //}
  1283. CString strVarName = "温湿度";
  1284. CString str1;
  1285. wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("报表")),true);
  1286. str1 = "报表";
  1287. wsMysheet.SetName(str1);
  1288. //for(i=0;i<wssMysheets.GetCount()-1;i++)
  1289. //{
  1290. // wsMysheet = wsMysheet.GetNext();
  1291. // str1.Format("第%d页",i+2);
  1292. // wsMysheet.SetName(str1);
  1293. //}
  1294. //wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("第1页")),true);
  1295. //得到全部Cells,此时,rgMyRge是cells的集合
  1296. rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);
  1297. //设置1行1列的单元的值
  1298. CString str=_TEXT("21:12");
  1299. //标题
  1300. rgMyRge.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t(m_sReportTitle));
  1301. //打印日期
  1302. rgMyRge.SetItem(_variant_t((long)2),_variant_t((long)1),_variant_t(m_sPrintDate));
  1303. //编制单位
  1304. rgMyRge.SetItem(_variant_t((long)2),_variant_t((long)5),_variant_t(m_sMakeUnit+m_sMakeUnitName));
  1305. //编制单位
  1306. rgMyRge.SetItem(_variant_t((long)3),_variant_t((long)1),_variant_t(m_sChooseDate));
  1307. //编制单位
  1308. rgMyRge.SetItem(_variant_t((long)3),_variant_t((long)5),_variant_t(m_sAddress+m_sAddressName));
  1309. int nSize = m_ListItem.size();
  1310. std::list<LIST_ITEM>::iterator value_it = m_ListItem.begin();
  1311. CString sIndex;
  1312. for( int i=0;i<nSize;i++ )
  1313. {
  1314. sIndex.Format( "%d",i+1 );
  1315. rgMyRge.SetItem(_variant_t((long)(5+i)),_variant_t((long)1),_variant_t( sIndex ));
  1316. rgMyRge.SetItem(_variant_t((long)(5+i)),_variant_t((long)2),_variant_t( (*value_it).sVarDesc ));
  1317. rgMyRge.SetItem(_variant_t((long)(5+i)),_variant_t((long)3),_variant_t( (*value_it).sTime ));
  1318. rgMyRge.SetItem(_variant_t((long)(5+i)),_variant_t((long)4),_variant_t( (*value_it).sValueMin ));
  1319. rgMyRge.SetItem(_variant_t((long)(5+i)),_variant_t((long)5),_variant_t( (*value_it).sValueMax ));
  1320. rgMyRge.SetItem(_variant_t((long)(5+i)),_variant_t((long)6),_variant_t( (*value_it).sValueAverage ));
  1321. rgMyRge.SetItem(_variant_t((long)(5+i)),_variant_t((long)7),_variant_t( (*value_it).sAlarmTimes ));
  1322. rgMyRge.SetItem(_variant_t((long)(5+i)),_variant_t((long)8),_variant_t( (*value_it).sRemarks ));
  1323. value_it++;
  1324. }
  1325. //将表格保存
  1326. CString strPath;
  1327. CString strDate = "20111111";
  1328. strPath = sExcelPath;//m_strPath + "\\" + strDate + "\.xls";
  1329. wsMysheet.SaveAs(strPath,vtMissing,vtMissing,vtMissing,vtMissing,
  1330. vtMissing,vtMissing,vtMissing,vtMissing);
  1331. ExcelApp.SetVisible(false);
  1332. //wbMyBook.PrintPreview(_variant_t(false));
  1333. //释放对象
  1334. rgMyRge.ReleaseDispatch();
  1335. wsMysheet.ReleaseDispatch();
  1336. wssMysheets.ReleaseDispatch();
  1337. //wbMyBook.ReleaseDispatch();
  1338. wbsMyBooks.ReleaseDispatch();
  1339. //ExcelApp.ReleaseDispatch();
  1340. ExcelApp.Quit();
  1341. AfxMessageBox("生成成功!");
  1342. }
  1343. void CDlg_Report::ShowType( int iShowType )
  1344. {
  1345. m_nReportType = iShowType;
  1346. if( iShowType==0 )
  1347. {
  1348. m_List_Report.ShowWindow( true );
  1349. m_wndScope.ShowWindow( false );
  1350. }
  1351. else if( iShowType==1 )
  1352. {
  1353. m_List_Report.ShowWindow( false );
  1354. m_wndScope.ShowWindow( true );
  1355. m_wndScope.Invalidate();
  1356. }
  1357. else if( iShowType==2 )
  1358. {
  1359. m_List_Report.ShowWindow( false );
  1360. }
  1361. }
  1362. BOOL CDlg_Report::PreTranslateMessage(MSG* pMsg)
  1363. {
  1364. // TODO: 在此添加专用代码和/或调用基类
  1365. if( pMsg->message == WM_KEYDOWN )
  1366. {
  1367. if(pMsg->wParam==VK_RETURN||pMsg->wParam==VK_ESCAPE)
  1368. {
  1369. return TRUE;
  1370. }
  1371. }
  1372. return CDialog::PreTranslateMessage(pMsg);
  1373. }