EMPDLG.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:10k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // EmpDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Emp.h"
  5. #include "EmpDlg.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. //}}AFX_DATA
  21. // ClassWizard generated virtual function overrides
  22. //{{AFX_VIRTUAL(CAboutDlg)
  23. protected:
  24. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  25. //}}AFX_VIRTUAL
  26. // Implementation
  27. protected:
  28. //{{AFX_MSG(CAboutDlg)
  29. //}}AFX_MSG
  30. DECLARE_MESSAGE_MAP()
  31. };
  32. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  33. {
  34. //{{AFX_DATA_INIT(CAboutDlg)
  35. //}}AFX_DATA_INIT
  36. }
  37. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  38. {
  39. CDialog::DoDataExchange(pDX);
  40. //{{AFX_DATA_MAP(CAboutDlg)
  41. //}}AFX_DATA_MAP
  42. }
  43. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  44. //{{AFX_MSG_MAP(CAboutDlg)
  45. // No message handlers
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CEmpDlg dialog
  50. CEmpDlg::CEmpDlg(CWnd* pParent /*=NULL*/)
  51. : CDialog(CEmpDlg::IDD, pParent)
  52. {
  53. //{{AFX_DATA_INIT(CEmpDlg)
  54. m_nEmpNum = 0;
  55. m_strFirstName = _T("");
  56. m_strHomePhone = _T("");
  57. m_strLastName = _T("");
  58. m_strTitle = _T("");
  59. //}}AFX_DATA_INIT
  60. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  61. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  62. }
  63. CEmpDlg::~CEmpDlg()
  64. {
  65. if (m_pBiz != NULL)
  66. delete m_pBiz;
  67. }
  68. void CEmpDlg::DoDataExchange(CDataExchange* pDX)
  69. {
  70. CDialog::DoDataExchange(pDX);
  71. //{{AFX_DATA_MAP(CEmpDlg)
  72. DDX_Text(pDX, IDC_EMPNUM, m_nEmpNum);
  73. DDX_Text(pDX, IDC_FIRSTNAME, m_strFirstName);
  74. DDX_Text(pDX, IDC_HOMEPHONE, m_strHomePhone);
  75. DDX_Text(pDX, IDC_LASTNAME, m_strLastName);
  76. DDX_Text(pDX, IDC_TITLE, m_strTitle);
  77. //}}AFX_DATA_MAP
  78. }
  79. BEGIN_MESSAGE_MAP(CEmpDlg, CDialog)
  80. //{{AFX_MSG_MAP(CEmpDlg)
  81. ON_WM_SYSCOMMAND()
  82. ON_WM_PAINT()
  83. ON_WM_QUERYDRAGICON()
  84. ON_BN_CLICKED(ID_EDIT_ADD, OnEditAdd)
  85. ON_BN_CLICKED(ID_EDIT_DELETE, OnEditDelete)
  86. ON_BN_CLICKED(ID_EDIT_NEXT, OnEditNext)
  87. ON_BN_CLICKED(ID_EDIT_PREVIOUS, OnEditPrevious)
  88. ON_BN_CLICKED(ID_EDIT_FIRST, OnEditFirst)
  89. ON_BN_CLICKED(ID_EDIT_LAST, OnEditLast)
  90. ON_BN_CLICKED(ID_EDIT_FINDF, OnEditFindF)
  91. ON_BN_CLICKED(ID_APP_OPEN_RECORD, OnAppOpenRecord)
  92. //}}AFX_MSG_MAP
  93. END_MESSAGE_MAP()
  94. /////////////////////////////////////////////////////////////////////////////
  95. // CEmpDlg message handlers
  96. BOOL CEmpDlg::OnInitDialog()
  97. {
  98. CDialog::OnInitDialog();
  99. // Add "About..." menu item to system menu.
  100. // IDM_ABOUTBOX must be in the system command range.
  101. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  102. ASSERT(IDM_ABOUTBOX < 0xF000);
  103. CMenu* pSysMenu = GetSystemMenu(FALSE);
  104. CString strAboutMenu;
  105. strAboutMenu.LoadString(IDS_ABOUTBOX);
  106. if (!strAboutMenu.IsEmpty())
  107. {
  108. pSysMenu->AppendMenu(MF_SEPARATOR);
  109. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  110. }
  111. // Set the icon for this dialog.  The framework does this automatically
  112. //  when the application's main window is not a dialog
  113. SetIcon(m_hIcon, TRUE); // Set big icon
  114. SetIcon(m_hIcon, FALSE); // Set small icon
  115.    
  116. //Never enable the employee ID
  117. (GetDlgItem(IDC_EMPNUM))->EnableWindow(FALSE);
  118. // TODO: Add extra initialization here
  119. m_pBiz = new CEmpBiz;
  120. return TRUE;  // return TRUE  unless you set the focus to a control
  121. }
  122. void CEmpDlg::OnSysCommand(UINT nID, LPARAM lParam)
  123. {
  124. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  125. {
  126. CAboutDlg dlgAbout;
  127. dlgAbout.DoModal();
  128. }
  129. else
  130. {
  131. CDialog::OnSysCommand(nID, lParam);
  132. }
  133. }
  134. // If you add a minimize button to your dialog, you will need the code below
  135. //  to draw the icon.  For MFC applications using the document/view model,
  136. //  this is automatically done for you by the framework.
  137. void CEmpDlg::OnPaint() 
  138. {
  139. if (IsIconic())
  140. {
  141. CPaintDC dc(this); // device context for painting
  142. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  143. // Center icon in client rectangle
  144. int cxIcon = GetSystemMetrics(SM_CXICON);
  145. int cyIcon = GetSystemMetrics(SM_CYICON);
  146. CRect rect;
  147. GetClientRect(&rect);
  148. int x = (rect.Width() - cxIcon + 1) / 2;
  149. int y = (rect.Height() - cyIcon + 1) / 2;
  150. // Draw the icon
  151. dc.DrawIcon(x, y, m_hIcon);
  152. }
  153. else
  154. {
  155. CDialog::OnPaint();
  156. }
  157. try 
  158. {
  159. m_nEmpNum =  m_pBiz->GetEmployeeId();
  160. m_strFirstName = m_pBiz->GetFirstName();
  161. m_strLastName = m_pBiz->GetLastName();
  162. m_strHomePhone = m_pBiz->GetHomePhone();
  163. m_strTitle = m_pBiz->GetTitle();
  164. }
  165. catch (HRESULT hr)
  166. {
  167. MessageBeep(0);
  168. PopupErrorMessage(hr);
  169. return ;
  170. UpdateData(FALSE); //Invoke Data Exchange (copy member data to form controls)
  171. return ;
  172. }
  173. // The system calls this to obtain the cursor to display while the user drags
  174. //  the minimized window.
  175. HCURSOR CEmpDlg::OnQueryDragIcon()
  176. {
  177. return (HCURSOR) m_hIcon;
  178. }
  179. void CEmpDlg::OnEditAdd() 
  180. {
  181. // TODO: Add your control notification handler code here
  182. try
  183. {
  184. if(!CommitAlteredEmpRec())
  185. return;
  186. m_pBiz->AddRecord();
  187. OnPaint();
  188. }
  189. catch( HRESULT hr )
  190. {
  191. MessageBeep(0);
  192. PopupErrorMessage(hr);
  193. }
  194. return ;
  195. }
  196. void CEmpDlg::OnEditDelete() 
  197. {
  198. // TODO: Add your control notification handler code here
  199. try
  200. {
  201. //Delete method depends on current mode
  202. m_pBiz->DeleteRecord();
  203. OnPaint();
  204. }
  205. catch( HRESULT hr )
  206. {
  207. MessageBeep(0);
  208. PopupErrorMessage(hr);
  209. }
  210. return ;
  211. }
  212. void CEmpDlg::OnEditNext() 
  213. {
  214. // TODO: Add your control notification handler code here
  215. if(!CommitAlteredEmpRec()) 
  216. return;
  217. try
  218. {
  219. if(m_pBiz->MoveNext())
  220. OnPaint();
  221. else
  222. MessageBeep(0);
  223. }
  224. catch( HRESULT hr )
  225. {
  226. MessageBeep(0);
  227. PopupErrorMessage(hr);
  228. }
  229. }
  230. void CEmpDlg::OnEditPrevious() 
  231. {
  232. // TODO: Add your control notification handler code here
  233. if(!CommitAlteredEmpRec())
  234. return;
  235. try
  236. {
  237. if(m_pBiz->MovePrevious())
  238. OnPaint();
  239. else
  240. MessageBeep(0);
  241. }
  242. catch( HRESULT hr )
  243. {
  244. MessageBeep(0);
  245. PopupErrorMessage(hr);
  246. }
  247. }
  248. void CEmpDlg::OnEditFirst() 
  249. {
  250. // TODO: Add your control notification handler code here
  251. if(!CommitAlteredEmpRec())
  252. return;
  253. try
  254. {
  255. if(m_pBiz->MoveFirst())
  256. OnPaint();
  257. else
  258. MessageBeep(0);
  259. }
  260. catch( HRESULT hr )
  261. {
  262. PopupErrorMessage(hr);
  263. }
  264. }
  265. void CEmpDlg::OnEditLast() 
  266. {
  267. // TODO: Add your control notification handler code here
  268. if(!CommitAlteredEmpRec())
  269. return;
  270. try
  271. {
  272. if(m_pBiz->MoveLast())
  273. OnPaint();
  274. else
  275. MessageBeep(0);
  276. }
  277. catch( HRESULT hr )
  278. {
  279. PopupErrorMessage(hr);
  280. }
  281. }
  282. void CEmpDlg::OnEditFindF() 
  283. {
  284. try
  285. {
  286. if(m_pBiz->FindForward(PrepareCriteria()))
  287. {
  288. OnPaint();
  289. }
  290. else
  291. { //not found.
  292. MessageBeep(0);
  293. //.. Should return to the last visited record.
  294. }
  295. }
  296. catch( HRESULT hr )
  297. {
  298. MessageBeep(0);
  299. PopupErrorMessage(hr);
  300. }
  301. }
  302. BOOL CEmpDlg::CommitAlteredEmpRec()
  303. {
  304. CString strOldFirstName, strOldHomePhone, strOldLastName, strOldTitle;
  305. COleVariant vFirstName, vHomePhone, vLastName, vTitle, vID;
  306. if (!m_pBiz->m_fConnected)
  307. return FALSE;
  308. //Get current record string values
  309. try
  310. {
  311. strOldFirstName = m_pBiz->GetFirstName();
  312. strOldLastName = m_pBiz->GetLastName();
  313. strOldHomePhone = m_pBiz->GetHomePhone();
  314. strOldTitle = m_pBiz->GetTitle();
  315. //Force DDX to update member values
  316. if(!UpdateData())
  317. return FALSE;
  318. // Did any fields change value?
  319. if(
  320. (m_strFirstName == strOldFirstName ) &&
  321. (m_strHomePhone == strOldHomePhone ) &&
  322. (m_strLastName == strOldLastName ) &&
  323. (m_strTitle == strOldTitle ) && !m_pBiz->IsAddMode() )
  324. return TRUE;
  325. //Save it, dump it or stay on it?
  326. switch (AfxMessageBox(IDS_PROMPT_COMMIT_EMPREC, MB_YESNOCANCEL))
  327. {
  328. case IDYES:
  329. {
  330. m_pBiz->UpdateEmpRec(m_strFirstName,
  331. m_strHomePhone,
  332. m_strLastName,
  333. m_strTitle);
  334. return TRUE;
  335. }
  336. case IDNO:
  337. case IDCANCEL:
  338. {
  339. if (m_pBiz->IsAddMode())
  340. m_pBiz->CancelPendingAdd();
  341. return TRUE;
  342. }
  343. default:
  344. {
  345. GetDlgItem(IDC_EMPNUM)->SetFocus();
  346. return TRUE;
  347. }
  348. }
  349. }
  350. catch (CMemoryException &memx)
  351. {
  352. TCHAR szBuf[256];
  353. memx.GetErrorMessage(szBuf, sizeof(szBuf), NULL);
  354. AfxMessageBox(szBuf);
  355. return FALSE;
  356. }
  357. catch(HRESULT hr)
  358. {
  359. PopupErrorMessage(hr);
  360. return FALSE;
  361. }
  362. return TRUE;
  363. }
  364.   
  365.  
  366. CString CEmpDlg::PrepareCriteria()
  367. {
  368. CString strCriteria = "";
  369. //Force DDX to update member values
  370. if(!UpdateData())
  371. return strCriteria;
  372. if(m_strFirstName != "")
  373. strCriteria = "FirstName = '" + m_strFirstName +"'";
  374. if(m_strLastName != "")
  375. strCriteria = strCriteria + ( strCriteria == "" ? "":" AND ") + "LastName = '" + m_strLastName +"'";
  376. if(m_strHomePhone != "")
  377. strCriteria = strCriteria + ( strCriteria == "" ? "":" AND ") + "HomePhone = '" + m_strHomePhone +"'";
  378. if(m_strTitle != "")
  379. strCriteria = strCriteria + ( strCriteria == "" ? "":" AND ") + "Title = '" + m_strTitle +"'";
  380. return strCriteria;
  381. }
  382. void CEmpDlg::OnAppOpenRecord() 
  383. {
  384. // TODO: Add your control notification handler code here
  385. //Connect to the EMPLOYEE database
  386. if(!m_pBiz->ConnectToDatabase())
  387. {
  388. m_pBiz->m_fConnected = FALSE;
  389. return;
  390. }
  391. m_pBiz->m_fConnected = TRUE;
  392. GetDlgItem(ID_EDIT_PREVIOUS)->EnableWindow(TRUE);
  393. GetDlgItem(ID_EDIT_NEXT)->EnableWindow(TRUE);
  394. GetDlgItem(ID_EDIT_DELETE)->EnableWindow(TRUE);
  395. GetDlgItem(ID_EDIT_ADD)->EnableWindow(TRUE);
  396. GetDlgItem(ID_EDIT_LAST)->EnableWindow(TRUE);
  397. GetDlgItem(ID_EDIT_FIRST)->EnableWindow(TRUE);
  398. GetDlgItem(ID_EDIT_FINDF)->EnableWindow(TRUE);
  399. OnPaint();
  400. }