SrcLinesDlg.cpp
上传用户:shyhzl888
上传日期:2007-01-07
资源大小:35k
文件大小:10k
源码类别:

行业应用

开发平台:

Visual C++

  1. // SrcLinesDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "SrcLines.h"
  5. #include "SrcLinesDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. class CAboutDlg : public CDialog
  14. {
  15. public:
  16. CAboutDlg();
  17. // Dialog Data
  18. //{{AFX_DATA(CAboutDlg)
  19. enum { IDD = IDD_ABOUTBOX };
  20. CHyperLink m_web;
  21. CButtonST m_btnOk;
  22. CHyperLink m_email;
  23. //}}AFX_DATA
  24. // ClassWizard generated virtual function overrides
  25. //{{AFX_VIRTUAL(CAboutDlg)
  26. protected:
  27. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  28. //}}AFX_VIRTUAL
  29. // Implementation
  30. protected:
  31. //{{AFX_MSG(CAboutDlg)
  32. virtual BOOL OnInitDialog();
  33. //}}AFX_MSG
  34. DECLARE_MESSAGE_MAP()
  35. };
  36. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  37. {
  38. //{{AFX_DATA_INIT(CAboutDlg)
  39. //}}AFX_DATA_INIT
  40. }
  41. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  42. {
  43. CDialog::DoDataExchange(pDX);
  44. //{{AFX_DATA_MAP(CAboutDlg)
  45. DDX_Control(pDX, IDC_WEB, m_web);
  46. DDX_Control(pDX, IDOK, m_btnOk);
  47. DDX_Control(pDX, IDC_EMAIL, m_email);
  48. //}}AFX_DATA_MAP
  49. }
  50. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  51. //{{AFX_MSG_MAP(CAboutDlg)
  52. //}}AFX_MSG_MAP
  53. END_MESSAGE_MAP()
  54. /////////////////////////////////////////////////////////////////////////////
  55. // CSrcLinesDlg dialog
  56. CSrcLinesDlg::CSrcLinesDlg(CWnd* pParent /*=NULL*/)
  57. : CDialog(CSrcLinesDlg::IDD, pParent)
  58. {
  59. //{{AFX_DATA_INIT(CSrcLinesDlg)
  60. m_lC = 0;
  61. m_lCpp = 0;
  62. m_lCppLines = 0;
  63. m_lHeaderLines = 0;
  64. m_lTotalLines = 0;
  65. m_stcSource = _T("");
  66. //}}AFX_DATA_INIT
  67. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  68. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  69. }
  70. CSrcLinesDlg::~CSrcLinesDlg ()
  71. {
  72. }
  73. void CSrcLinesDlg::DoDataExchange(CDataExchange* pDX)
  74. {
  75. CDialog::DoDataExchange(pDX);
  76. //{{AFX_DATA_MAP(CSrcLinesDlg)
  77. DDX_Control(pDX, IDC_BTNC, m_btnC);
  78. DDX_Control(pDX, IDC_BTNCPP, m_btnCpp);
  79. DDX_Control(pDX, IDOK, m_btnExit);
  80. DDX_Control(pDX, IDC_OPENFILE, m_btnOpen);
  81. DDX_Control(pDX, IDC_ABOUT, m_btnAbout);
  82. DDX_Text(pDX, IDC_CPPLINES, m_lCppLines);
  83. DDX_Text(pDX, IDC_HEADERLINES, m_lHeaderLines);
  84. DDX_Text(pDX, IDC_TOTALLINES, m_lTotalLines);
  85. DDX_Text(pDX, IDC_STATIC_CORCPP, m_stcSource);
  86. //}}AFX_DATA_MAP
  87. }
  88. BEGIN_MESSAGE_MAP(CSrcLinesDlg, CDialog)
  89. //{{AFX_MSG_MAP(CSrcLinesDlg)
  90. ON_WM_SYSCOMMAND()
  91. ON_WM_PAINT()
  92. ON_WM_QUERYDRAGICON()
  93. ON_BN_CLICKED(IDC_OPENFILE, OnOpenfile)
  94. ON_BN_CLICKED(IDC_BTNCPP, OnRadiocpp)
  95. ON_BN_CLICKED(IDC_BTNC, OnRadioc)
  96. ON_BN_CLICKED(IDC_ABOUT, OnAbout)
  97. //}}AFX_MSG_MAP
  98. END_MESSAGE_MAP()
  99. /////////////////////////////////////////////////////////////////////////////
  100. // CSrcLinesDlg message handlers
  101. BOOL CSrcLinesDlg::OnInitDialog()
  102. {
  103. CDialog::OnInitDialog();
  104. // Add "About..." menu item to system menu.
  105. // IDM_ABOUTBOX must be in the system command range.
  106. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  107. ASSERT(IDM_ABOUTBOX < 0xF000);
  108. CMenu* pSysMenu = GetSystemMenu(FALSE);
  109. if (pSysMenu != NULL)
  110. {
  111. CString strAboutMenu;
  112. strAboutMenu.LoadString(IDS_ABOUTBOX);
  113. if (!strAboutMenu.IsEmpty())
  114. {
  115. pSysMenu->AppendMenu(MF_SEPARATOR);
  116. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  117. }
  118. }
  119. // Set the icon for this dialog.  The framework does this automatically
  120. //  when the application's main window is not a dialog
  121. SetIcon(m_hIcon, TRUE); // Set big icon
  122. SetIcon(m_hIcon, FALSE); // Set small icon
  123. // TODO: Add extra initialization here
  124. SetupEditCtrls ();
  125. SetupFlatBtns ();
  126. SetupRadioBtns ();
  127. m_stcSource = " *.CPP文件行数";
  128. UpdateData ( false );
  129. return TRUE;  // return TRUE  unless you set the focus to a control
  130. }
  131. void CSrcLinesDlg::OnSysCommand(UINT nID, LPARAM lParam)
  132. {
  133. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  134. {
  135. CAboutDlg dlgAbout;
  136. dlgAbout.DoModal();
  137. }
  138. else
  139. {
  140. CDialog::OnSysCommand(nID, lParam);
  141. }
  142. }
  143. // If you add a minimize button to your dialog, you will need the code below
  144. //  to draw the icon.  For MFC applications using the document/view model,
  145. //  this is automatically done for you by the framework.
  146. void CSrcLinesDlg::OnPaint() 
  147. {
  148. if (IsIconic())
  149. {
  150. CPaintDC dc(this); // device context for painting
  151. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  152. // Center icon in client rectangle
  153. int cxIcon = GetSystemMetrics(SM_CXICON);
  154. int cyIcon = GetSystemMetrics(SM_CYICON);
  155. CRect rect;
  156. GetClientRect(&rect);
  157. int x = (rect.Width() - cxIcon + 1) / 2;
  158. int y = (rect.Height() - cyIcon + 1) / 2;
  159. // Draw the icon
  160. dc.DrawIcon(x, y, m_hIcon);
  161. }
  162. else
  163. {
  164. CDialog::OnPaint();
  165. }
  166. }
  167. // The system calls this to obtain the cursor to display while the user drags
  168. //  the minimized window.
  169. HCURSOR CSrcLinesDlg::OnQueryDragIcon()
  170. {
  171. return (HCURSOR) m_hIcon;
  172. }
  173. void CSrcLinesDlg::OnOpenfile() 
  174. {
  175. // Construct a file open dialog and show it for 
  176. // selecting source file
  177. CString strFilter;
  178. strFilter.LoadString ( IDS_FILEFILTER );
  179. char pBuffer[255*255] = "";
  180. //
  181. CFileDialog dlgOpen ( 
  182. true, NULL, NULL, 
  183. OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY | 
  184. OFN_ENABLESIZING | OFN_OVERWRITEPROMPT,
  185. strFilter, NULL );
  186. dlgOpen.m_ofn.lpstrTitle = "请选择源文件";
  187. // Pointer to file name buffer
  188. dlgOpen.m_ofn.lpstrFile = pBuffer;
  189. // Max number of files you can open once
  190. dlgOpen.m_ofn.nMaxFile = sizeof ( pBuffer );
  191. //
  192. if ( dlgOpen.DoModal () == IDOK )
  193. {
  194. POSITION pos;
  195. pos = dlgOpen.GetStartPosition ();
  196. CString strFile = "";
  197. unsigned long lLines = 0; // One source file lines
  198. unsigned long lTotal = 0; // Total source file lines
  199. unsigned long lCpp = 0; // Cpp source file lines
  200. unsigned long lC = 0; // C source file lines
  201. unsigned long lHeader = 0;  // Header file lines
  202. while ( pos )
  203. {
  204. CFile cFile;
  205. CFileException e;
  206. // Get file name one by one
  207. strFile= dlgOpen.GetNextPathName ( pos );
  208. // If open file successful
  209. if ( cFile.Open ( strFile, CFile::modeRead, &e ) )
  210. {
  211. unsigned long lSize = cFile.GetLength ();
  212. char *pBuf = new char[lSize];
  213. if ( !pBuf )  // Out of memory
  214. MessageBox ( 
  215. "nn  内存不足!无法读文件!  ",
  216. "无法读文件!" );
  217. else   // Alloc memory success
  218. {
  219. cFile.ReadHuge ( pBuf, lSize );
  220. lLines = GetFileLines ( pBuf,lSize );
  221. CString strExt = "";
  222. strExt = GetFileExt ( strFile );
  223. if ( "cpp" == strExt )
  224. lCpp += lLines;
  225. else if ( "c" == strExt )
  226. lC += lLines;
  227. else if ( "h"  == strExt || "hpp" == strExt )
  228. lHeader += lLines;
  229. lTotal += lLines; // Total lines
  230. if ( pBuf )   // Release memory
  231. delete []pBuf;
  232. }
  233. cFile.Close (); // Close file manually
  234. } // End of if ( cFile.Opne...)
  235. } // End of while ( pos )
  236. // Record cpp & c file lines
  237. m_lC = lC; // C file lines
  238. m_lCpp = lCpp; // Cpp file lines
  239. // Show cpp & header file lines   
  240. if ( m_btnCpp.GetButtonState () ==  BUTTON_ON )
  241. m_lCppLines = lCpp;
  242. else
  243. m_lCppLines = lC;
  244. m_lHeaderLines = lHeader;
  245. // Show total file lines
  246. m_lTotalLines = lTotal;
  247. UpdateData ( false );
  248. } // End of if ( IDOK == ... )
  249. } // End of OnFileOpen
  250. void CSrcLinesDlg::SetupEditCtrls()
  251. {
  252. UpdateData ();
  253. }
  254. unsigned long CSrcLinesDlg::GetFileLines(char* &lpBuf, unsigned long lSize)
  255. {
  256. // Counter
  257. unsigned long lLines = 0;
  258. for ( unsigned long i = 0; i < lSize; i++ )
  259. if ( 'n' == lpBuf[i] )
  260. lLines++;
  261. // Return lines of source file
  262. return lLines;
  263. }
  264. CString CSrcLinesDlg::GetFileExt(LPCTSTR lpszFile)
  265. {
  266. CString strExt = "";
  267. CString name ( lpszFile );
  268. UINT nSize = 0;
  269. nSize = name.GetLength ();
  270. name.MakeLower ();
  271. if ( 'h' == name.GetAt ( nSize - 1 ) && 
  272.  '.' == name.GetAt ( nSize - 2 ) ) // Found it is a header file
  273. strExt = "h";
  274. else if ( 'c' == name.GetAt ( nSize - 1 ) &&
  275.       '.' == name.GetAt ( nSize - 2 ) )
  276. strExt = "c"; // C file
  277. else if ( 'p' == name.GetAt ( nSize - 1 ) &&
  278.   'p' == name.GetAt ( nSize - 2 ) )
  279. {
  280. if ( 'c' == name.GetAt ( nSize - 3 ) )
  281. strExt = "cpp"; // Cpp file
  282. else if ( 'h' == name.GetAt ( nSize - 3 ) )
  283. strExt = "hpp"; // Hpp file
  284. }
  285. // Return extension of specified file
  286. return strExt;
  287. }
  288. void CSrcLinesDlg::OnRadiocpp() 
  289. {
  290. m_stcSource = " *.CPP文件行数";
  291. m_lCppLines = m_lCpp; // Load cpp file lines
  292. RefreshButtons ();
  293. UpdateData ( false );
  294. }
  295. void CSrcLinesDlg::OnRadioc() 
  296. {
  297. m_stcSource = " *.C文件行数";
  298. m_lCppLines = m_lC; // Load c file lines
  299. RefreshButtons ( 1 );
  300. UpdateData ( false );
  301. }
  302. BOOL CAboutDlg::OnInitDialog() 
  303. {
  304. CDialog::OnInitDialog();
  305. // TODO: Add extra initialization here
  306. m_email.SetURL ( "mailto:anty@990.net" );
  307. m_email.SetLinkCursor ( AfxGetApp()->LoadCursor ( IDC_HAND ) );
  308. m_web.SetURL ( "antbaby.126.com" );
  309. m_web.SetLinkCursor ( AfxGetApp()->LoadCursor ( IDC_HAND ) );
  310. //Add flat button ok
  311. m_btnOk.SubclassDlgItem ( IDI_OK, this );
  312. m_btnOk.SetIcon ( IDI_OK );
  313. m_btnOk.AddToolTip ( "返回" );
  314. return TRUE;  // return TRUE unless you set the focus to a control
  315.               // EXCEPTION: OCX Property Pages should return FALSE
  316. }
  317. void CSrcLinesDlg::OnAbout() 
  318. {
  319. CAboutDlg dlgAbout;
  320. dlgAbout.DoModal ();
  321. }
  322. void CSrcLinesDlg::SetupFlatBtns()
  323. {
  324. // Flat button open
  325. m_btnOpen.SubclassDlgItem ( IDI_OPEN, this );
  326. m_btnOpen.SetIcon ( IDI_OPEN );
  327. m_btnOpen.SetShowText ( false );
  328. m_btnOpen.AddToolTip ( "打开源文件" );
  329. // Flat button about
  330. m_btnAbout.SubclassDlgItem ( IDI_ABOUT, this );
  331. m_btnAbout.SetIcon ( IDI_ABOUT );
  332. m_btnAbout.SetShowText ( false );
  333. m_btnAbout.AddToolTip ( "关于SrcLines..." );
  334. // Flat button exit
  335. m_btnExit.SubclassDlgItem ( IDI_EXIT, this );
  336. m_btnExit.SetIcon ( IDI_EXIT );
  337. m_btnExit.SetShowText ( false );
  338. m_btnExit.AddToolTip ( "即将没有你^_^" );
  339. }
  340. void CSrcLinesDlg::SetupRadioBtns()
  341. {
  342. m_btnCpp.LoadBitmaps ( IDB_RBU, IDB_RBD, IDB_RBF, IDB_RBX );
  343. m_btnC.LoadBitmaps ( IDB_RBU, IDB_RBD, IDB_RBF, IDB_RBX );
  344. RefreshButtons ( 0 );
  345. }
  346. int CSrcLinesDlg::RefreshButtons(int nSelected)
  347. {
  348. m_btnCpp.SetButtonState( BUTTON_OFF );
  349. m_btnC.SetButtonState( BUTTON_OFF );
  350. if ( nSelected == 1 )
  351. {
  352. m_nSelected = nSelected;
  353. m_btnC.SetButtonState ( BUTTON_ON );
  354. }
  355. else if ( nSelected == 0 )
  356. {
  357. m_nSelected = nSelected;
  358. m_btnCpp.SetButtonState ( BUTTON_ON );
  359. }
  360. return m_nSelected;
  361. }