Chinaunix首页 | 论坛 | 博客
  • 博客访问: 943598
  • 博文数量: 104
  • 博客积分: 10055
  • 博客等级: 上将
  • 技术积分: 4410
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-11 09:10
文章分类

全部博文(104)

文章存档

2012年(1)

2011年(2)

2010年(8)

2009年(38)

2008年(55)

我的朋友

分类: C/C++

2009-07-08 14:23:22

  1. // StudentAccessDlg.cpp : implementation file    
  2. //    
  3.    
  4. #include "stdafx.h"    
  5. #include "StudentAccess.h"    
  6. #include "StudentAccessDlg.h"    
  7.    
  8. #ifdef _DEBUG    
  9. #define new DEBUG_NEW    
  10. #undef THIS_FILE    
  11. static char THIS_FILE[] = __FILE__;   
  12. #endif    
  13.    
  14. extern CStudentAccessApp theApp;       // 在此引用应用类中的theApp来获取库连接指针    
  15. /////////////////////////////////////////////////////////////////////////////    
  16. // CAboutDlg dialog used for App About    
  17.    
  18. class CAboutDlg : public CDialog   
  19. {   
  20. public:   
  21.     CAboutDlg();   
  22.    
  23. // Dialog Data    
  24.     //{{AFX_DATA(CAboutDlg)    
  25.     enum { IDD = IDD_ABOUTBOX };   
  26.     //}}AFX_DATA    
  27.    
  28.     // ClassWizard generated virtual function overrides    
  29.     //{{AFX_VIRTUAL(CAboutDlg)    
  30.     protected:   
  31.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support    
  32.     //}}AFX_VIRTUAL    
  33.    
  34. // Implementation    
  35. protected:   
  36.     //{{AFX_MSG(CAboutDlg)    
  37.     //}}AFX_MSG    
  38.     DECLARE_MESSAGE_MAP()   
  39. };   
  40.    
  41. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)   
  42. {   
  43.     //{{AFX_DATA_INIT(CAboutDlg)    
  44.     //}}AFX_DATA_INIT    
  45. }   
  46.    
  47. void CAboutDlg::DoDataExchange(CDataExchange* pDX)   
  48. {   
  49.     CDialog::DoDataExchange(pDX);   
  50.     //{{AFX_DATA_MAP(CAboutDlg)    
  51.     //}}AFX_DATA_MAP    
  52. }   
  53.    
  54. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)   
  55.     //{{AFX_MSG_MAP(CAboutDlg)    
  56.         // No message handlers    
  57.     //}}AFX_MSG_MAP    
  58. END_MESSAGE_MAP()   
  59.    
  60. /////////////////////////////////////////////////////////////////////////////    
  61. // CStudentAccessDlg dialog    
  62.    
  63. CStudentAccessDlg::CStudentAccessDlg(CWnd* pParent /*=NULL*/)   
  64.     : CDialog(CStudentAccessDlg::IDD, pParent)   
  65. {   
  66.     //初始化变量    
  67.     m_hPhotoBitmap = NULL;   
  68.     m_pBMPBuffer = NULL;   
  69.    
  70.     //{{AFX_DATA_INIT(CStudentAccessDlg)    
  71.     m_nAge = 0;   
  72.     m_strName = _T("");   
  73.     m_strMajor = _T("");   
  74.     m_strHome = _T("");   
  75.     m_strCollege = _T("");   
  76.     m_nLock = -1;   
  77.     m_nSecret = -1;   
  78.     m_strFileMsg = _T("");   
  79.     //}}AFX_DATA_INIT    
  80.     // Note that LoadIcon does not require a subsequent DestroyIcon in Win32    
  81.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);   
  82. }   
  83.    
  84. void CStudentAccessDlg::DoDataExchange(CDataExchange* pDX)   
  85. {   
  86.     CDialog::DoDataExchange(pDX);   
  87.     //{{AFX_DATA_MAP(CStudentAccessDlg)    
  88.     DDX_Control(pDX, IDC_SECRET, m_comboSecret);   
  89.     DDX_Control(pDX, IDC_LOCK2, m_comboLock);   
  90.     DDX_Control(pDX, IDC_DATETIMEPICKER_DATE, m_dataTimedoc);   
  91.     DDX_Control(pDX, IDC_BUTTON_PARAMETER, m_btnParameter);   
  92.     DDX_Control(pDX, IDC_BUTTONREAD, m_btnRead);   
  93.     DDX_Control(pDX, IDC_BUTTONDELETE, m_btnDelete);   
  94.     DDX_Control(pDX, IDC_BUTTONEDIT, m_btnEdit);   
  95.     DDX_Control(pDX, IDC_BUTTONADD, m_btnAdd);   
  96.     DDX_Control(pDX, IDC_SEX, m_ComboBoxSex);   
  97.     DDX_Control(pDX, IDC_LISTACCESS, m_listAccess);   
  98.     DDX_Text(pDX, IDC_AGE, m_nAge);   
  99.     DDX_Text(pDX, IDC_NAME, m_strName);   
  100.     DDX_Text(pDX, IDC_MAJOR, m_strMajor);   
  101.     DDX_Text(pDX, IDC_HOME, m_strHome);   
  102.     DDX_Text(pDX, IDC_COLLEGE, m_strCollege);   
  103.     DDX_CBIndex(pDX, IDC_LOCK2, m_nLock);   
  104.     DDX_CBIndex(pDX, IDC_SECRET, m_nSecret);   
  105.     DDX_Text(pDX, IDC_FILENAME, m_strFileMsg);   
  106.     //}}AFX_DATA_MAP    
  107. }   
  108.    
  109. BEGIN_MESSAGE_MAP(CStudentAccessDlg, CDialog)   
  110.     //{{AFX_MSG_MAP(CStudentAccessDlg)    
  111.     ON_WM_SYSCOMMAND()   
  112.     ON_WM_PAINT()   
  113.     ON_WM_QUERYDRAGICON()   
  114.     ON_BN_CLICKED(IDC_BUTTONREAD, OnReadAccess)   
  115.     ON_LBN_SELCHANGE(IDC_LISTACCESS, OnSelchangeListaccess)   
  116.     ON_BN_CLICKED(IDC_BUTTONDELETE, OnDelete)   
  117.     ON_BN_CLICKED(IDC_BUTTONEDIT, OnEdit)   
  118.     ON_BN_CLICKED(IDC_BUTTONADD, OnAdd)   
  119.     ON_BN_CLICKED(IDC_BUTTONFILE, OnSelectFile)   
  120.     ON_BN_CLICKED(IDC_BUTTON_PARAMETER, OnEditParameter)   
  121.     ON_WM_CTLCOLOR()   
  122.     ON_BN_CLICKED(IDC_BUTTONHELP, OnHelp)   
  123.     //}}AFX_MSG_MAP    
  124. END_MESSAGE_MAP()   
  125.    
  126. /////////////////////////////////////////////////////////////////////////////    
  127. // CStudentAccessDlg message handlers    
  128.    
  129. BOOL CStudentAccessDlg::OnInitDialog()   
  130. {   
  131.     CDialog::OnInitDialog();   
  132.    
  133.     // Add "About..." menu item to system menu.    
  134.    
  135.     // IDM_ABOUTBOX must be in the system command range.    
  136.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);   
  137.     ASSERT(IDM_ABOUTBOX < 0xF000);   
  138.    
  139.     CMenu* pSysMenu = GetSystemMenu(FALSE);   
  140.     if (pSysMenu != NULL)   
  141.     {   
  142.         CString strAboutMenu;   
  143.         strAboutMenu.LoadString(IDS_ABOUTBOX);   
  144.         if (!strAboutMenu.IsEmpty())   
  145.         {   
  146.             pSysMenu->AppendMenu(MF_SEPARATOR);   
  147.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);   
  148.         }   
  149.     }   
  150.    
  151.     // Set the icon for this dialog.  The framework does this automatically    
  152.     //  when the application's main window is not a dialog    
  153.     SetIcon(m_hIcon, TRUE);         // Set big icon    
  154.     SetIcon(m_hIcon, FALSE);        // Set small icon    
  155.        
  156.     // TODO: Add extra initialization here    
  157.        
  158.     // ---------------------------------------------------------------------------------------------------    
  159.     // 初始化COM,创建ADO连接等操作    
  160.     if(!AfxOleInit())   
  161.     {   
  162.         AfxMessageBox("OLE初始化出错!");   
  163.         return FALSE;   
  164.     }   
  165.    
  166.     m_pConnection.CreateInstance(__uuidof(Connection));   
  167.     // 使用ADO创建数据库记录集    
  168.     m_pRecordset.CreateInstance(__uuidof(Recordset));   
  169.     m_pRecordsetPara.CreateInstance(__uuidof(Recordset));   
  170.    
  171.     GetSystemTime(&m_CurTime);  //获得当前时间    
  172.    
  173.     return TRUE;  // return TRUE  unless you set the focus to a control    
  174. }   
  175.    
  176. void CStudentAccessDlg::OnSysCommand(UINT nID, LPARAM lParam)   
  177. {   
  178.     if ((nID & 0xFFF0) == IDM_ABOUTBOX)   
  179.     {   
  180.         CAboutDlg dlgAbout;   
  181.         dlgAbout.DoModal();   
  182.     }   
  183.     else   
  184.     {   
  185.         CDialog::OnSysCommand(nID, lParam);   
  186.     }   
  187. }   
  188.    
  189. // If you add a minimize button to your dialog, you will need the code below    
  190. //  to draw the icon.  For MFC applications using the document/view model,    
  191. //  this is automatically done for you by the framework.    
  192.    
  193. void CStudentAccessDlg::OnPaint()    
  194. {   
  195.     CPaintDC dc(this); // device context for painting    
  196.     if (IsIconic())   
  197.     {   
  198.         SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);   
  199.    
  200.         // Center icon in client rectangle    
  201.         int cxIcon = GetSystemMetrics(SM_CXICON);   
  202.         int cyIcon = GetSystemMetrics(SM_CYICON);   
  203.         CRect rect;   
  204.         GetClientRect(&rect);   
  205.         int x = (rect.Width() - cxIcon + 1) / 2;   
  206.         int y = (rect.Height() - cyIcon + 1) / 2;   
  207.    
  208.         // Draw the icon    
  209.         dc.DrawIcon(x, y, m_hIcon);   
  210.     }   
  211.     else   
  212.     {   
  213.         //在屏幕上显示图像    
  214.         DrawUserPhoto(170,300,&dc);   
  215.         CDialog::OnPaint();   
  216.     }   
  217. }   
  218.    
  219. // The system calls this to obtain the cursor to display while the user drags    
  220. //  the minimized window.    
  221. HCURSOR CStudentAccessDlg::OnQueryDragIcon()   
  222. {   
  223.     return (HCURSOR) m_hIcon;   
  224. }   
  225.    
  226. //////////////////////////////////////////////////////////////////////////////    
  227. //名称:OnReadAccess    
  228. //功能:用ADO从Access文件中读取相应数据并显示出来    
  229. /////////////////////////////////////////////////////////////////////////////    
  230. void CStudentAccessDlg::OnReadAccess()    
  231. {   
  232.     _variant_t var;   
  233.     CString strName;   
  234.    
  235.     // 清空列表框    
  236.     m_listAccess.ResetContent();   
  237.     strName="";   
  238.    
  239.     try   
  240.     {   
  241.         if(!m_pRecordset->BOF)   
  242.             m_pRecordset->MoveFirst();   
  243.         else   
  244.         {   
  245.             AfxMessageBox("表内数据为空");   
  246.             return;   
  247.         }   
  248.    
  249.         // 读入库中各字段并加入列表框中    
  250.         while(!m_pRecordset->adoEOF)   
  251.         {   
  252.             var = m_pRecordset->GetCollect("Name");   
  253.             if(var.vt != VT_NULL)   
  254.                 strName = (LPCSTR)_bstr_t(var);   
  255.                
  256.             m_listAccess.AddString( strName );   
  257.    
  258.             m_pRecordset->MoveNext();   
  259.         }   
  260.    
  261.         // 默认列表指向第一项,同时移动记录指针并显示    
  262.         m_listAccess.SetCurSel(0);   
  263.         OnSelchangeListaccess();   
  264.     }   
  265.     catch(_com_error *e)   
  266.     {   
  267.         AfxMessageBox(e->ErrorMessage());   
  268.     }   
  269.    
  270.     //界面修饰    
  271.     this->m_btnAdd.EnableWindow(TRUE);   
  272.     this->m_btnEdit.EnableWindow(TRUE);   
  273.     this->m_btnDelete.EnableWindow(TRUE);   
  274. }   
  275.    
  276. //////////////////////////////////////////////////////////////////////////////    
  277. //名称:OnSelchangeListaccess    
  278. //功能:当每次选择新的记录时,都会移动指针到新的记录位置并将值显示出来    
  279. /////////////////////////////////////////////////////////////////////////////    
  280. void CStudentAccessDlg::OnSelchangeListaccess()    
  281. {   
  282.     int curSel = m_listAccess.GetCurSel();         
  283.     _variant_t var,varIndex;   
  284.    
  285.     if(curSel < 0)   
  286.         return;   
  287.    
  288.     try   
  289.     {   
  290.         DestroyPhoto(); ///清除原图像    
  291.    
  292.         // 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针    
  293.         m_pRecordset->MoveFirst();   
  294.         m_pRecordset->Move(long(curSel));   
  295.            
  296.         var = m_pRecordset->GetCollect("Name");   
  297.         if(var.vt != VT_NULL)   
  298.             //m_strName = (LPCSTR)_bstr_t(var); 或    
  299.             m_strName = var.bstrVal;   
  300.         else   
  301.             m_strName = "";    
  302.    
  303.         var = m_pRecordset->GetCollect("Sex");   
  304.         if(var.vt != VT_NULL)   
  305.         {   
  306.             m_nSex = var.iVal;   
  307.             if( m_nSex == 2 )   
  308.                 m_nSex = -1;    //-1代表未选择    
  309.         }   
  310.         this->m_ComboBoxSex.SetCurSel(m_nSex);       //下拉列表定位    
  311.            
  312. #ifdef _DEBUG    
  313.         CString temp;   
  314.         temp.Format("m_nSex值为:%d",m_nSex);   
  315.         TRACE(temp);   
  316. #endif    
  317.            
  318.         var = m_pRecordset->GetCollect("Age");   
  319.         if(var.vt != VT_NULL)   
  320.             m_nAge = var.iVal;   
  321.         else   
  322.             m_nAge = 0;   
  323.    
  324.         var = m_pRecordset->GetCollect("Home");   
  325.         if(var.vt != VT_NULL)   
  326.             m_strHome = (LPCSTR)_bstr_t(var);    
  327.         else   
  328.             m_strHome = "";    
  329.    
  330.         var = m_pRecordset->GetCollect("College");   
  331.         if(var.vt != VT_NULL)   
  332.             m_strCollege = (LPCSTR)_bstr_t(var);   
  333.         else   
  334.             m_strCollege = "";   
  335.            
  336.         var = m_pRecordset->GetCollect("Major");   
  337.         if(var.vt != VT_NULL)   
  338.             m_strMajor = (LPCSTR)_bstr_t(var);    
  339.         else   
  340.             m_strMajor = "";   
  341.    
  342.         //取出图像数据,复制到内存,并生产BITMAP对象,以便显示    
  343.         long lDataSize = m_pRecordset->GetFields()->GetItem("photo")->ActualSize;   
  344.         if(lDataSize > 0)   
  345.         {   
  346.             _variant_t          varBLOB;   
  347.             varBLOB = m_pRecordset->GetFields()->GetItem("photo")->GetChunk(lDataSize);   
  348.             if(varBLOB.vt == (VT_ARRAY | VT_UI1))   
  349.             {   
  350.                 if(m_pBMPBuffer = new char[lDataSize+1])                ///重新分配必要的存储空间    
  351.                 {      
  352.                     char *pBuf = NULL;   
  353.                     SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);   
  354.                     memcpy(m_pBMPBuffer,pBuf,lDataSize);                ///复制数据到缓冲区m_pBMPBuffer    
  355.                     SafeArrayUnaccessData (varBLOB.parray);   
  356.                     m_nFileLen = lDataSize;   
  357.                     m_hPhotoBitmap = BufferToHBITMAP();                 ///生成BITMAP对象    
  358.                 }   
  359.             }   
  360.         }   
  361.    
  362.         UpdateData(false);    //更新变量到控件显示值    
  363.    
  364.         Invalidate();   //更新视图区,调用OnPaint();    
  365.     }   
  366.     catch(_com_error *e)   
  367.     {   
  368.         AfxMessageBox(e->ErrorMessage());   
  369.     }      
  370. }   
  371.    
  372.    
  373. /////////////加载BMP文件到内存//////////////    
  374. BOOL CStudentAccessDlg::LoadBMPFile(const char *pBMPPathname)   
  375. {   
  376.     CFile file;   
  377.     if( !file.Open( pBMPPathname, CFile::modeRead) )   
  378.         return FALSE;   
  379.     m_nFileLen = file.GetLength();   
  380.     m_pBMPBuffer = new char[m_nFileLen + 1];   
  381.     if(!m_pBMPBuffer)   
  382.         return FALSE;   
  383.     if(file.ReadHuge(m_pBMPBuffer,m_nFileLen) != m_nFileLen)   
  384.         return FALSE;   
  385.     return TRUE;   
  386. }   
  387.    
  388. ///////////将内存中的BMP文件内容转换到HBITMAP///////    
  389. HBITMAP CStudentAccessDlg::BufferToHBITMAP()   
  390. {   
  391.     HBITMAP             hBmp;   
  392.     LPSTR               hDIB,lpBuffer = m_pBMPBuffer;   
  393.     LPVOID              lpDIBBits;   
  394.     BITMAPFILEHEADER    bmfHeader;   
  395.     DWORD               bmfHeaderLen;   
  396.    
  397.     bmfHeaderLen = sizeof(bmfHeader);   
  398.     strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);   
  399. //  if (bmfHeader.bfType != ((WORD) ('M' << 8) | 'B')) return NULL;    
  400.     if (bmfHeader.bfType != (*(WORD*)"BM")) return NULL;//我copy《Windows程序设计》上的做法。    
  401.     hDIB = lpBuffer + bmfHeaderLen;   
  402.     BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;   
  403.     BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;   
  404. /*  int nColors = bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount;   
  405.     if( bmInfo.bmiHeader.biBitCount > 8 )  
  406.         lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) +   
  407.             ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));  
  408.     else  
  409.         lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);  
  410. *///原来的代码。   
  411.     lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;//这行功能和上面被注释掉的代码相同,容易理解。    
  412.     CClientDC dc(this);   
  413.     hBmp = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);   
  414.     return hBmp;   
  415. }   
  416.    
  417. /////////////////在屏幕上显示图像///////////////////    
  418. void CStudentAccessDlg::DrawUserPhoto(int x, int y, CDC *pDC)   
  419. {   
  420.     if(!m_hPhotoBitmap) return;   
  421.     HBITMAP OldBitmap;   
  422.     CDC MemDC;   
  423.     MemDC.CreateCompatibleDC(pDC);   
  424.     OldBitmap=(HBITMAP)MemDC.SelectObject(m_hPhotoBitmap);   
  425.     pDC->BitBlt(x,y,100,130,&MemDC,0,0,SRCCOPY);   
  426.     MemDC.SelectObject(OldBitmap);   
  427. }   
  428.    
  429. /////////////清除分配的对象/////////////    
  430. void CStudentAccessDlg::DestroyPhoto()   
  431. {   
  432.     if(m_hPhotoBitmap)   
  433.     {   
  434.         DeleteObject(m_hPhotoBitmap);   
  435.         m_hPhotoBitmap = NULL;   
  436.     }   
  437.     if(m_pBMPBuffer)   
  438.     {   
  439.         delete m_pBMPBuffer;   
  440.         m_pBMPBuffer = NULL;   
  441.     }   
  442. }   
  443.    
  444. //////////////////////////////////////////////////////////////////////////////    
  445. //名称:OnDelete    
  446. //功能:删除并更新当前记录    
  447. /////////////////////////////////////////////////////////////////////////////    
  448. void CStudentAccessDlg::OnDelete()    
  449. {   
  450.     if(m_listAccess.GetCount() == 0)   
  451.         return;   
  452.     else if(m_listAccess.GetCurSel() < 0 || m_listAccess.GetCurSel() > m_listAccess.GetCount())   
  453.         m_listAccess.SetCurSel(0);   
  454.    
  455.     try   
  456.     {   
  457.         // 删除当前行记录    
  458.         m_pRecordset->Delete(adAffectCurrent);   
  459.         m_pRecordset->Update();   
  460.    
  461.         // 删除列表中当前值    
  462.         int nCurSel = m_listAccess.GetCurSel();   
  463.         m_listAccess.DeleteString(nCurSel);   
  464.         if(nCurSel == 0 && (m_listAccess.GetCount() != 0))   
  465.             m_listAccess.SetCurSel(nCurSel);   
  466.         else if(m_listAccess.GetCount() != 0)   
  467.             m_listAccess.SetCurSel(nCurSel-1);   
  468.            
  469.         // 移动记录指针到新的位置    
  470.         OnSelchangeListaccess();   
  471.     }   
  472.     catch(_com_error *e)   
  473.     {   
  474.         AfxMessageBox(e->ErrorMessage());   
  475.     }      
  476. }   
  477.    
  478. void CStudentAccessDlg::OnEdit()    
  479. {   
  480.     CEditAdd dlgEditAdd;   
  481.     dlgEditAdd.m_bKind = 2;   
  482.    
  483.     dlgEditAdd.m_strName = this->m_strName;   
  484.     dlgEditAdd.m_nSex = this->m_nSex;        //传递下拉表变量    
  485.     dlgEditAdd.m_nAge = this->m_nAge;   
  486.     dlgEditAdd.m_strHome = this->m_strHome;   
  487.     dlgEditAdd.m_strCollege = this->m_strCollege;   
  488.     dlgEditAdd.m_strMajor = this->m_strMajor;   
  489.     dlgEditAdd.m_hPhotoBitmap = this->m_hPhotoBitmap;        //传递HBITMAP变量    
  490.    
  491.     if(dlgEditAdd.DoModal() == IDOK)   
  492.     {   
  493.         //dlgEditAdd.UpdateData(TRUE);  本应该更新控件输入到其变量,但对话框的DoModal()将完成此工作    
  494.         if( dlgEditAdd.m_strName == "" || dlgEditAdd.m_nAge == 0)   
  495.         {   
  496.             AfxMessageBox("姓名、年龄信息不能为空!");   
  497.             return;   
  498.         }   
  499.    
  500.         // 修改当前记录的字段值    
  501.         try   
  502.         {   
  503.             _variant_t var;    
  504.                
  505.             m_pRecordset->PutCollect( "Name", _variant_t(dlgEditAdd.m_strName) );   
  506.                
  507.             if( dlgEditAdd.m_nSex != -1)   
  508.             {   
  509.                 var.iVal = dlgEditAdd.m_nSex;            //注意int的插入方式    
  510.                 m_pRecordset->PutCollect( "Sex", var.iVal );   
  511.             }   
  512.                
  513.             var.iVal = dlgEditAdd.m_nAge;   
  514.             m_pRecordset->PutCollect( "Age", var.iVal );   
  515.                
  516.             //这里为空为什么会出错?    
  517.             if( dlgEditAdd.m_strHome == "")   
  518.                 dlgEditAdd.m_strHome = " ";   
  519.             m_pRecordset->PutCollect( "Home", _variant_t(dlgEditAdd.m_strHome) );   
  520.                
  521.             if( dlgEditAdd.m_strCollege == "")   
  522.                 dlgEditAdd.m_strCollege = " ";   
  523.             m_pRecordset->PutCollect( "College", _variant_t(dlgEditAdd.m_strCollege) );   
  524.                
  525.             if( dlgEditAdd.m_strMajor == "")   
  526.                 dlgEditAdd.m_strMajor = " ";   
  527.             m_pRecordset->PutCollect( "Major", _variant_t(dlgEditAdd.m_strMajor) );   
  528.                
  529.             //插入bmp数据    
  530.             char            *pBuf = dlgEditAdd.m_pBMPBuffer;   
  531.             VARIANT         varBLOB;   
  532.             SAFEARRAY       *psa;   
  533.             SAFEARRAYBOUND  rgsabound[1];   
  534.             if(pBuf)   
  535.             {       
  536.                 rgsabound[0].lLbound = 0;   
  537.                 rgsabound[0].cElements = dlgEditAdd.m_nFileLen;   
  538.                 psa = SafeArrayCreate(VT_UI1, 1, rgsabound);   
  539.                 for (long i = 0; i < (long)dlgEditAdd.m_nFileLen; i++)   
  540.                     SafeArrayPutElement (psa, &i, pBuf++);   
  541.                 varBLOB.vt = VT_ARRAY | VT_UI1;   
  542.                 varBLOB.parray = psa;   
  543.                 m_pRecordset->GetFields()->GetItem("Photo")->AppendChunk(varBLOB);   
  544.             }   
  545.    
  546.             m_pRecordset->Update();   
  547.                
  548.             AfxMessageBox("成功更新用户信息!");   
  549.    
  550.             // 重新读入库记录更新显示    
  551.             int nCurSel = m_listAccess.GetCurSel();   
  552.             OnReadAccess();   
  553.             m_listAccess.SetCurSel(nCurSel);   
  554.             // 移动记录指针到新的位置    
  555.             OnSelchangeListaccess();   
  556.         }   
  557.         catch(_com_error *e)   
  558.         {   
  559.             AfxMessageBox(e->ErrorMessage());   
  560.         }   
  561.     }   
  562.    
  563. }   
  564.    
  565. //////////////////////////////////////////////////////////////////////////////    
  566. //OnAdd    
  567. //功能:用ADO来写入插入的字段值    
  568. /////////////////////////////////////////////////////////////////////////////    
  569. void CStudentAccessDlg::OnAdd()    
  570. {   
  571.     CEditAdd dlgEditAdd;   
  572.     dlgEditAdd.m_bKind = 1;   
  573.    
  574.     if(dlgEditAdd.DoModal() == IDOK)   
  575.     {   
  576.         //dlgEditAdd.UpdateData(TRUE);  本应该更新控件输入到其变量,但对话框的DoModal()将完成此工作    
  577.         if( dlgEditAdd.m_strName == "" || dlgEditAdd.m_nAge == 0)   
  578.         {   
  579.             AfxMessageBox("姓名、年龄信息不能为空!");   
  580.             return;   
  581.         }   
  582. /*      if(dlgEditAdd.m_pBMPBuffer == NULL || dlgEditAdd.m_hPhotoBitmap == NULL || dlgEditAdd.m_strName == "" || dlgEditAdd.m_nAge == 0)  
  583.         {  
  584.             AfxMessageBox("姓名、年龄、照片信息不能为空!");  
  585.             return;  
  586.         }  
  587. */   
  588.         try   
  589.         {   
  590.             _variant_t var;    
  591.    
  592.             // 写入各字段值    
  593.             m_pRecordset->AddNew();   
  594.    
  595.             m_pRecordset->PutCollect( "Name", _variant_t(dlgEditAdd.m_strName) );   
  596.                
  597.             if( dlgEditAdd.m_nSex != 2)   
  598.                 var.iVal = dlgEditAdd.m_nSex;            //注意int的插入方式    
  599.             else   
  600.                 var.iVal = 2;   
  601.             m_pRecordset->PutCollect( "Sex", var.iVal );   
  602.    
  603.             var.iVal = dlgEditAdd.m_nAge;   
  604.             m_pRecordset->PutCollect( "Age", var.iVal );   
  605.    
  606.             if( dlgEditAdd.m_strHome != "")   
  607.                 m_pRecordset->PutCollect( "Home", _variant_t(dlgEditAdd.m_strHome) );   
  608.    
  609.             if( dlgEditAdd.m_strCollege != "")   
  610.                 m_pRecordset->PutCollect( "College", _variant_t(dlgEditAdd.m_strCollege) );   
  611.    
  612.             if( dlgEditAdd.m_strMajor != "")   
  613.                 m_pRecordset->PutCollect( "Major", _variant_t(dlgEditAdd.m_strMajor) );   
  614.                
  615.             //插入bmp数据    
  616.             char            *pBuf = dlgEditAdd.m_pBMPBuffer;   
  617.             VARIANT         varBLOB;   
  618.             SAFEARRAY       *psa;   
  619.             SAFEARRAYBOUND  rgsabound[1];   
  620.             if(pBuf)   
  621.             {       
  622.                 rgsabound[0].lLbound = 0;   
  623.                 rgsabound[0].cElements = dlgEditAdd.m_nFileLen;   
  624.                 psa = SafeArrayCreate(VT_UI1, 1, rgsabound);   
  625.                 for (long i = 0; i < (long)dlgEditAdd.m_nFileLen; i++)   
  626.                     SafeArrayPutElement (psa, &i, pBuf++);   
  627.                 varBLOB.vt = VT_ARRAY | VT_UI1;   
  628.                 varBLOB.parray = psa;   
  629.                 m_pRecordset->GetFields()->GetItem("Photo")->AppendChunk(varBLOB);   
  630.             }   
  631.    
  632.             m_pRecordset->Update();   
  633.                
  634.             AfxMessageBox("插入成功!");   
  635.                
  636.             // 更新显示其库内容    
  637.             int nCurSel = m_listAccess.GetCurSel();   
  638.             OnReadAccess();   
  639.             m_listAccess.SetCurSel(nCurSel);   
  640.             // 移动记录指针到新的位置    
  641.             OnSelchangeListaccess();   
  642.         }   
  643.         catch(_com_error *e)   
  644.         {   
  645.             AfxMessageBox(e->ErrorMessage());   
  646.         }   
  647.     }   
  648. }   
  649.    
  650. //////////////////////////////////////////////////////////////////////////////    
  651. //名称:DestroyWindow    
  652. //功能:关闭对话框时清除工作    
  653. /////////////////////////////////////////////////////////////////////////////    
  654. BOOL CStudentAccessDlg::DestroyWindow()   
  655. {   
  656.     // 关闭记录集    
  657.     if(m_pConnection->State)   
  658.         m_pRecordset->Close();   
  659.     m_pRecordset = NULL;   
  660.     if(m_pConnection->State)   
  661.         m_pRecordsetPara->Close();   
  662.     m_pRecordsetPara = NULL;   
  663.    
  664.     // 关闭ADO连接状态    
  665.     if(m_pConnection->State)   
  666.         m_pConnection->Close();   
  667.     m_pConnection= NULL;   
  668.    
  669.     DestroyPhoto();   
  670.    
  671.     return CDialog::DestroyWindow();   
  672. }   
  673.    
  674. //////////////////////////////////////////////////////////////////////////////    
  675. //名称:OnSelectFile    
  676. //功能:选择数据库文件,并进行连接,执行select到记录集    
  677. /////////////////////////////////////////////////////////////////////////////    
  678. void CStudentAccessDlg::OnSelectFile()    
  679. {   
  680.     ///////////选择数据库文件/////////////    
  681.     CString strFileName;   
  682.     static char BASED_CODE szFilter[] = "Access Files (*.mdb)|*.mdb||";   
  683.     CFileDialog dlg(TRUE,"mdb",NULL,  OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);   
  684.     if(dlg.DoModal() == IDOK)   
  685.     {   
  686.         strFileName = dlg.GetFileName();   
  687.     }   
  688.        
  689.     //链接成功    
  690.     ifthis->OpenConnection(strFileName) )   
  691.     {   
  692.         this->m_strFileMsg = "成功连接" + strFileName;   
  693.            
  694.         this->m_btnRead.EnableWindow(TRUE);   
  695.         this->m_btnParameter.EnableWindow(TRUE);   
  696.                
  697.         SelectRecordset( m_pRecordsetPara, "Parameter" );   //选择Parameter表数据到记录集    
  698.    
  699.         ReadParameter();    // 读取文件参数表parameter并显示在控件中    
  700.    
  701.         SelectRecordset( m_pRecordset, "Student" );     //选择Student表数据到记录集    
  702.     }   
  703.     else   
  704.     {   
  705.         this->m_strFileMsg = "无法连接" + strFileName;   
  706.     }   
  707.     UpdateData(FALSE);      //更新控件值    
  708. }   
  709.    
  710. bool CStudentAccessDlg::OpenConnection(CString strFileName)   
  711. {   
  712.     try                    
  713.     {   
  714.         // 关闭记录集,重新连接    
  715.         if( m_pRecordsetPara->State )   
  716.             m_pRecordsetPara->Close();   
  717.         if( m_pRecordset->State )   
  718.             m_pRecordset->Close();   
  719.     //  m_pRecordset = NULL;    //不可清空    
  720.    
  721.         if( m_pConnection->State )   
  722.             m_pConnection->Close();   
  723.     //  m_pConnection = NULL;   //不可清空    
  724.     }   
  725.     catch(_com_error e)   
  726.     {   
  727.         AfxMessageBox("数据库连接无法正常关闭!");   
  728.         return false;   
  729.     }    
  730.    
  731.     CString strProvider;   
  732.     strProvider.Format( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s", strFileName );   
  733.     try                    
  734.     {      
  735.         // 打开本地Access库Student.mdb    
  736.         m_pConnection->Open( (_bstr_t)strProvider,"","",adModeUnknown);   
  737.     }   
  738.     catch(_com_error e)   
  739.     {   
  740.         AfxMessageBox("数据库连接失败,确认" + strFileName +"数据库是否在当前路径下!");   
  741.         return false;   
  742.     }    
  743.     return true;   
  744. }   
  745.    
  746. void CStudentAccessDlg::SelectRecordset(_RecordsetPtr pRecordset, CString strTableName)   
  747. {   
  748.     // 关闭记录集    
  749.     if( pRecordset->State )   
  750.         pRecordset->Close();   
  751.    
  752.     CString strSql;   
  753.     strSql.Format( "SELECT * FROM %s", strTableName );   
  754.        
  755.     try   
  756.     {   
  757.         pRecordset->Open((_bstr_t)strSql,                // 查询表中所有字段    
  758.                             m_pConnection.GetInterfacePtr(),     // 获取库接库的IDispatch指针    
  759.                             adOpenDynamic,   
  760.                             adLockOptimistic,   
  761.                             adCmdText);   
  762.     }   
  763.     catch(_com_error e)   
  764.     {   
  765.         AfxMessageBox( "确认数据库中是否存在正确格式的数据表" + strTableName );   
  766.         return;   
  767.     }   
  768. }   
  769.    
  770. // 读取文件参数表parameter,并显示在控件中    
  771. void CStudentAccessDlg::ReadParameter()   
  772. {   
  773.     try   
  774.     {   
  775.         if(!m_pRecordsetPara->BOF)   
  776.             m_pRecordsetPara->MoveFirst();   
  777.         else   
  778.         {   
  779.             AfxMessageBox("文件参数表为空");   
  780.             return;   
  781.         }   
  782.         // 读入参数表字段并显示在控件中    
  783.         _variant_t var;   
  784.         while(!m_pRecordsetPara->adoEOF)   
  785.         {   
  786.             var = m_pRecordsetPara->GetCollect("Lock");   
  787.             if(var.vt != VT_NULL)   
  788.             {   
  789.                 m_nLock = var.iVal;   
  790.             }   
  791.             this->m_comboLock.SetCurSel(m_nLock);        //下拉列表定位    
  792.                
  793.             var = m_pRecordsetPara->GetCollect("Secret");   
  794.             if(var.vt != VT_NULL)   
  795.             {   
  796.                 m_nSecret = var.iVal;   
  797.             }   
  798.             this->m_comboSecret.SetCurSel(m_nSecret);        //下拉列表定位    
  799.                
  800.             var = m_pRecordsetPara->GetCollect("Timedoc");   
  801.             CString strTimedoc;   
  802.             if(var.vt != VT_NULL)   
  803.             {   
  804.                 strTimedoc = (LPCSTR)_bstr_t(var);   
  805.             }   
  806.             //struct _SYSTEMTIME 几个属性都得赋值 在初始化中已经赋予当前时间    
  807.             m_CurTime.wYear = atoi(strtok(strTimedoc.GetBuffer(strTimedoc.GetLength()),"-"));   //strtok     
  808.             m_CurTime.wMonth = atoi(strtok(NULL,"-"));   
  809.             m_CurTime.wDay = atoi(strtok(NULL,"-"));   
  810.             m_dataTimedoc.SetTime(&m_CurTime);   
  811.             strTimedoc.ReleaseBuffer();   
  812.                
  813.             m_pRecordsetPara->MoveNext();   
  814.         }   
  815.     }   
  816.     catch(_com_error *e)   
  817.     {   
  818.         AfxMessageBox(e->ErrorMessage());   
  819.     }   
  820. }   
  821.    
  822. //更改Parameter参数表    
  823. void CStudentAccessDlg::OnEditParameter()    
  824. {   
  825.     CSelectFileDlg dlgFilePara;   
  826.    
  827.     dlgFilePara.m_nLock = this->m_nLock;     //传递下拉表变量    
  828.     dlgFilePara.m_nSecret = this->m_nSecret;   
  829.    
  830.     this->m_dataTimedoc.GetWindowText(dlgFilePara.m_strTimedoc);   
  831.    
  832.     if(dlgFilePara.DoModal() == IDOK)   
  833.     {      
  834.         CString strSql;   
  835.         strSql.Format("UPDATE Parameter SET Lock='%d',Secret='%d',Timedoc='%s' WHERE ID=1",   
  836.                       dlgFilePara.m_nLock,dlgFilePara.m_nSecret,dlgFilePara.m_strTimedoc);   
  837.            
  838.         this->ExecuteSql(strSql);   
  839.    
  840.         SelectRecordset( m_pRecordsetPara, "Parameter" );   //选择Parameter表数据到记录集    
  841.    
  842.         ReadParameter();    // 读取文件参数表parameter并显示在控件中    
  843.     }   
  844. }   
  845.    
  846. //执行sql语句    
  847. void CStudentAccessDlg::ExecuteSql(CString strSql)   
  848. {   
  849.     _variant_t vAffected;   
  850.        
  851.     try   
  852.     {   
  853.         m_pConnection->Execute(_bstr_t(strSql),&vAffected,adCmdText);   
  854.         AfxMessageBox("成功更新数据库!");   
  855.     }   
  856.     catch(_com_error e)   
  857.     {   
  858.         AfxMessageBox("无法执行Sql语句");   
  859.         return;   
  860.     }    
  861. }   
  862.    
  863. //设置各控件前景、背景色    
  864. HBRUSH CStudentAccessDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)    
  865. {   
  866.     HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);   
  867.        
  868.     if(nCtlColor==CTLCOLOR_LISTBOX)   
  869.     {   
  870.         //pDC->SetBkMode(TRANSPARENT);    
  871.         pDC->SetTextColor(RGB(0,0,0));   
  872.         pDC->SetBkColor(RGB(233,233,220));   
  873.         HBRUSH b=CreateSolidBrush(RGB(233,233,220));   
  874.         return b;   
  875.     }   
  876.     else if(nCtlColor==CTLCOLOR_SCROLLBAR)   
  877.     {   
  878.         //pDC->SetBkMode(TRANSPARENT);    
  879.         pDC->SetTextColor(RGB(0,0,0));   
  880.         pDC->SetBkColor(RGB(233,233,220));   
  881.         HBRUSH b=CreateSolidBrush(RGB(233,233,220));   
  882.         return b;   
  883.     }   
  884.     else if(nCtlColor==CTLCOLOR_EDIT)   
  885.     {   
  886.         //pDC->SetBkMode(TRANSPARENT);    
  887.         pDC->SetTextColor(RGB(0,0,0));   
  888.         pDC->SetBkColor(RGB(233,233,220));   
  889.         HBRUSH b=CreateSolidBrush(RGB(233,233,220));   
  890.         return b;   
  891.     }   
  892.     else if(nCtlColor==CTLCOLOR_STATIC)   
  893.     {   
  894.         pDC->SetTextColor(RGB(0,0,0));   
  895.         pDC->SetBkColor(RGB(160,180,220));   
  896.         HBRUSH b=CreateSolidBrush(RGB(160,180,220));   
  897.         return b;   
  898.     }   
  899.     else if(nCtlColor==CTLCOLOR_DLG)   
  900.     {   
  901.         pDC->SetTextColor(RGB(0,0,0));   
  902.         pDC->SetBkColor(RGB(160,180,220));   
  903.         HBRUSH b=CreateSolidBrush(RGB(160,180,220));   
  904.         return b;   
  905.     }   
  906.    
  907.     return hbr;   
  908. }   
  909.    
  910. void CStudentAccessDlg::OnHelp()    
  911. {   
  912.     ::ShellExecute(m_hWnd, NULL, "help.htm", NULL, NULL, SW_SHOWNORMAL);       
  913. }  
阅读(1999) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~