VC++数据库应用开发

1.数据库的建立:学生、班级、课程、成绩及综合测评等,本系统数据库的名称为HCCP ,共有4张表,包括学生基本信息表student、学生课程信息表class、学生课程成绩表grade以及综合测评数据表test,选择开始->程序->Microsoft SQLServer2005->SQLServer Management Studio命令连接服务器,连接服务器成功后建立以上所说的表

1.系统框架设计:建立一个基本对话框应用程序,在界面分别插入树形控件、列表控件和Tab控件,再添加一个静态文本来显示当前操作的课程信息,安排好界面,通过类向导,分别给树形控件、列表控件和Tab控件添加control类型变量m_treem_list1m_Tab,在对话框初始化函数OnInitDialog()中完成初始化操作,加入Select()动态创建树形控件节点,通过读取记录集数据与树形控件节点的数据进行关联,并通过递归函数改变节点

2.学生管理模块设计:插入两个对话框资源和其他各个控件,适当修改标题和ID号,布局好控件,在两个对话框空白区域双击,为学生信息添加界面建立一个类ADDDLG,给学生信息修改界面建立一个XSCJXG类,通过类向导给各个编辑框、控件添加变量,给各个按钮添加消息处理函数,编写代码实现功能模块

4.学生信息的添加:借助Format()函数,使用insert into表名values语句完成向表中插入数据操作SQL语句的构造

学生信息的修改:当用户选中列表控件中的某条记录之后,获取该记录对应的学号和姓名,显示在修改界面上,需要给该列表控件添加LVN_ITEMCHANGED消息,在显示的修改界面点击修改

学生信息的删除:使用delete from表名  语句实现删除表中数据的操作

5.课程信息的实现:添加课程信息修改对话框,为此对话框添加一个类XKXFXG类,通过类向导为各个编辑框、控件添加变量,给各个按钮添加消息处理函数

6.课程添加的实现:利用insert into语句执行SQL语句

课程修改的实现:通过数据库对象执行SQL语句,用update语句操作,借助Format()格式化函数

课程删除的实现:罪域选中某课程节点的删除操作,不仅需要在树形控件结构tree表中删除对应节点,还需要在grade表中删除对应课程号的所有成绩

7.成绩管理模块设计

成绩添加的实现:成绩添加界面同上面步骤类似,实现各个添加操作界面标题和控件隐藏或显示设置,具体是通过获取用户选中节点层次实现,Xuesheng()函数实现了在组合框中显示所有学生学号的初始化

成绩修改的实现:执行相应的SQL语句,

成绩的查询和实现:对列表控件进行初始化操作,通过执行查询条件构造的查询语句得到结果记录集,然后遍历记录集获取数据并插入到列表中

8.综合测评模块设计:测评数据从德育、智育、体育、附加分4方面来统计,测评按照不同院系的不同班级进行,计算班级同学的总成绩,测评的结果实现升降序排列和打印预览

9.上机调试程序,运行程序

.

结果:

1.在综合测评系统界面中的左边树形控件中,右键单击第一级节点常州大学,弹出快捷菜单,选择添加新院系A命令,弹出添加新院系对话框

2.在左侧树形控件中,右键单击第二级节点数理学院,弹出快捷菜单,选择添加新班级A命令,弹出添加新班级对话框

3.在左侧树形控件中,右键单击第三级节点信息071,弹出快捷菜单,选择添加新课程对话框

4.在左侧树形控件中,右键单击第四级节点英语,弹出快捷菜单,选择添加成绩A命令,弹出添加成绩对话框

5.主界面右下侧区域是学生信息数据操作区,选择Tab控件中的学生成绩修改选项卡,进入修改界面

6.在学生信息数据操作区中,选择Tab控件中的学生成绩查询选项卡,进入查询面

7.在学生信息数据操作区中,选择Tab控件中的学生学分修改选项卡,进入某门课程的学分修改界面

8.在选择班级测评界面的学院下拉列表中选择数理学院选项,在班级下拉列表中选择信息071选项,单击综合测评按钮,弹出信息071班学生综合测评对话框

9.设定各成绩比例后,单击计算总成绩按钮,再单击总成绩排序按钮,最终综合测评结果

10.单击打印预览按钮可以打印最终的测评结果

11.关闭系统时,自动完成系统数据库的备份,给出提示信息

实验2

疑难:1.插入Tab控件时,要注意其属性的设置,列表控件、树形控件、Tab控件的初始化方法,树形控件节点动态生成的方法

2.学生信息的添加删除修改的SQL语句执行的实现步骤

3.课程的添加、修改、删除的步骤显示

4.删除树形控件的节点时,注意查看数据库中表中是不是也删除了此节点

5.综合测评的结果

6.成绩升降序排序,选择测评的班级时是否结果对应相应班级的内容

7.实现打印预览功能

实验3

结果:1.系统运行后首先弹出数据还原对话框,单击数据还原按钮,开始还原数据库,如果数据文件正确,提示还原成功,则弹出登陆窗口对话框

2.在登录窗口对话框输入各项信息,单击确定按钮,如果输入信息无误,用户就可以进入超市管理系统主界面,如果用户名或密码输入错误,将弹出提示对话框

3.根据登录权限不同,会显示不同的系统界面,如果是普通用户,显示前台管理对话框,收银员通过该界面对交易商品进行管理,扫描商品编号后,在已购商品列表中会显示顾客所购商品的详细信息,如果顾客想放弃某个商品,可单击删除商品或取消交易按钮,如果收银员下班,可以通过换收银员按钮换班

4.如果是管理员或部门主管用户登录后会进入系统主界面,在该界面单击登录入库按钮,进入登记入库对话框选项卡,单击登记入库按钮,显示入库信息,单击新增按钮,显示扩展窗口,在其中输入各项信息,再单击入库确定按钮,如果输入信息无误,在列表控件中显示添加完的信息

5.在主界面单击入库明细按钮,进入入库明细选项卡,选中查询条件复选框,输入操作员编码,或设定时间范围,单击查询按钮,如果输入信息无误,用户就可以在列表控件中看到满足条件的信息,选中该条记录,还可以在扩展窗口编辑框中显示该条记录的更详细的信息

6.在入库情况汇总选项卡中,可以通过各种方式进行汇总,在汇总选项下拉列表框中选择年汇总选项,或设定时间范围来汇总,单击汇总按钮,就可以在操作结果列表框中看到满足条件的信息,在汇总情况趋于会显示入库汇总的数量

7.在主界面菜单栏上选择出入库管理|库存管理命令,弹出当前库存信息窗口,在其中输入商品名称设定最高、最低值后,单击查询按钮,如果输入信息无误,则可以在列表控件中看到满足条件的消息

8.在主界面菜单栏上选择后台管理菜单,该菜单下有4个子菜单:销售退货、用户管理、数据备份及还原,选择销售退货,弹出退货单对话框,通过该对话框可以帮顾客完成商品退货且更新销售信息

9.用户管理模块主要实现各种权限用户的添加、注销,密码及权限的修改操作,操作者必须具有管理员权限,数据备份模块主要实现对数据库的备份,允许用户更改路径添加备份文件

调试过程:

1.数据库设计:系统数据库包括7张表:保存前台销售信息,销售表tb_sale,销售的商品信息表:tb_merchangiseinfo,供应商表:tb_provider,库存表:tb_storage,库存管理表:tb_storemanage,数据库备份还原表:tb_backup,操作员表:tb_operator,数据库的名称为Sales,见表具体过程上机调试

2.用户登录模块设计:插入对话框资源和各个控件,适当修改标题和ID号,布局好界面,,在对话框空白区域双击,建立一个类PASSDLG,通过类向导给两个编辑框添加字符串变量m_userm_pass保存用户名和密码,在应用类中编写代码实现应用功能

3.前台销售模块设计:成界面的设计,插入对话框资源和各个控件,适当修改标题和ID,布局好界面,分别给各个控件添加消息处理函数及变量

1)编号信息的动态获取:完成界面的设计,然后适当修改标题和Id号,布局好界面,在对话框的空白区域双击,给该前台销售对话框建立一个类CForeMange,通过类向导给各个编辑框、List控件添加变量,给7哥按钮添加单击消息函数,给商品编号对应的编辑框添加EN_KILLFOCUS消息,动态获取编号商品信息,在CForeMange类中编写代码实现模块功能

2)商品信息键盘消息处理:添加GetFouc()函数,获取当前控件的焦点,实现键盘易用性设置,添加GetAllMoney()函数事先结账找零处理编写代码实现功能

商品详细信息查询处理:添加SetWindowPos()函数,改编自窗口、显示窗口和顶层窗口的大小,位置和Z轴次序

3)屏幕锁定和收银员换班:打开遍历tb_operator数据表,如果输入的用户和密码都正确,则把当前操作员显示为输入的用户,实现收银员的操作

4.入\出库模块设计:插入对话框资源和其他各个控件,适当修改标题和id号,安排好界面插入显示明细信息的List控件

1)登记入库界面的实现:根据当前日期,打开对应库存表,在tb_storeage表中查找最大的入库单号,获取新的入库单号,采用函数ShowWindows()封装实现对部分控件的隐藏显示

2)入库明细界面的实现:通过添加GetCheck()判断用户是否选中对应项,通过添加GetCurSel()函数获取组合框选中选项的索引号,添加GetFields()函数、GetItem()函数。为了实现商品的详细信息显示,封装GetMerc()函数,给列表控件添加LVN_ITEMCHANGED消息,相应鼠标单击列表的动作,在该消息中执行函数GetMerc(),编写各个函数代码实现函数功能

4.库存模块功能设计:完成界面的设计,插入对话框资源和各个控件,适当修改标题和ID,布局好界面,分别给各个控件添加消息处理函数及变量,编写代码实现功能

1)库存界面的实现:封装Justify()函数实现查询,添加GetCheck()hanshu8判断用户查询选择的条件,返回的值判断用户是否选中

5.后台模块设计:插入对话框资源和各个控件,安排好界面,分别给各个控件添加消息处理函数及变量,编写代码实现功能

1)销售退货界面的实现:完成SQL语句的构造,最后通过sqlstrsqlstr3变量保存

2)用户管理界面的实现:封装ShowData()函数完成列表框中用户的更新提示

6.数据库备份界面的实现:设置好路径和备份名,构造查询语句

7.数据库还原界面的实现:打开数据库表tb_backup,因为该表保存了所有备份文件的序号、名称、路径,COleDataTime的数据类型到字符串CString的转换,通过遍历tb_backup表读取各条记录写入到列表控件中完成初始化操作,先断开Sales数据库连接,再连接上master数据库,然后再执行还原语句

8.上机编写代码,调试程序,实现各个模块的具体功能

疑难小结:

1.每个功能模块的主界面的布局

2.数据库表的建立,数据库表关系图和主键的建立

3.商品信息键盘消息处理的过程,怎么获取当前控件的焦点,按下回车键就可以实现购买的商品价格统计

4.屏幕锁定和收银员换班,锁定通过显示无标题的模态对话框实现,换班通过不同收银员统计销售金额设计

5.入库、出库明细及入库汇总怎么实现的

3.数据库的还原和备份

1.登陆界面代码

PASSDLG::PASSDLG(CWnd* pParent /*=NULL*/)

: CDialog(PASSDLG::IDD, pParent)

{

//{{AFX_DATA_INIT(PASSDLG)

m_user = _T("");

m_pass = _T("");

//}}AFX_DATA_INIT

}

2.前台管理各个函数的实现代码

BOOL CForeMange::OnInitDialog() 

{

CDialog::OnInitDialog();

//////////////////////////////////////

    SetListStyle();

this;

///////////////////////////////////////

m_mercid.InsertItem=m_alreadynum-1;

///////////////////////////////////////////

SetStaticStyle();

SetEditStyle(16);

    SetSalesNum();

if(rectlarge.IsRectNull())

{

CRect rectseparator;

        GetWindowRect(&rectlarge);

GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectseparator);

rectsmall.left=rectlarge.left;

rectsmall.top=rectlarge.top;

rectsmall.right=rectseparator.right;

rectsmall.bottom=rectseparator.bottom;

}

SetWindowPos(NULL,0,0,rectsmall.Width(),rectsmall.Height(),SWP_NOMOVE|SWP_NOZORDER);

SetList2Style();

return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

void CForeMange::SetListStyle()

{

m_list.InsertColumn(0,"序号",LVCFMT_CENTER,80);

m_list.InsertColumn(1,"商品编号",LVCFMT_CENTER,80);

m_list.InsertColumn(2,"商品名称",LVCFMT_CENTER,140);

m_list.InsertColumn(3,"数量",LVCFMT_CENTER,80);

m_list.InsertColumn(4,"单价",LVCFMT_CENTER,80);

m_list.InsertColumn(5,"折扣",LVCFMT_CENTER,80);

m_list.InsertColumn(6,"金额",LVCFMT_CENTER,80);

m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE);

}

BOOL CForeMange::PreTranslateMessage(MSG* pMsg) 

{

if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN) //截取回车键   

{

if(::GetFocus()==m_mercnum)

{

UpdateData();

CString sqlstr;

sqlstr.Format("select * from tb_merchangiseinfo where id='%s'",m_id);

if(GetRecord(sqlstr)==0)

return false;

CString str=(LPCSTR)(_bstr_t)m_record->Fields->GetItem("number")->Value;

if(double(atof(str))<m_num)

{

MessageBox("数量不够!");

m_id="";

m_singlediscount="";

m_num=0;

m_mercid.SetFocus();

m_mercid.querystr="";

m_mercnum.num=0;

return false;

}

else

{

m_id="";

m_singlediscount="";

m_mercid.SetFocus();

m_mercid.querystr="";

m_mercnum.num=0;

m_alreadynum=m_list.GetItemCount();

m_mercid.InsertItem=m_alreadynum;

m_mercnum.SetWindowText("");

m_mercid.m_querystr="";

m_num=0;

m_enter=true;

GetAllMoney();

}

return true;

}

else if(::GetFocus()==m_editrealmoneyctrl)

{

SetBackMoney();

m_backenter=true;

return false;

}

else return false;

}

return CDialog::PreTranslateMessage(pMsg);

}

void CForeMange::SetStaticStyle()

{

    m_allmoneyctrl.SetFontSize(16);

m_allmoneyctrl.SetTextColor(RGB(0,255,0));

m_allmoneyctrl.SetBkColor(RGB(0,0,0));

m_allmoneyctrl.SetFontBold(TRUE);

m_allmoneyctrl.SetText(m_allmoney);

///////////////////////////////////////

m_realmoneyctrl.SetFontSize(16);

m_realmoneyctrl.SetTextColor(RGB(0,255,0));

m_realmoneyctrl.SetBkColor(RGB(0,0,0));

m_realmoneyctrl.SetFontBold(TRUE);

m_realmoneyctrl.SetText(m_realmoney);

/////////////////////////////////////////

m_backmoneyctrl.SetFontSize(16);

m_backmoneyctrl.SetTextColor(RGB(0,255,0));

m_backmoneyctrl.SetBkColor(RGB(0,0,0));

m_backmoneyctrl.SetFontBold(TRUE);

m_backmoneyctrl.SetText(m_backmoney);

//////////////////////////////////////

m_another.SetFontSize(16);

m_another.SetTextColor(RGB(0,255,0));

m_another.SetBkColor(RGB(0,0,0));

m_another.SetFontBold(TRUE);

m_another.SetText("");

//////////////////////////////////

}

void CForeMange::OnBtnok() 

{

UpdateData();

if(!m_list.GetItemCount())

{

MessageBox("确认输入产品?","系统提示!",MB_OK|MB_ICONSTOP);

return;

}

if(m_editrealmoney=="")

{

MessageBox("确认输入实付金额?","系统提示!",MB_OK|MB_ICONSTOP);

return;

}

    if(!m_backenter)

{

MessageBox("请确认已找零?","系统提示!",MB_OK|MB_ICONSTOP);

return;

}

m_backenter=false;

m_salesrs->Close();

CString sqlstr;

    for(int i=0;i<m_list.GetItemCount();i++)

m_salesrs=NULL;

    m_salesrs.CreateInstance(__uuidof(Recordset));

CString strmercid,strbuyid,strbuynum;

    strmercid=m_list.GetItemText(i,1);

        strbuyid=m_buynum;

strbuynum=m_list.GetItemText(i,3);

        sqlstr.Format("insert into tb_sale values('%s','%s',%s,'%s','no',0)",strbuyid,strmercid,strbuynum,operid);

m_salesrs->Open((_variant_t )sqlstr,theApp.m_connection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

        sqlstr.Format("update tb_merchangiseinfo set number=number-%s where id='%s'", strbuynum,strmercid);

GetRecord(sqlstr);

}

MessageBox("成功消费!");

InitValue();

}

void CForeMange::GetAllMoney()

{

        float allmoney=0;

     CString strmoney;

 int itemcount=m_list.GetItemCount();

 if(itemcount==0)

 {

 ::AfxMessageBox("没有购入商品!");

 GetDlgItem(IDC_MERCID)->SetFocus();

 allmoney=0;

 m_allmoney.Format("累计\r\n金额:%.2f",allmoney);

 m_floatallmoney=allmoney;

 SetAllMoneyStyle();

 return;

 }

 for(int i=0;i<itemcount;i++)

 {

 strmoney=m_list.GetItemText(i,6);

 allmoney+=atof(strmoney);

 }

 m_allmoney.Format("累计\r\n金额:%.2f",allmoney);

 m_floatallmoney=allmoney;

 SetAllMoneyStyle();

 UpdateData(false);

}

void CForeMange::SetAllMoneyStyle()

{

m_allmoneyctrl.SetText(m_allmoney);

}

void CForeMange::SetRealMoneyStyle()

{

m_realmoneyctrl.SetText(m_realmoney); 

}

void CForeMange::SetBackMoneyStyle()

{

m_backmoneyctrl.SetText(m_backmoney);

}

void CForeMange::SetEditStyle(int nSize)

{

      

  queryFont.CreateFont(   

  16,                                                 //   nHeight   

  16,                                                   //   nWidth   

  0,                                                   //   nEscapement   

  0,                                                   //   nOrientation   

  FW_NORMAL,                                   //   nWeight   

  FALSE,                                           //   bItalic   

  FALSE,                                           //   bUnderline   

  0,                                                   //   cStrikeOut   

  DEFAULT_CHARSET,                       //   nCharSet   

  OUT_DEFAULT_PRECIS,                 //   nOutPrecision   

  CLIP_DEFAULT_PRECIS,               //   nClipPrecision   

  DEFAULT_QUALITY,                       //   nQuality   

  DEFAULT_PITCH   |   FF_SWISS,     //   nPitchAndFamily   

  "宋体");                         //   lpszFacename   

    

  m_editrealmoneyctrl.SetFont(&queryFont);

 

  

}

HBRUSH CForeMange::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 

{

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if(pWnd->GetDlgCtrlID()==IDC_EDIT_REALMONEY) 

  pDC->SetBkColor(RGB(0,0,0));

  pDC-> SetTextColor(RGB(0,255,0)); 

          return ::CreateSolidBrush(RGB(0,0,0)); 

}    

// TODO: Return a different brush if the default is not desired

return hbr;

}

void CForeMange::SetBackMoney()

{

    UpdateData();

float backmoney=atof(m_editrealmoney)-m_floatallmoney;

if(backmoney<0)

{

MessageBox("金额不足","系统提示",MB_OK|MB_ICONSTOP);

return;

}

m_backmoney.Format("找回\r\n金额:%.2f",backmoney);

SetBackMoneyStyle();

m_backmoneyctrl.SetFocus();

}

CString CForeMange::SetSalesNum()

{

   CString retstring; 

   CString sqlstr="Select Max(buyid) as maxid from tb_sale";

   m_salesrs=NULL;

   try

   {   

   m_salesrs.CreateInstance(__uuidof(Recordset));

   m_salesrs->Open((_variant_t )sqlstr,theApp.m_connection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

   if(!m_salesrs->RecordCount)

   {

 retstring="1000000";

 m_buynum=retstring;

     UpdateData(false);

         return retstring;

   }

   else

   {

         retstring=(LPCSTR)(_bstr_t)m_salesrs->Fields->GetItem("maxid")->Value;

 int temp;

 temp=atoi(retstring)+1;

         retstring.Format("%d",temp);

 m_buynum=retstring;

     UpdateData(false);

 return retstring;

   }     

   m_salesrs->Close();

   }

   catch(_com_error e)

   {

   CString strError;

   strError.Format("CADOWrong is %s\nCode Meaning is %s\nDescription is %s",e.ErrorMessage(),

   (LPCSTR)e.Source(),(LPCSTR)e.Description());

       ::AfxMessageBox(strError);

   }

}

void CForeMange::InitValue()

{

if(!m_delflag)

     {   

m_list.DeleteAllItems();

m_allmoney="";

m_alreadynum=1;

m_enter=false;

////////////////////////////////////

m_mercnum.num=0;

m_mercnum.t=1;

m_mercnum.m_intdouflag=false;

m_mercnum.lastnum=0;

m_mercnum.m_allnum=0;

m_id="";

m_num=0;

//////////////////////////////////////

m_mercid.querystr="";

m_mercid.m_backnum=0;

m_mercid.m_querystr="";

m_mercid.InsertItem=m_alreadynum-1;

m_allmoney="累计\r\n金额:";

SetAllMoneyStyle();

m_realmoney="实收\r\n金额:";

m_backmoney="找回\r\n金额:";

SetStaticStyle();

//SetEditStyle(16);

SetSalesNum();

m_editrealmoney="";

m_singlediscount="";

}

else

{

    

m_delflag=false;

}

UpdateData(false);

}

void CForeMange::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 

{

// TODO: Add your message handler code here and/or call default

MessageBox("确认退出");

CDialog::OnChar(nChar, nRepCnt, nFlags);

}

void CForeMange::OnBtnDelmerc() 

{

     if(m_delitem==-1)

 {

       MessageBox("请选择商品!");

   return;

 }

 m_delflag=true;

     InitValue();

     DeleteMerc();

   //MessageBox("确认删除商品");

}

void CForeMange::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) 

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

    m_delitem=pNMListView->iItem;

*pResult = 0;

}

void CForeMange::DeleteMerc()

{

    m_list.DeleteItem(m_delitem);

int i=0;

int itemcount=m_list.GetItemCount();

LVCOLUMN;

if(itemcount==0)

{

m_alreadynum=1;

m_mercid.InsertItem=m_alreadynum-1;

m_delitem=-1;InitValue();

GetAllMoney();return;

}

else {m_mercid.InsertItem=m_mercid.InsertItem-1;m_delitem=-1;}

float allmoney=0;

for(i=m_delitem;i<=itemcount;i++)

{

CString str;

str.Format("%d",i);

m_list.SetItemText(i-1,0,str);

}

GetAllMoney();

m_delitem=-1;

//InitValue();

}

void CForeMange::OnBtncancelsales() 

{

if(m_list.GetItemCount()==0)

{

MessageBox("当前没有交易");

return;

}

if(MessageBox("确定取消?","系统提示",MB_YESNO|MB_ICONSTOP))

{

InitValue();

}

}

void CForeMange::OnBtnquit() 

{

PASSDLG dlg1;

if(dlg1.DoModal()==IDOK)

{

CString sqlstr;

sqlstr.Format("select * from tb_operator where operid='%s' and operpassword='%s'",dlg1.m_user,dlg1.m_pass);

        if(GetRecord(sqlstr)==0){MessageBox("没有该用户!");return;}

        operid=dlg1.m_user;

}

//else

// return;

CString sqlstr; CString str;

sqlstr.Format("select * from tb_operator where operid='%s'",operid);

if(GetRecord(sqlstr)==0)return;

else

{

str=(LPCSTR)(_bstr_t)m_record->Fields->GetItem("operlevel")->Value;

str.TrimLeft();

str.TrimRight();

}

    if(str=="管理员")

{

CDialog::OnCancel();

}

else

{

::PostQuitMessage(0);

}

}

void CForeMange::OnKillfocusMercid() 

{

CString sqlstr;

UpdateData();

if(m_id=="")return;

sqlstr.Format("select * from tb_merchangiseinfo where id='%s'",m_id);

if(GetRecord(sqlstr)==0)

{

MessageBox("没有该商品");

GetDlgItem(IDC_MERCID)->SetFocus();

return;

}

}

int CForeMange::GetRecord(CString sqlstr)

{

   m_record=NULL;

   m_record.CreateInstance(__uuidof(Recordset));

   m_record->Open((_variant_t )sqlstr,theApp.m_connection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

   int count=0;

   if(m_record!=NULL)

   {

   try

   {

   m_record->MoveFirst();

   }

   catch(...)

   {

   return 0;

   }

   if(m_record->_EOF)return 0;

   while(!m_record->_EOF)

   {

  m_record->MoveNext();

   count++;

   }

   }

   m_record->MoveFirst();

   return count;

}

void CForeMange::OnKillfocusMercnum() 

{

// TODO: Add your control notification handler code here

//m_num="";

CString sqlstr;

sqlstr.Format("select * from tb_merchangiseinfo where id='%s'",m_id);

if(GetRecord(sqlstr)==0)return ;

CString str=(LPCSTR)(_bstr_t)m_record->Fields->GetItem("number")->Value;

if(double(atof(str))<m_num)

{

MessageBox("数量不够!");

m_id="";

//m_num="";

m_singlediscount="";

m_mercid.SetFocus();

m_mercid.querystr="";

m_mercnum.num=0;

m_list.DeleteItem(m_list.GetItemCount()-1);

UpdateData(false);

return ;

}

m_singlediscount="";

m_id="";

m_mercid.SetFocus();

m_mercid.querystr="";

m_mercnum.num=0;

m_alreadynum=m_list.GetItemCount();

m_mercid.InsertItem=m_alreadynum;

m_mercnum.SetWindowText("0");

m_mercid.m_querystr="";

m_num=0;

m_enter=true;

UpdateData(false);

return ;

}

void CForeMange::OnKillfocusEditRealmoney() 

{

// TODO: Add your control notification handler code here

SetBackMoney();

m_backenter=true;

return;

}

void CForeMange::OnButton7() 

{

CString str;

if(GetDlgItemText(IDC_BUTTON7,str),str=="查询商品")

{

SetDlgItemText(IDC_BUTTON7,"退出查询");

}

    else

{

SetDlgItemText(IDC_BUTTON7,"查询商品");

}

if(rectlarge.IsRectNull())

{

CRect rectseparator;

GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectseparator);

rectsmall.left=rectlarge.left;

rectsmall.top=rectlarge.top;

rectsmall.right=rectseparator.right;

rectsmall.bottom=rectseparator.bottom;

}

    if(str=="退出查询")

{

SetWindowPos(NULL,0,0,rectsmall.Width(),rectsmall.Height(),SWP_NOMOVE|SWP_NOZORDER);

}

else

{

SetWindowPos(NULL,0,0,rectlarge.Width(),rectlarge.Height(),SWP_NOMOVE|SWP_NOZORDER);

}

CString sqlstr;

UpdateData();

sqlstr.Format("select id,mercname,number,outprice,discount,spec from tb_merchangiseinfo where id='%s'",m_id);

SetList2Value(sqlstr);

}

void CForeMange::SetList2Style()

{

m_list2.InsertColumn(0,"商品编号",LVCFMT_CENTER,80);

m_list2.InsertColumn(1,"商品名称",LVCFMT_CENTER,140);

m_list2.InsertColumn(2,"数量",LVCFMT_CENTER,80);

m_list2.InsertColumn(3,"单价",LVCFMT_CENTER,80);

m_list2.InsertColumn(4,"折扣",LVCFMT_CENTER,80);

m_list2.InsertColumn(5,"规格",LVCFMT_CENTER,80);

m_list2.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE);

}

void CForeMange::SetList2Value(CString sqlstr)

{

GetRecord(sqlstr);

m_list2.DeleteAllItems();

int rows=0;

try

{

for(int i=0;i<6;i++)

{

CString str;

str=(LPCSTR)(_bstr_t)m_record->Fields->GetItem(long(i))->Value;

if(i==0)m_list2.InsertItem(rows,str);

else

m_list2.SetItemText(rows,i,str);

}

UpdateData(false);

}

catch(...)

{

return;

}

}

void CForeMange::OnButton6() 

{

PASSDLG dlg1;

if(dlg1.DoModal()==IDOK)

{

CString sqlstr;

sqlstr.Format("select * from tb_operator where operid='%s' and operpassword='%s'",dlg1.m_user,dlg1.m_pass);

        if(GetRecord(sqlstr)==0){MessageBox("没有该用户!");return;}

        operid=dlg1.m_user;

}

}

void CForeMange::OnClose() 

{

// TODO: Add your message handler code here and/or call default

MessageBox("请不要退出");

// CDialog::OnClose();

}

3.用户系统管理界面代码的实现

BOOL SYSDLG::OnInitDialog() 

{

CDialog::OnInitDialog();

//////////////////////////////////ADO///////////////////////////////////////////////////

m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象

m_pRecordset.CreateInstance("ADODB.Recordset");//创建Recordset对象

m_pConnection->Open("driver={SQL Server};Server=127.0.0.1;DATABASE=Sales;","","",adModeUnknown);///连接数据库 //给组合框初始化

m_combo.InsertString(0,"管理员");

m_combo.InsertString(1,"收银员");

m_combo.SetCurSel(0);

ShowData();

return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

void SYSDLG::ShowData()

{

_variant_t va;

m_pRecordset =m_pConnection->Execute("select * from tb_operator order by operid",&va,adCmdText);

for(int i=m_list.GetCount();i>=0;i--)

m_list.DeleteString(i);

int k=0;

while(!m_pRecordset->_EOF)

CString str1 = ((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("opername"));

CString str2 = ((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("operlevel"));

str1.TrimRight();

str2.TrimRight();

m_list.InsertString(k,str1+"["+str2+"]");

k++;

m_pRecordset->MoveNext();

}

}

void SYSDLG::OnAdduser() 

{

UpdateData();

CString tempstr;

m_combo.GetLBText(m_combo.GetCurSel(),tempstr);

if(m_id!=""&&m_name!="")

{

while(!m_pRecordset->_EOF)

{

CString str = ((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("opername"));

str.TrimRight();

if(str==m_id)

{

AfxMessageBox("该用户名已存在!\r\n请重新选择新用户进行注册!");

m_id=m_name=m_pass=m_passr="";

    UpdateData(false);

return;

}

m_pRecordset->MoveNext();

}

if(m_pass==m_passr)

{

CString str,str2;

_variant_t va;

str.Format("insert into tb_operator values('%s','%s','%s','%s')",m_id,m_name,m_pass,tempstr);

m_pRecordset =m_pConnection->Execute(_bstr_t(str),&va,adCmdText);

AfxMessageBox("添加成功!!");

m_id=m_name=m_pass=m_passr="";

UpdateData(false);

ShowData();

}

else

{

AfxMessageBox("对不起!确认密码不正确!\r\n请您重新输入!");

m_passr="";

UpdateData(false);

return;

}

}

else 

{

AfxMessageBox("请输入正确的用户名!");

return;

}

}

void SYSDLG::OnDeluser() 

{

if(m_list.GetCurSel()==-1)

{

AfxMessageBox("请选择要删除的记录!");

return;

}

else

{

if(MessageBox("确定要删除吗?","提醒!",MB_YESNO)==IDYES)

{

CString tempstr;

_variant_t va;

m_list.GetText(m_list.GetCurSel(),tempstr);

CString temp=tempstr.Left(tempstr.GetLength()-8);

CString str;

str.Format("delete from tb_operator where opername like '%s%%'",temp);

m_pRecordset =m_pConnection->Execute(_bstr_t(str),&va,adCmdText);

AfxMessageBox("删除成功!!");

ShowData();

}

else

return;

}

}

void SYSDLG::OnModipass() 

{

UpdateData();

CString tempstr;

CString temp;

CString oldpass;

if(m_list.GetCurSel()==-1)

{

MessageBox("请选择要修改的记录!");

return;

}

else

{

m_list.GetText(m_list.GetCurSel(),tempstr);

temp=tempstr.Left(tempstr.GetLength()-8);

_variant_t va;

m_pRecordset =m_pConnection->Execute("select * from tb_operator order by opername",&va,adCmdText);

while(!m_pRecordset->_EOF)

{

CString str1 = ((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("opername"));

CString str2 = ((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("operlevel"));

str1.TrimRight();

str2.TrimRight();

if(str1==temp)

{

UpdateData();

oldpass = ((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("operpassword"));

oldpass.TrimRight();

UpdateData(false);

break;

}

m_pRecordset->MoveNext();

}

}

if(m_oldpass!="")

{

UpdateData();

if(m_oldpass==oldpass)

{

if(m_newpass!="")

{

if(m_newpass==m_newpassr)

{

CString str;

_variant_t va;

str.Format("update tb_operator set operpassword='%s' where opername='%s'",m_newpass,temp);

m_pConnection->Execute(_bstr_t(str),&va,adCmdText);

AfxMessageBox("修改成功!!\r\n");

AfxMessageBox("新密码为"+m_newpass+"!");

m_oldpass=m_newpass=m_newpassr="";

UpdateData(false);

ShowData();

}

else

{

AfxMessageBox("确认密码不正确!请重新输入!");

m_newpassr="";

UpdateData(false);

return;

}

}

else

{

AfxMessageBox("请输入新密码!");

return;

}

}

else

{

AfxMessageBox("旧密码不正确!请重新输入!");

m_oldpass=m_newpass=m_newpassr="";

UpdateData(false);

return;

}

}

else

{

AfxMessageBox("请输入旧密码!");

return;

}

}

4.库存信息代码

void CSTOCKMANAGE::OnBtnSet() 

{

// TODO: Add your control notification handler code here

CString sqlstr;

UpdateData();

sqlstr.Format("Update tb_storemanage set uplimit=%.2f ",m_max);

    if(Justify()=="")

return;

try{

theApp.m_connection->Execute(_bstr_t(sqlstr),NULL,adModeUnknown);

sqlstr.Format("Update tb_storemanage set  downlimit=%.2f",m_min);

theApp.m_connection->Execute(_bstr_t(sqlstr),NULL,adModeUnknown);

MessageBox("保存成功!");

GetDlgItem(IDC_BTN_SET)->ShowWindow(false);

}

catch(...)

{

MessageBox("没有更新成功!");

}

ShowListValue(Justify());

}

void CSTOCKMANAGE::OnBtnClose() 

{

// TODO: Add your control notification handler code here

CDialog::OnCancel();

}

BOOL CSTOCKMANAGE::OnInitDialog() 

{

CDialog::OnInitDialog();

// TODO: Add extra initialization here

GetDlgItem(IDC_BTN_SET)->ShowWindow(false);

SetListStyle();

return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

void CSTOCKMANAGE::SetListStyle()

{

    m_list.InsertColumn(0,"商品编号",LVCFMT_LEFT,120);

m_list.InsertColumn(1,"商品名称",LVCFMT_LEFT,120);

m_list.InsertColumn(2,"单价",LVCFMT_LEFT,80);

m_list.InsertColumn(3,"库存下限",LVCFMT_LEFT,120);

m_list.InsertColumn(4,"库存上限",LVCFMT_LEFT,120);

m_list.InsertColumn(5,"库存量",LVCFMT_LEFT,120);

m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

}

void CSTOCKMANAGE::GetRecord(CString sqlstr)

  ShowListValue(sqlstr);

  if(m_list.GetItemCount()==0)

  return;

  if(MessageBox("是否重新设置库存上下限?","系统提示",MB_YESNO|MB_ICONQUESTION)==6)

  {

  GetDlgItem(IDC_BTN_SET)->ShowWindow(true);

  GetDlgItem(IDC_STATIC1)->SetWindowText("设置上下限!");

  }

  else return;

}

void CSTOCKMANAGE::OnItemchangedList(NMHDR* pNMHDR, LRESULT* pResult) 

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

// TODO: Add your control notification handler code here

item=pNMListView->iItem;

m_min=atof(m_list.GetItemText(item,3));

    m_max=atof(m_list.GetItemText(item,4));

UpdateData(false);

*pResult = 0;

}

CString CSTOCKMANAGE::Justify()

{

UpdateData();

    CString sqlstr;

if((m_check1.GetCheck()==true)&&(m_check2.GetCheck()==true))

{

MessageBox("请不要同时选择!");

return "";

}

else if((m_check1.GetCheck()==false)&&(m_check2.GetCheck()==true))

{

if(m_mercid==""){MessageBox("请输入要查询的条件");return "";}

sqlstr.Format("select a.mercid,b.mercname,b.inprice,a.downlimit,a.uplimit,a.nowvalues from tb_storemanage a inner join tb_merchangiseinfo\

b on a.mercid=b.id where a.mercid='%s'",m_mercid);

}

else if((m_check1.GetCheck()==true)&&(m_check2.GetCheck()==false))

{

sqlstr.Format("select a.mercid,b.mercname,b.inprice,a.downlimit,a.uplimit,a.nowvalues from tb_storemanage a inner join tb_merchangiseinfo\

b on a.mercid=b.id where a.downlimit>=%.2f and a.uplimit<=%.2f",m_min,m_max);

}

else

{

MessageBox("请输入要查询的条件");

return "";

}

return sqlstr;

}

void CSTOCKMANAGE::ShowListValue(CString sqlstr)

{

     m_record=NULL;

   m_record.CreateInstance(__uuidof(Recordset));

   m_record=theApp.m_connection->Execute(_bstr_t(sqlstr),NULL,adModeUnknown);

   m_list.DeleteAllItems();

   int rows=0;

   try

   {

   while(!m_record->_EOF)

   {

   for(int i=0;i<6;i++)

   {

   CString temp=(LPCSTR)(_bstr_t)m_record->Fields->GetItem(long(i))->Value;

   if(i==0)m_list.InsertItem(rows,temp);

   else m_list.SetItemText(rows,i,temp);

   }

   m_record->MoveNext();

   rows++;

   }

   }

   catch(_com_error e)

   {

   MessageBox(e.ErrorMessage());

   }

   if(m_list.GetItemCount()==0)

   {

   MessageBox("没有找到记录");

   return;

   }

}

5.其余代码见压缩包

实验4   人事管理系统

结果:1.系统进入登陆界面,登陆界面用来验证本系统用户的类型

2.登陆成功后进入系统,主界面的系统菜单中包括了系统的所有功能

3.选择系统管理-用户管理命令,打开用户管理对话框,在该对话框中系统管理员可以添加鱼注销用户

4.选择系统管理-修改密码命令,打开修改密码对话框,在该对话框中登录用户可以修改自己的密码

5.选择系统管理-备份数据库命令,打开备份数据库对话框,在该对话框中系统管理员可以还原数据库

6.选择系统管理-还原数据库命令,打开还原数据库对话框,在该对话框中系统管理员可以还原数据库

7.选择职工管理-添加职工信息命令,打开职工信息添加对话框,在该对话框中可以添加职工基本信息

8.选择职工管理命令,打开职工基本信息管理对话框,在该对话框中可以对职工进行修改与删除操作

9.选择部门管理-部门命令,打开部门管理对话框,在该对话框中可以进行部门的添加、修改及删除操作

10选择考勤管理-节假日管理命令,打开节假日设置对话框,在该对话框可以对节假日进行添加、修改及删除操作

11选择考勤管理-考勤命令,打开考勤管理对话框,在该对话框中可以记录职工的出勤情况

12选择考勤管理-考勤信息浏览命令,打开考勤信息对话框,在该对话框中查询职工的出勤情况

13.选择工资管理-工资计算公式命令,打开工资计算公式对话框,在该对话框中修改工资计算公式

14.选择工资管理-职工工资统计命令,打开员工工资统计对话框,在该对话框中看到产看员工的工资情况

调试过程:1.打开SQLServer2005,建立数据库表,本系统数据库名称为HMSys,数据库表有:职工表:emp,其中字段有:职工id,职工名字namesexAgeaddrdepartbirthphonemore(备注)、photo(照片)。部门表:dep,其中字段有:职工idname,主管mangephonemore工资表wageinfo,字段有:职工idwagedepdate。用户表:users,包含字段:users(用户名)、Pswtype。考勤表:checkinfo,包含字段:dateidquestionzaotuichidaoxiuxibingjiachuchaishijiamoreymot1ot2ot3节假日表:holiday,包含字段:职工idnamedate和保存工资计算公式表:wagecal,包含字段:chuchaibingjiashijiapingshishuangxiufading,给数据库表建立关系图

2.进行ADO的初始化操作,接下来连接数据库,在ADOConn类的头文件中定义一个——ConnectionPtr类型的变量m_pConnection,用来连接和执行相应的SQL语句

3.职工模块设计:实现职工信息的录入、修改、删除等操作,当用户登录系统通过选择相应的菜单显示职工信息界面,然后可以实现添加、修改、查询、删除操作,添加数据中借助Picture控件和DateTimePicker设置职工出生日期

1)职工添加的实现:双击对话框,为对话框资源创建一个新类CEmpAddDlg定义变量:m_hBitmap,m_nFilelen,char *m_pBMPBuffer,m_pRecordset,利用成员函数AddString()实现将字符串插入到组合框中,添加OnPaint()函数完成职工照片的显示添加WM_LBUTTONDOWN消息响应函数,判断鼠标是不是在Picture控件上,添加OnAdd()函数把职工信息添加到数据库中,借助Format()函数将年月日的信息格式化到字符串中,通过AddNew()函数添加一条新的记录,PutCollect()函数将数据添加到对应的字段中,然后编写代码,执行SQL语句,职工删除的实现:添加一个对话框资源,IdIDD_EMPINFO_MANAGE_DLG,双击对话框建立一个新类CEmpInfoManageDlg,在头文件中定义变量:m_pRecordsetm_nSelectm_nID及成员函数:ShowTreeData()和ShowListData()分别为将数据显示在树形控件和列表控件中,为对话框添加WM_INITDIALOG消息响应函数,然后编写代码,执行SQL语句,职工修改的实现添加PutCollect()函数修改相应的字段,然后调用Update()函数完成数据库的更新,然后编写代码,执行SQL语句,职工查询的实现:插入一个对话框资源,idIDD_EMP_INDEX_DLG,双击对话框空白区域,为该对话框建立一个类,双击查询按钮添加消息响应函数,然后编写代码,执行SQL语句

4.考勤模块设计:考勤管理的实现:创建一个对话框资源,IDIDD_CHECK_MANAGE_DLG,完成对话框控件的添加,为对话框创建一个新类CCheckManageDlg,借助Format()函数,通过select count*from 表名where 条件,构造从表中查询符合数据总数的SQL语句,有加班人员,点击加班(创建一个加班的对话框),添加一个类COverTimeDlg,在初始化函数中添加相应的代码,实现功能考勤信息的录入工作,考勤的统计、查询与删除:之前完成了考勤信息的录入工作,接下来创建一个对话框资源,idIDD_CHECK_INFO_DLG,为对话框创建一个类添加列表控件通过InsertItem()函数设置列表控件第一列的数据,其他各列的的数据通过SetItemText()函数设置,然后为列表控件添加LVN_ITEMCHANGED消息响应函数OnItemchangedList(),用ShowListData()函数来显示列表控件的数据,在初始化对话框中完成对话框的初始化

5.工资模块设计

1)工资计算的实现:添加一个对话框资源,设置IDIDD_WAGE_CAL_DLG,主要的功能是实现职工工资计算的基本设置,包含:出差工资,事假工资,病假工资,平时加班,双休日工资和法定期加班,为对话框添加相应的类,执行SQL语句update  wagecal set 变量,执行sql语句,查看数据库中的数据的更新

2)工资基本信息的设置:根据工资信息的设置来配合工资的统计,如职工的月工资和到岗时间,添加一个对话框资源。IDIDD_WAGE_MANGE_DLG,在对话框的初始化函数中对树形控件和列表控件进行初始化,添加响应的函数添加相应的代码实现功能

3)工资统计查询:添加一个对话框资源,IDIDD_WAGE_DLG,添加相应的变量和函数,在对话框初始化函数中为列表控件进行初始化利用SQL语句创建一张临时表,保存职工的休假和加班情况,“create table 表名(字段名 数据类型)”为创建表的SQL语句然后将加班和休假的情况统计出来,添加到这个临时表中,当用户单击查询时,根据SQL语句:“”select * from temp where id='"%s"',m_strID,strMonth”将数据显示在列表控件中

6.系统模块设计:1)用户添加的实现:添加一个对话框资源,IDIDD_USER_MANAGE_DLG,添加GetCount()函数返回列表中数据的总数,函数DeleteString()函数删除索引的数据,OnClear()函数清空编辑框中的数据,添加OnAdd()函数完成数据的添加

2)数据库还原的实现:添加对话框资源,IDIDD_RESTORE_DLG,添加编辑框和按钮控件,给还原按钮添加消息响应函数,借助master数据库来实现数据库的还原

疑难:

1.建立数据库中,用到的字段名,字段主键的设置,字段属性和字段大小的设置,表与表之间关系的建立

2.职工模块设计:实现职工信息的录入、修改、删除等操

3.工资计算的实现:对职工工资的设置:出差工资,事假工资,病假工资,平时加班,双休日工资和法定期加班。工资基本信息的设置:根据工资信息的设置来配合工资的统计,如职工的月工资和到岗时间。以及工资统计查询等

4.实现数据库的还原

1.职工基本信息模块

BOOL CEmpInfoManageDlg::OnInitDialog() 

{

CDialog::OnInitDialog();

m_pRecordset.CreateInstance("ADODB.Recordset");

m_pRecordset1.CreateInstance("ADODB.Recordset");

m_ListCrtl.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT );//风格的设定。整行选择

m_ListCrtl.InsertColumn(0, "ID", LVCFMT_CENTER, 40);

m_ListCrtl.InsertColumn(1, "员工名称", LVCFMT_CENTER, 60);

m_ListCrtl.InsertColumn(2, "年龄", LVCFMT_CENTER, 40);

m_ListCrtl.InsertColumn(3, "性别", LVCFMT_CENTER, 40);

m_ListCrtl.InsertColumn(4, "籍贯", LVCFMT_CENTER, 120);

m_ListCrtl.InsertColumn(5, "部门", LVCFMT_CENTER, 120);

m_ListCrtl.InsertColumn(6, "出生日期", LVCFMT_CENTER, 100);

m_ListCrtl.InsertColumn(7, "电话", LVCFMT_CENTER, 80);

m_ListCrtl.InsertColumn(8, "备注", LVCFMT_CENTER, 200);

ShowTreeData();

return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

void CEmpInfoManageDlg::ShowTreeData()

{

m_TreeCrtl.DeleteAllItems(); //删除所有的子项

HTREEITEM hItem; //定义句柄

TVINSERTSTRUCT tvInsert; //定义结构体

tvInsert.hParent = NULL;

tvInsert.hInsertAfter = NULL;

tvInsert.item.mask = TVIF_TEXT;

tvInsert.item.pszText = _T("某单位"); //根节点的赋值

m_hParent = m_TreeCrtl.InsertItem(&tvInsert); //插入跟节点

_variant_t vName;

CString strSQL; //定义字符串变量

strSQL.Format("select [name] from dep");

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

while(!m_pRecordset->adoEOF) //如果记录没有到末尾

{

vName = m_pRecordset->GetCollect(_variant_t((long)0));//获取记录集第一列的值

hItem = m_TreeCrtl.InsertItem((char*)_bstr_t(vName), m_hParent);//插入到列表控件中

strSQL.Format("select name from emp");

m_pRecordset1 = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

while(!m_pRecordset1->adoEOF)

{

vName = m_pRecordset1->GetCollect(_variant_t((long)0));

m_TreeCrtl.InsertItem((char*)_bstr_t(vName), hItem);

m_pRecordset1->MoveNext();

}

m_pRecordset->MoveNext();

}

m_TreeCrtl.Expand(m_hParent,TVE_EXPAND);//展开根节点

}

CATCH_ERROR;

}

void CEmpInfoManageDlg::ShowListData(const CString& sql)

{

m_ListCrtl.DeleteAllItems(); //删除所有的子项

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)sql, NULL, adCmdText);

int i = 0;

while(!m_pRecordset->adoEOF)//记录没有到末尾

{

m_ListCrtl.InsertItem(i, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)0))));

m_ListCrtl.SetItemText(i, 1, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)1))));

m_ListCrtl.SetItemText(i, 2, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)2))));

m_ListCrtl.SetItemText(i, 3, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)3))));

m_ListCrtl.SetItemText(i, 4, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)4))));

m_ListCrtl.SetItemText(i, 5, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)5))));

m_ListCrtl.SetItemText(i, 6, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)6))));

m_ListCrtl.SetItemText(i, 7, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)7))));

m_ListCrtl.SetItemText(i, 8, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)8))));

i++;

m_pRecordset->MoveNext();//移动到下一条记录

}

}

CATCH_ERROR;

}

void CEmpInfoManageDlg::OnDblclkTree1(NMHDR* pNMHDR, LRESULT* pResult) 

{

_variant_t va;

CString strSQL;

HTREEITEM hSelect;

hSelect = m_TreeCrtl.GetSelectedItem(); //获取选中节点的索引

CString strName;

if(hSelect != m_hParent) //判断是否为根节点

{

strName = m_TreeCrtl.GetItemText(hSelect); //获取选中节点的文本

if(m_TreeCrtl.GetParentItem(hSelect) == m_hParent)//判断是否为根节点的子结点

{

strSQL.Format("select * from emp where depart = '%s'", strName);

}

else

strSQL.Format("select * from emp where name = '%s'", strName);

ShowListData(strSQL); //显示数据

}

*pResult = 0;

}

void CEmpInfoManageDlg::OnAdd() 

{

CEmpAddDlg dlg;

dlg.DoModal();

}

void CEmpInfoManageDlg::OnUpdate() 

{

if(theApp.m_strEmpID == "")

{

MessageBox("请选择一条信息!");

return ;

}

CEmpUpdateDlg dlg;

dlg.DoModal();

}

void CEmpInfoManageDlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) 

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

int nSelect = pNMListView->iItem; //获取选定的行号

theApp.m_strEmpID = m_ListCrtl.GetItemText(nSelect,0); //去除选定行的第一列的文本

*pResult = 0;

}

void CEmpInfoManageDlg::OnDel() 

{

if(theApp.m_strEmpID == "")

{

MessageBox("请选择一条信息!");

return ;

}

CString strSQL; //定义字符串变量

strSQL.Format("delete from emp where id = %s", theApp.m_strEmpID);

if(MessageBox("确定删除吗?", "注意", MB_YESNO) == IDYES)//消息提示

{

try

{

theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

MessageBox("删除成功!");

ShowTreeData();

m_ListCrtl.DeleteAllItems();

}

CATCH_ERROR;

}

}

void CEmpInfoManageDlg::OnIndex() 

{

CEmpIndexDlg dlg; //定义对话框对象

UpdateData();

if(dlg.DoModal() == IDOK) //如果点击了查询按钮

{

CString strSQL; //定义字符串变量

if(dlg.m_nFlag == 1) //判断查询的方式

{

strSQL.Format("select * from emp where id = %s", dlg.m_strID);

ShowListData(strSQL);

}

if(dlg.m_nFlag == 2)

{

strSQL.Format("select * from emp where name = '%s'", dlg.m_strName);

ShowListData(strSQL);

}

}

}

2.职工添加的模块设计

void CEmpAddDlg::OnLButtonDown(UINT nFlags, CPoint point) 

{

CRect Rect; //定义一个区域

GetDlgItem(IDC_PHOTO)->GetWindowRect(&Rect);//获取区域

ScreenToClient(&Rect); //将屏幕坐标转换为客户坐标

if(Rect.PtInRect(point)) //如果在这个区域内

{

CFileDialog FileDlg(TRUE, "BMP", NULL, //定义文件对话框

OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "位图文件(*.BMP)|*.BMP||");

if(FileDlg.DoModal() != IDOK) //打开文件对话框

return ;

CString pathname = FileDlg.GetPathName();//获取选中文件的路径

CFile file; //定义一个文件变量

if(!file.Open(pathname, CFile::modeRead) )//以制度的方式打开文件

return ;

m_nFileLen = file.GetLength();//获取文件的长度

m_pBMPBuffer = new char[m_nFileLen + 1];//开辟符数组

if(!m_pBMPBuffer) //如果控件不够大

return ;

if(file.ReadHuge(m_pBMPBuffer,m_nFileLen) != m_nFileLen)//读取文件保存在字符数组中

return ;

LPSTR hDIB,lpBuffer = m_pBMPBuffer;

LPVOID lpDIBBits;

BITMAPFILEHEADER bmfHeader;//保存bmp文件头的信息

DWORD bmfHeaderLen;//保存文件头的长度

bmfHeaderLen = sizeof(bmfHeader);//读取文件头的长度

strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);//文件的赋值

if (bmfHeader.bfType != (*(WORD*)"BM"))//如果文件类型不对

return ;

hDIB = lpBuffer + bmfHeaderLen; //将指针移动到文件头的后面

BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;//读取bmp文件的数据

BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;

lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;

CClientDC dc(this);

m_hPhotoBitmap = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);

Invalidate();

}

CDialog::OnLButtonDown(nFlags, point);

}

void CEmpAddDlg::OnPaint() 

{

CPaintDC dc(this); // device context for painting

CStatic *pStaic = (CStatic*)GetDlgItem(IDC_PHOTO);//获取IDIDC_PHOTO控件的指针

CBitmap bmp; //定义位图变量

bmp.Attach(m_hPhotoBitmap);

BITMAP bm; //定义一个位图结构

bmp.GetBitmap(&bm);

CDC dcMem; 

dcMem.CreateCompatibleDC(GetDC()); //创建一个兼容的DC

CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(bmp); //将位图选入设备环境类

CRect lRect;      //定义一个区域

pStaic->GetClientRect(&lRect); //获取控件的客户区域

lRect.NormalizeRect(); 

pStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(), 

&dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY); //显示位图 

dcMem.SelectObject(&poldBitmap); //将原有的句柄选入设备环境

}

BOOL CEmpAddDlg::OnInitDialog() 

{

CDialog::OnInitDialog();

CString strSQL; //定义字符串变量

strSQL.Format("select * from dep"); //格式化SQL语句

try

{

m_pRecordset1 = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);//执行SQL语句并将结果返回给记录集

while(!m_pRecordset1->adoEOF) //如果记录没有到末尾

{

m_DepartCtrl.AddString((char*)_bstr_t(m_pRecordset1->GetCollect(_variant_t((long)1))));//将记录集查询的结果添加到下拉列表框中

m_pRecordset1->MoveNext();//移动到下一条记录

}

}

CATCH_ERROR;

m_pRecordset.CreateInstance("ADODB.Recordset");

HRESULT hr = m_pRecordset->Open("SELECT * FROM emp",

_variant_t((IDispatch *)theApp.m_pConnection,true),

adOpenDynamic,adLockPessimistic,adCmdText);

m_SexCtrl.SetCurSel(0);//下拉列表框默认选择第一项

m_DepartCtrl.SetCurSel(0);

return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

void CEmpAddDlg::OnBtnAdd() 

{

UpdateData(); //更新数据

if(m_strName == "") //条件判断

{

MessageBox("姓名不能为空!");

return ;

}

if(m_nAge == 0)

{

MessageBox("请设置年龄!");

return ;

}

CString strSex, strDepart, strBirth, strAge;//定义字符串变量

strBirth.Format("%d-%d-%d", m_Birth.GetYear(), m_Birth.GetMonth(), m_Birth.GetDay());

int nIndex = m_SexCtrl.GetCurSel();//获取下拉列表框选中的索引

m_SexCtrl.GetLBText(nIndex, strSex);//获取下拉列表框的文本

nIndex = m_DepartCtrl.GetCurSel();

m_DepartCtrl.GetLBText(nIndex, strDepart);

strAge.Format("%d", m_nAge);

m_pRecordset->AddNew;

m_pRecordset->PutCollect("name",_variant_t(m_strName));

m_pRecordset->PutCollect("age",_variant_t((long)m_nAge));

m_pRecordset->PutCollect("sex",_variant_t(strSex));

m_pRecordset->PutCollect("addr",_variant_t(m_strAddr));

m_pRecordset->PutCollect("depart",_variant_t(strDepart));

m_pRecordset->PutCollect("birth",_variant_t(strBirth));

m_pRecordset->PutCollect("phone",_variant_t(m_strPhone));

m_pRecordset->PutCollect("more",_variant_t(m_strMore));

char *pBuf = m_pBMPBuffer;

VARIANT varBLOB;

SAFEARRAY *psa;

    SAFEARRAYBOUND rgsabound[1];

if(pBuf)

{    

rgsabound[0].lLbound = 0;

rgsabound[0].cElements = m_nFileLen;

psa = SafeArrayCreate(VT_UI1, 1, rgsabound);

for (long i = 0; i < (long)m_nFileLen; i++)

SafeArrayPutElement (psa, &i, pBuf++);

varBLOB.vt = VT_ARRAY | VT_UI1;

varBLOB.parray = psa;

m_pRecordset->GetFields()->GetItem("photo")->AppendChunk(varBLOB);

}

m_pRecordset->Update();

MessageBox("保存成功!");

}

void CEmpAddDlg::OnMouseMove(UINT nFlags, CPoint point) 

{

CRect Rect; //定义一个区域

GetDlgItem(IDC_PHOTO)->GetWindowRect(&Rect);//获取区域

ScreenToClient(&Rect); //将屏幕坐标转换为客户坐标

if(Rect.PtInRect(point)) //如果在这个区域内

{

HCURSOR hCursor; 

hCursor = AfxGetApp() -> LoadCursor(IDC_HAND); 

SetCursor(hCursor); 

}

CDialog::OnMouseMove(nFlags, point);

}

3.职工修改的实现

void CEmpUpdateDlg::OnUpdate() 

{

UpdateData(); //更新数据

if(m_strName == "") //条件判断

{

MessageBox("姓名不能为空!");

return ;

}

if(m_nAge == 0)

{

MessageBox("请设置年龄!");

return ;

}

CString strSex, strDepart, strBirth, strAge; //定义字符串变量

SYSTEMTIME   time;   

CDateTimeCtrl*m_TimeCtrl=(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER1);   

DateTime_GetSystemtime(m_TimeCtrl->m_hWnd,&time);   

strBirth.Format("%d-%d-%d",time.wYear,time.wMonth,time.wDay);

GetDlgItem(IDC_COMBO1)->GetWindowText(strSex);//设置控件的文本

GetDlgItem(IDC_COMBO2)->GetWindowText(strDepart);

strAge.Format("%d", m_nAge);

m_pRecordset->PutCollect("name",_variant_t(m_strName));

m_pRecordset->PutCollect("age",_variant_t((long)m_nAge));

m_pRecordset->PutCollect("sex",_variant_t(strSex));

m_pRecordset->PutCollect("addr",_variant_t(m_strAddr));

m_pRecordset->PutCollect("depart",_variant_t(strDepart));

m_pRecordset->PutCollect("birth",_variant_t(strBirth));

m_pRecordset->PutCollect("phone",_variant_t(m_strPhone));

m_pRecordset->PutCollect("more",_variant_t(m_strMore));

char *pBuf = m_pBMPBuffer;

VARIANT varBLOB;

SAFEARRAY *psa;

    SAFEARRAYBOUND rgsabound[1];

if(pBuf)

{    

rgsabound[0].lLbound = 0;

rgsabound[0].cElements = m_nFileLen;

psa = SafeArrayCreate(VT_UI1, 1, rgsabound);

for (long i = 0; i < (long)m_nFileLen; i++)

SafeArrayPutElement (psa, &i, pBuf++);

varBLOB.vt = VT_ARRAY | VT_UI1;

varBLOB.parray = psa;

m_pRecordset->GetFields()->GetItem("photo")->AppendChunk(varBLOB);

}

m_pRecordset->Update();

MessageBox("修改成功!");

}

void CEmpUpdateDlg::OnExit() 

{

OnOK();

}

void CEmpUpdateDlg::OnLButtonDown(UINT nFlags, CPoint point) 

{

CRect Rect; //定义一个区域

GetDlgItem(IDC_PHOTO)->GetWindowRect(&Rect);//获取区域

ScreenToClient(&Rect); //将屏幕坐标转换为客户坐标

if(Rect.PtInRect(point)) //如果在这个区域内

{

Selectphoto();

}

}

BOOL CEmpUpdateDlg::OnInitDialog() 

{

CDialog::OnInitDialog();

m_pRecordset.CreateInstance("ADODB.Recordset");

CString strSQL;

strSQL.Format("select name from dep");

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

while(!m_pRecordset->adoEOF)

{

m_DepartCrtl.AddString((char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)0))));

m_pRecordset->MoveNext();

}

}

CATCH_ERROR;

m_pRecordset->Close();

ReadData();

return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

void CEmpUpdateDlg::ReadData()

{

DestroyPhoto(); ///清除原图像

CString strSQL;

strSQL.Format("select * from emp where id = %s", theApp.m_strEmpID);

m_pRecordset->Open((_bstr_t)strSQL,_variant_t((IDispatch *)theApp.m_pConnection,true),

adOpenDynamic,adLockPessimistic,adCmdText);

long lDataSize = m_pRecordset->GetFields()->GetItem("photo")->ActualSize;

if(lDataSize > 0)

{

_variant_t varBLOB;

varBLOB = m_pRecordset->GetFields()->

GetItem("photo")->GetChunk(lDataSize);

if(varBLOB.vt == (VT_ARRAY | VT_UI1))

{

///重新分配必要的存储空间

if(m_pBMPBuffer = new char[lDataSize+1]) 

{

char *pBuf = NULL;

SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);

//复制数据到缓冲区m_pBMPBuffer

memcpy(m_pBMPBuffer,pBuf,lDataSize);

SafeArrayUnaccessData (varBLOB.parray);

m_nFileLen = lDataSize;

///生成BITMAP对象

m_hPhotoBitmap = BufferToHBITMAP();

}

}

}

m_strName = m_pRecordset->GetCollect("name").bstrVal;

m_nAge = m_pRecordset->GetCollect("age").lVal;

GetDlgItem(IDC_COMBO1)->SetWindowText((char*)_bstr_t(m_pRecordset->GetCollect("sex").bstrVal));

GetDlgItem(IDC_COMBO2)->SetWindowText((char*)_bstr_t(m_pRecordset->GetCollect("depart").bstrVal));

m_strAddr = m_pRecordset->GetCollect("addr").bstrVal;

m_strPhone = m_pRecordset->GetCollect("phone").bstrVal;

m_strMore = m_pRecordset->GetCollect("more").bstrVal;

CString strBirth = (char*)_bstr_t(m_pRecordset->GetCollect("birth").bstrVal);//出生日期

COleVariant vtime(strBirth);

vtime.ChangeType(VT_DATE);

COleDateTime time1=vtime;

// SYSTEMTIME systime;

// VariantTimeToSystemTime(time1, &systime);

CTime tm(time1);

m_Birth=tm;

UpdateData(FALSE);

}

///////////选择BMP文件并加载到内存/////////////

void CEmpUpdateDlg::Selectphoto() 

{

CFileDialog dlg(TRUE,"BMP",NULL,  OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"BMP Files (*.bmp)|*.bmp||");

if(dlg.DoModal() == IDOK)

{

CString pathname = dlg.GetPathName();

DestroyPhoto();

LoadBMPFile(pathname);

m_hPhotoBitmap = BufferToHBITMAP();

Invalidate();

}

}

/////////////清除分配的对象/////////////

void CEmpUpdateDlg::DestroyPhoto()

{

if(m_hPhotoBitmap)

{

DeleteObject(m_hPhotoBitmap);

m_hPhotoBitmap = NULL;

}

if(m_pBMPBuffer)

{

delete m_pBMPBuffer;

m_pBMPBuffer = NULL;

}

}

/////////////加载BMP文件到内存//////////////

BOOL CEmpUpdateDlg::LoadBMPFile(const char *pBMPPathname)

{

CFile file;

if( !file.Open( pBMPPathname, CFile::modeRead) )

return FALSE;

m_nFileLen = file.GetLength();

m_pBMPBuffer = new char[m_nFileLen + 1];

if(!m_pBMPBuffer)

return FALSE;

if(file.ReadHuge(m_pBMPBuffer,m_nFileLen) != m_nFileLen)

return FALSE;

return TRUE;

}

///////////将内存中的BMP文件内容转换到HBITMAP//////

HBITMAP CEmpUpdateDlg::BufferToHBITMAP()

{

HBITMAP hBmp;

LPSTR hDIB,lpBuffer = m_pBMPBuffer;

LPVOID lpDIBBits;

BITMAPFILEHEADER bmfHeader;

DWORD bmfHeaderLen;

//获得位图的头信息

bmfHeaderLen = sizeof(bmfHeader);

strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);

//根据获得的信息头判断是否是位图

if (bmfHeader.bfType != (*(WORD*)"BM")) return NULL;

//获取位图数据

hDIB = lpBuffer + bmfHeaderLen;

BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;

BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;

lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;  //偏移字节数

//创建位图

CClientDC dc(this);

hBmp = CreateDIBitmap(dc.m_hDC,&bmiHeader,

CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);

return hBmp;

}

void CEmpUpdateDlg::OnPaint() 

{

CPaintDC dc(this); // device context for painting

CStatic *pStaic = (CStatic*)GetDlgItem(IDC_PHOTO);//获取IDIDC_PHOTO控件的指针

CBitmap bmp; //定义位图变量

bmp.Attach(m_hPhotoBitmap);

BITMAP bm; //定义一个位图结构

bmp.GetBitmap(&bm);

CDC dcMem; 

dcMem.CreateCompatibleDC(GetDC()); //创建一个兼容的DC

CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(bmp); //将位图选入设备环境类

CRect lRect;      //定义一个区域

pStaic->GetClientRect(&lRect); //获取控件的客户区域

lRect.NormalizeRect(); 

pStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(), 

&dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY); //显示位图 

dcMem.SelectObject(&poldBitmap); //将原有的句柄选入设备环境

}

void CEmpUpdateDlg::OnMouseMove(UINT nFlags, CPoint point) 

{

CRect Rect; //定义一个区域

GetDlgItem(IDC_PHOTO)->GetWindowRect(&Rect);//获取区域

ScreenToClient(&Rect); //将屏幕坐标转换为客户坐标

if(Rect.PtInRect(point)) //如果在这个区域内

{

HCURSOR hCursor; 

hCursor = AfxGetApp() ->LoadCursor(IDC_HAND); 

SetCursor(hCursor); 

}

CDialog::OnMouseMove(nFlags, point);

}

4.职工查询的实现

void CEmpIndexDlg::OnRadio1()

{

m_nFlag = 1;

}

void CEmpIndexDlg::OnRadio2() 

{

m_nFlag = 2;

}

BOOL CEmpIndexDlg::OnInitDialog() 

{

CDialog::OnInitDialog();

m_Radio.SetCheck(1);

m_nFlag = 1;

return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

void CEmpIndexDlg::OnOK() 

{

UpdateData();

if(m_nFlag == 1)

{

if(m_strID == "")

{

MessageBox("请输入查询条件");

return ;

}

}

if(m_nFlag == 2)

{

if(m_strName == "")

{

MessageBox("请输入查询条件");

return ;

}

}

CDialog::OnOK();

}

5.考勤信息管理

BOOL CCheckInfoDlg::OnInitDialog() 

{

CDialog::OnInitDialog();

m_pRecordset.CreateInstance("ADODB.Recordset"); //创建记录集实例

m_ListCrtl.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT );//风格的设定。整行选择

m_ListCrtl.InsertColumn(0, "日期", LVCFMT_CENTER, 80);

m_ListCrtl.InsertColumn(1, "员工ID", LVCFMT_CENTER, 60);

m_ListCrtl.InsertColumn(2, "缺勤", LVCFMT_CENTER, 40);

m_ListCrtl.InsertColumn(3, "早退", LVCFMT_CENTER, 40);

m_ListCrtl.InsertColumn(4, "迟到", LVCFMT_CENTER, 40);

m_ListCrtl.InsertColumn(5, "休息", LVCFMT_CENTER, 40);

m_ListCrtl.InsertColumn(6, "病假", LVCFMT_CENTER, 40);

m_ListCrtl.InsertColumn(7, "出差", LVCFMT_CENTER, 40);

m_ListCrtl.InsertColumn(8, "事假", LVCFMT_CENTER, 40);

m_ListCrtl.InsertColumn(9, "备注", LVCFMT_CENTER, 120);

CString strSQL; //定义字符串变量

strSQL.Format("select * from checkinfo ");

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);//执行SQL语句

int i = 0;//定义整形变量并赋初值0

while(!m_pRecordset->adoEOF)//如果记录没有到末尾

{

m_ListCrtl.InsertItem(i, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)0))));

for(int j = 1; j < 9; j++)

m_ListCrtl.SetItemText(i, j, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)j))));

i++;

m_pRecordset->MoveNext();//移动到下一条记录

}

}

CATCH_ERROR;

return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

void CCheckInfoDlg::ShowListData(const CString& sql)

{

m_ListCrtl.DeleteAllItems();//删除列表控件中的所有子项

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)sql, NULL, adCmdText);//执行SQL语句

int i = 0;

while(!m_pRecordset->adoEOF)//如果记录没有到末尾

{

m_ListCrtl.InsertItem(i, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)0))));

//将数据插入到列表控件中

for(int j = 1; j < 9; j++)

m_ListCrtl.SetItemText(i, j, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)j))));

i++;

m_pRecordset->MoveNext();//移动到下一条记录

}

}

CATCH_ERROR;

}

void CCheckInfoDlg::OnIndex() 

{

UpdateData();

if(m_strID == "")

{

MessageBox("请出入查询条件!");

return ;

}

CString strSQL, strDate;//定义字符串变量

strDate.Format("%d-%d-%d", m_Date.GetYear(), m_Date.GetMonth(), m_Date.GetDay());

strSQL.Format("select * from checkinfo where id = %s and date = '%s'", m_strID, strDate);

ShowListData(strSQL);//

}

void CCheckInfoDlg::OnDel() 

{

if(m_strID == "")

{

MessageBox("请选择一条记录!");

return ;

}

if(MessageBox("确定删除吗?", "注意", MB_YESNO) == IDYES)

{

CString strSQL, strDate;

strDate.Format("%d-%d-%d", m_Date.GetYear(), m_Date.GetMonth(), m_Date.GetDay());

strSQL.Format("delete from checkinfo where id = %s and date = '%s'", m_strID, strDate);

try 

{

theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

ShowListData("select * from checkinfo");

}

CATCH_ERROR;

}

}

void CCheckInfoDlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) 

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

int nSelect = pNMListView->iItem;//获取列表控件中选中的行的索引

m_strID = m_ListCrtl.GetItemText(nSelect, 1);//获取列表控件选中行第二项的文本

CString strDate = m_ListCrtl.GetItemText(nSelect, 0);

COleVariant vtime(strDate);

vtime.ChangeType(VT_DATE);

COleDateTime time1=vtime;

SYSTEMTIME systime;

VariantTimeToSystemTime(time1, &systime);

CTime tm(systime); 

m_Date=tm;

UpdateData(FALSE);

*pResult = 0;

}

6.考勤管理

BOOL CCheckManageDlg::OnInitDialog() 

{

CDialog::OnInitDialog();

m_pRecordset.CreateInstance("ADODB.Recordset");

GetDlgItem(IDC_CHECK1)->EnableWindow(FALSE);//复选框处于没有选中

GetDlgItem(IDC_CHECK2)->EnableWindow(FALSE);

GetDlgItem(IDC_CHECK3)->EnableWindow(FALSE);

GetDlgItem(IDC_CHECK4)->EnableWindow(FALSE);

m_Radio.SetCheck(1); //单选按钮第一个为选中

return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

void CCheckManageDlg::OnRadio1() 

{

GetDlgItem(IDC_CHECK1)->EnableWindow(); //控件的禁用与恢复

GetDlgItem(IDC_CHECK2)->EnableWindow();

GetDlgItem(IDC_CHECK3)->EnableWindow(FALSE);

GetDlgItem(IDC_CHECK4)->EnableWindow(FALSE);

m_strState[0] = "";

m_strState[5] = "";

m_strState[3] = "";

GetDlgItem(IDC_OVERTIME)->EnableWindow();

m_nFlag = 1;

}

void CCheckManageDlg::OnRadio2() 

{

GetDlgItem(IDC_CHECK1)->EnableWindow(FALSE);

GetDlgItem(IDC_CHECK2)->EnableWindow(FALSE);

GetDlgItem(IDC_CHECK3)->EnableWindow();

GetDlgItem(IDC_CHECK4)->EnableWindow();

GetDlgItem(IDC_OVERTIME)->EnableWindow(FALSE);

m_strState[0] = "";

m_strState[5] = "";

m_strState[3] = "";

m_nFlag = 2;

}

void CCheckManageDlg::OnRadio3() 

{

m_strState[5] = "";

m_strState[0] = "";

m_strState[3] = "";

GetDlgItem(IDC_OVERTIME)->EnableWindow(FALSE);

}

void CCheckManageDlg::OnRadio4() 

{

m_strState[3] = "";

m_strState[5] = "";

m_strState[0] = "";

GetDlgItem(IDC_OVERTIME)->EnableWindow(FALSE);

}

void CCheckManageDlg::OnSure() 

{

UpdateData(); //数据的更新

if(m_strID == "") //条件的判断

{

MessageBox("请出入员工号!"); //信息的输出

return ;

}

CString strSQL; //定义字符串变量

_variant_t va;

strSQL.Format("select count(*) from emp  where [id] = %s", m_strID);

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

va = m_pRecordset->GetCollect(_variant_t((long)0));//获取记录集的结果

if(va.iVal == 0)

{

MessageBox("没有此员工!");

return ;

}

}

CATCH_ERROR;

CTime time = CTime::GetCurrentTime(); //获取当前的系统时间

CString strTime = time.Format("%Y-%m-%d");

CString strYM = time.Format("%Y-%m");

if(m_nFlag == 1) //标记的判断

{

if(m_Check1 == 1)

m_strState[2] = "";

else

m_strState[2] = "";

if(m_Check2 == 1)

m_strState[1] = "";

else

m_strState[1] = "";

}

if(m_nFlag == 2)

{

if(m_Check3 == 1)

m_strState[4] = "";

else

m_strState[4] = "";

if(m_Check4 == 1)

m_strState[6] = "";

else

m_strState[6] = "";

}

strSQL.Format("insert into checkinfo values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', 0, 0, 0)", 

strTime, m_strID, m_strState[0], m_strState[1], m_strState[2], m_strState[3], m_strState[4], m_strState[5], m_strState[6], m_strMore, strYM);

try

{

theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);//执行SQL语句

m_strID = "";

for(int i = 0; i < 7; i++)

m_strState[i] = "";

MessageBox("添加成功!");

}

CATCH_ERROR;

UpdateData(FALSE);

}

void CCheckManageDlg::OnOvertime() 

{

COverTimeDlg dlg; //定义对话框对象

UpdateData(); //数据的获取

if(dlg.DoModal() == IDOK) //如果点击确定按钮

{

CString strSQL; //定义字符串变量

CTime time = CTime::GetCurrentTime();//或当前系统的时间

CString strTime = time.Format("%Y-%m-%d");//将时间放到字符串中

switch(dlg.m_nType)

{

case 0:

strSQL.Format("update checkinfo set ot1 = %d where id = %s and date = '%s'", dlg.m_nHour, m_strID, strTime);

break;

case 1:

strSQL.Format("update checkinfo set ot2 = %d where id = %s and date = '%s'", dlg.m_nHour, m_strID, strTime);

break;

case 2:

strSQL.Format("update checkinfo set ot3 = %d where id = %s and date = '%s'", dlg.m_nHour, m_strID, strTime);

break;

}

try

{

theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);//执行SQL语句

}

CATCH_ERROR;

}

}

7.部门管理

BOOL CDepartManageDlg::OnInitDialog() 

{

CDialog::OnInitDialog();

m_pRecordset.CreateInstance("ADODB.Recordset");

ShowTreeData();

GetDlgItem(IDC_SAVE)->EnableWindow(FALSE);

return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

void CDepartManageDlg::ShowTreeData()

{

m_TreeCrtl.DeleteAllItems();

TVINSERTSTRUCT tvInsert;

tvInsert.hParent = NULL;

tvInsert.hInsertAfter = NULL;

tvInsert.item.mask = TVIF_TEXT;

tvInsert.item.pszText = _T("某单位");

m_hParent = m_TreeCrtl.InsertItem(&tvInsert);

_variant_t vName;

CString strSQL;

strSQL.Format("select [name] from dep");

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

while(!m_pRecordset->adoEOF)

{

vName = m_pRecordset->GetCollect(_variant_t((long)0));

m_TreeCrtl.InsertItem((char*)_bstr_t(vName), m_hParent);

m_pRecordset->MoveNext();

}

m_TreeCrtl.Expand(m_hParent,TVE_EXPAND);

}

CATCH_ERROR;

}

void CDepartManageDlg::OnDblclkTree1(NMHDR* pNMHDR, LRESULT* pResult) 

{

_variant_t va;

HTREEITEM hSelect;

hSelect = m_TreeCrtl.GetSelectedItem();

CString strName;

if(hSelect != m_hParent)

{

strName = m_TreeCrtl.GetItemText(hSelect);

CString strSQL;

strSQL.Format("select * from dep where name = '%s'", strName);

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

va = m_pRecordset->GetCollect(_variant_t((long)0));

m_nID = va.iVal;

m_strName = (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)1)));

m_strManager = (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)2)));

m_strPhone = (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)3)));

m_strMore = (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)4)));

}

CATCH_ERROR;

}

UpdateData(FALSE);

*pResult = 0;

}

void CDepartManageDlg::OnAdd() 

{

m_strMore = m_strName = m_strManager = m_strPhone = "";

m_nSelect = 1;

GetDlgItem(IDC_SAVE)->EnableWindow();

UpdateData(FALSE);

}

void CDepartManageDlg::OnUpdate() 

{

m_nSelect = 2;

GetDlgItem(IDC_SAVE)->EnableWindow();

}

void CDepartManageDlg::OnSave() 

{

UpdateData();

if(m_strName == "")

{

MessageBox("名称不能为空!");

return ;

}

CString strSQL;

if(m_nSelect == 1)

{

strSQL.Format("insert into dep (name, manager, phone, more) values ('%s', '%s', '%s', '%s')", 

m_strName, m_strManager, m_strPhone, m_strMore);

try

{

theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

ShowTreeData();

MessageBox("添加成功");

}

CATCH_ERROR;

}

if(m_nSelect == 2)

{

strSQL.Format("update dep set name = '%s', manager = '%s', phone = '%s', more = '%s' where id = %d",

m_strName, m_strManager, m_strPhone, m_strMore, m_nID);

try

{

theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

ShowTreeData();

MessageBox("修改成功");

}

CATCH_ERROR;

}

GetDlgItem(IDC_SAVE)->EnableWindow(FALSE);

}

void CDepartManageDlg::OnDel() 

{

UpdateData();

if(m_strName == "")

{

MessageBox("请选择一个部门!");

return ;

}

CString strSQL;

strSQL.Format("delete from dep where id = %d", m_nID);

if(MessageBox("确定删除吗?", "注意", MB_YESNO) == IDYES)

{

try

{

theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

ShowTreeData();

}

CATCH_ERROR;

}

}

8.工资基本信息管理

BOOL CWageManageDlg::OnInitDialog() 

{

CDialog::OnInitDialog();

m_pRecordset.CreateInstance("ADODB.Recordset");

ShowTreeData();

m_ListCrtl.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT );//风格的设定

m_ListCrtl.InsertColumn(0, "员工ID", LVCFMT_CENTER, 60);//列标题的设定

m_ListCrtl.InsertColumn(1, "月薪", LVCFMT_CENTER, 60);

m_ListCrtl.InsertColumn(2, "部门", LVCFMT_CENTER, 100);

m_ListCrtl.InsertColumn(3, "进入时间", LVCFMT_CENTER, 100);

GetDlgItem(IDC_SAVE)->EnableWindow(FALSE);//控件的禁用

CString strSQL;//定义字符串变量

strSQL.Format("select name from dep");

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

while(!m_pRecordset->adoEOF)//记录没有到末尾

{

m_Depart.AddString((char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)0))));

m_pRecordset->MoveNext();//移动到下条记录

}

}

CATCH_ERROR;

m_Depart.SetCurSel(0);

ShowListData("select * from wageinfo");

return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

void CWageManageDlg::ShowTreeData()

{

m_TreeCrtl.DeleteAllItems();

HTREEITEM hItem;

TVINSERTSTRUCT tvInsert;

tvInsert.hParent = NULL;

tvInsert.hInsertAfter = NULL;

tvInsert.item.mask = TVIF_TEXT;

tvInsert.item.pszText = _T("某单位");

m_hParent = m_TreeCrtl.InsertItem(&tvInsert);

_variant_t vName;

CString strSQL;

strSQL.Format("select [name] from dep");

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

while(!m_pRecordset->adoEOF)

{

vName = m_pRecordset->GetCollect(_variant_t((long)0));

hItem = m_TreeCrtl.InsertItem((char*)_bstr_t(vName), m_hParent);

strSQL.Format("select name from emp");

m_pRecordset1 = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

while(!m_pRecordset1->adoEOF)

{

vName = m_pRecordset1->GetCollect(_variant_t((long)0));

m_TreeCrtl.InsertItem((char*)_bstr_t(vName), hItem);

m_pRecordset1->MoveNext();

}

m_pRecordset->MoveNext();

}

m_TreeCrtl.Expand(m_hParent,TVE_EXPAND);

}

CATCH_ERROR;

}

void CWageManageDlg::ShowListData(const CString& sql)

{

m_ListCrtl.DeleteAllItems();

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)sql, NULL, adCmdText);

int i = 0;

while(!m_pRecordset->adoEOF)

{

m_ListCrtl.InsertItem(i, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)0))));

m_ListCrtl.SetItemText(i, 1, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)1))));

m_ListCrtl.SetItemText(i, 2, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)2))));

m_ListCrtl.SetItemText(i, 3, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)3))));

i++;

m_pRecordset->MoveNext();

}

}

CATCH_ERROR;

}

void CWageManageDlg::OnDblclkTree1(NMHDR* pNMHDR, LRESULT* pResult) 

{

_variant_t va;

CString strSQL;

HTREEITEM hSelect;

hSelect = m_TreeCrtl.GetSelectedItem();

CString strName;

if(hSelect != m_hParent)

{

strName = m_TreeCrtl.GetItemText(hSelect);

if(m_TreeCrtl.GetParentItem(hSelect) == m_hParent)

{

strSQL.Format("select * from wageinfo where dep = '%s'", strName);

ShowListData(strSQL);

}

}

*pResult = 0;

}

void CWageManageDlg::OnAdd() 

{

m_strID = "";

m_nFlag = 1; //标记的设定

m_nWage = 0;

GetDlgItem(IDC_SAVE)->EnableWindow();//控件的恢复

UpdateData(FALSE);

}

void CWageManageDlg::OnUpdate() 

{

UpdateData();

if(m_strID == "")

{

MessageBox("请选择一条记录!");

return ;

}

GetDlgItem(IDC_SAVE)->EnableWindow(); //控件的恢复

m_nFlag = 2; //标记的设定

}

void CWageManageDlg::OnSave() 

{

UpdateData(); //数据的更新

if(m_strID == "")

{

MessageBox("ID不能为空!");

return ;

}

CString strSQL, strDep, strDate;//定义字符串变量

_variant_t va;

strSQL.Format("select count(*) from emp  where [id] = %s", m_strID);

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

va = m_pRecordset->GetCollect(_variant_t((long)0));//获取记录的值

if(va.iVal == 0)

{

MessageBox("没有此员工!");

return ;

}

}

CATCH_ERROR;

int nIndex = m_Depart.GetCurSel();//获取选中的索引

m_Depart.GetLBText(nIndex, strDep);//获取选中的文本

strDate.Format("%d-%d-%d", m_Date.GetYear(), m_Date.GetMonth(), m_Date.GetDay());

if(m_nFlag == 1)//插入操作

{

strSQL.Format("insert into wageinfo values(%s, %d, '%s', '%s')",

m_strID, m_nWage, strDep, strDate);

}

if(m_nFlag == 2)//修改操作

{

strSQL.Format("update wageinfo set wage = %d, date = '%s' where id = %s", m_nWage, strDate, m_strID);

}

try

{

theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

GetDlgItem(IDC_SAVE)->EnableWindow(FALSE);//控件的禁用

m_strID = "";

m_nFlag = -1;

m_nWage = 0;

MessageBox("操作成功!");

ShowListData("select * from wageinfo");

ShowTreeData();

}

CATCH_ERROR;

UpdateData(FALSE);

}

void CWageManageDlg::OnDel() 

{

UpdateData(); //数据的更新

if(m_strID == "")

{

MessageBox("请选择一条记录!");

return ;

}

if(MessageBox("确定删除吗?", "注意", MB_YESNO) == IDYES)

{

CString strSQL; //定义字符串变量

strSQL.Format("delete wageinfo where id = '%s'", m_strID);

try

{

theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

MessageBox("删除成功!");

ShowTreeData();

ShowListData("select * from wageinfo");

}

CATCH_ERROR;

}

}

void CWageManageDlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) 

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

int nSelect = pNMListView->iItem;

m_strID = m_ListCrtl.GetItemText(nSelect, 0);

m_nWage = atoi(m_ListCrtl.GetItemText(nSelect, 1));

GetDlgItem(IDC_COMBO1)->SetWindowText(m_ListCrtl.GetItemText(nSelect, 2));

CString strDate = m_ListCrtl.GetItemText(nSelect, 3);

COleVariant vtime(strDate);

vtime.ChangeType(VT_DATE);

COleDateTime time1=vtime;

SYSTEMTIME systime;

VariantTimeToSystemTime(time1, &systime);

CTime tm(systime);

m_Date   =   tm;  

UpdateData(FALSE);

*pResult = 0;

}

void CWageManageDlg::OnIndex() 

{

UpdateData();

CString strSQL, strDate;

strDate.Format("%d-%d-%d", m_Date.GetYear(), m_Date.GetMonth(), m_Date.GetDay());

strSQL.Format("select * from wageinfo where id like '%%%s%%' and wage like '%%%d%%' and date like '%%%s%%'",

m_strID, m_nWage, strDate);

ShowListData(strSQL);

}

9.工资计算公式

BOOL CWageCalDlg::OnInitDialog() 

{

CDialog::OnInitDialog();

m_pRecordset.CreateInstance("ADODB.Recordset");

CString strSQL; //定义字符串变量

strSQL.Format("select * from wagecal");

_variant_t va;

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

va = m_pRecordset->GetCollect(_variant_t((long)0));//获取记录集中第一列的数据

m_chuchai = va.iVal;

va = m_pRecordset->GetCollect(_variant_t((long)1));

m_bingjia = va.iVal;

va = m_pRecordset->GetCollect(_variant_t((long)2));

m_shijia = va.iVal;

va = m_pRecordset->GetCollect(_variant_t((long)3));

m_pingshi = va.iVal;

va = m_pRecordset->GetCollect(_variant_t((long)4));

m_shuangxiu = va.iVal;

va = m_pRecordset->GetCollect(_variant_t((long)5));

m_fading = va.iVal;

}

CATCH_ERROR;

UpdateData(FALSE);//数据的更新

return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

void CWageCalDlg::OnSure() 

{

UpdateData(); //数据的更新

CString strSQL; //定义字符串变量

strSQL.Format("update wagecal set chuchai = %d, bingjia = %d, shijia = %d, pingshi = %d, shuangxiu = %d, fading = %d", 

m_chuchai, m_bingjia, m_shijia, m_pingshi, m_shuangxiu, m_fading);

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

MessageBox("设置成功!");//执行SQL语句

}

CATCH_ERROR;

}

9.员工工资统计

BOOL CWageDlg::OnInitDialog() 

{

CDialog::OnInitDialog();

m_pRecordset.CreateInstance("ADODB.Recordset");

m_pRecordset1.CreateInstance("ADODB.Recordset");

m_ListCrtl.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT );//风格的设定。整行选择

m_ListCrtl.InsertColumn(0, "员工ID", LVCFMT_CENTER, 60);

m_ListCrtl.InsertColumn(1, "月薪()", LVCFMT_CENTER, 60);

m_ListCrtl.InsertColumn(2, "月份", LVCFMT_CENTER, 60);

m_ListCrtl.InsertColumn(3, "出差()", LVCFMT_CENTER, 60);

m_ListCrtl.InsertColumn(4, "病假()", LVCFMT_CENTER, 60);

m_ListCrtl.InsertColumn(5, "事假()", LVCFMT_CENTER, 60);

m_ListCrtl.InsertColumn(6, "平时加班(小时)", LVCFMT_CENTER, 100);

m_ListCrtl.InsertColumn(7, "双休日加班(小时)", LVCFMT_CENTER, 120);

m_ListCrtl.InsertColumn(8, "法定假日加班(小时)", LVCFMT_CENTER, 120);

m_ListCrtl.InsertColumn(9, "应发工资()", LVCFMT_CENTER, 100);

CString strSQL; //创建临时表

strSQL.Format("create table temp (id int, wage int, ym varchar(20), chuchai int, bingjia int, shijia int, pingshi int, shuangxiu int, fading int, waged int)");

try

{

theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

}

catch(...)

{

strSQL.Format("drop table temp");

theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

strSQL.Format("create table temp (id int, wage int, ym varchar(20), chuchai int, bingjia int, shijia int, pingshi int, shuangxiu int, fading int, waged int)");

theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

}

try//临时表中添加数据

{

CString SQL[9];

strSQL = "insert into temp (id) select id from emp ;";

//从员工表中读取员工ID

SQL[0] = "update temp set wage = 0, ym = 2008-01, chuchai = 0, bingjia = 0, shijia = 0, pingshi = 0, shuangxiu = 0, fading = 0, waged = 0;";

//月薪的更新

SQL[1] = "update temp set wage = wageinfo.wage from wageinfo where temp.id = wageinfo.id;";

//从考勤表中读取月份

SQL[2] = "update temp set ym = checkinfo.ym from checkinfo where temp.id = checkinfo.id;";

//根据月份从考勤表中统计考勤信息。

SQL[3] = "update temp set chuchai = (select count(*) from checkinfo where temp.ym = checkinfo.ym and checkinfo.chuchai = '' and temp.id = checkinfo.id);";

SQL[4] = "update temp set bingjia = (select count(*) from checkinfo where temp.ym = checkinfo.ym and checkinfo.bingjia = '' and temp.id = checkinfo.id);";

SQL[5] = "update temp set shijia = (select count(*) from checkinfo where temp.ym = checkinfo.ym and checkinfo.shijia = '' and temp.id = checkinfo.id);";

SQL[6] = "update temp set pingshi = (select sum(ot1) from checkinfo where temp.ym = checkinfo.ym and temp.id = checkinfo.id) ;";

SQL[7] = "update temp set shuangxiu = (select sum(ot2) from checkinfo where temp.ym = checkinfo.ym and temp.id = checkinfo.id) ;";

SQL[8] = "update temp set fading = (select sum(ot3) from checkinfo where temp.ym = checkinfo.ym and temp.id = checkinfo.id) ;";

for(int i = 0; i < 9; i++)

strSQL += SQL[i];

theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

}

CATCH_ERROR;

float chuchai, bingjia, shijia, pingshi, shuangxiu, fading; //读取工资的计算公式

_variant_t va;

strSQL = "select * from wagecal";

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

va = m_pRecordset->GetCollect(_variant_t((long)0));

chuchai = va.iVal;

va = m_pRecordset->GetCollect(_variant_t((long)1));

bingjia = va.iVal;

va = m_pRecordset->GetCollect(_variant_t((long)2));

shijia = va.iVal;

va = m_pRecordset->GetCollect(_variant_t((long)3));

pingshi = va.iVal;

va = m_pRecordset->GetCollect(_variant_t((long)4));

shuangxiu = va.iVal;

va = m_pRecordset->GetCollect(_variant_t((long)5));

fading = va.iVal;

}

CATCH_ERROR;

strSQL.Format("update temp set waged = (wage / 23 * chuchai * %f / 100 + wage / 23 * bingjia * %f / 100 + wage / 23 * shijia * %f / 100 + wage / 23 / 8 * pingshi * %f / 100 + wage / 23 / 8 * shuangxiu * %f / 100 + wage / 23 / 8 * fading * %f / 100 + wage / 23 * (23 - chuchai - bingjia - shijia))",

chuchai, bingjia, shijia, pingshi, shuangxiu, fading);

try//计算员工的工资

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

}

CATCH_ERROR;

strSQL = "select * from temp";//temp表中查询数据填充在list

ShowListData(strSQL);

strSQL = "select ym from temp group by ym";//填充月份combobox

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);

while(!m_pRecordset->adoEOF)

{

m_Month.AddString((char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)0))));

m_pRecordset->MoveNext();

}

}

CATCH_ERROR;

m_Month.SetCurSel(0);

return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

void CWageDlg::ShowListData(const CString& sql)

{

m_ListCrtl.DeleteAllItems();

try

{

m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)sql, NULL, adCmdText);

int i = 0;

while(!m_pRecordset->adoEOF)

{

m_ListCrtl.InsertItem(i, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)0))));

for(int j = 1; j < 10; j++)

{

m_ListCrtl.SetItemText(i, j, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)j))));

}

i++;

m_pRecordset->MoveNext();

}

}

CATCH_ERROR;

}

void CWageDlg::OnButton1() 

{

UpdateData(); //数据的更新呢

CString strSQL, strMonth;

int nIndex = m_Month.GetCurSel();//月份的获取

m_Month.GetLBText(nIndex, strMonth);

strSQL.Format("select * from temp where id = %s and ym = '%s'", m_strID, strMonth);

ShowListData(strSQL);

}

10.数据库还原

void CBackupDlg::OnButton1() 

{

CFileDialog FileDlg(false, "bak", ".bak", OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY, "数据库文件(*.bak)|*.bak|"); 

if(IDOK != FileDlg.DoModal()) //打开打开文件对话框

return ;

}

m_strPath = FileDlg.GetPathName(); //获取选择文件的路径

UpdateData(FALSE); //数据的更新

}

void CBackupDlg::OnBackup() 

{

UpdateData(); //数据的更新

if(m_strPath == "") //条件的判断

{

MessageBox("请选择路径!"); //提示信息

return ;

}

_ConnectionPtr pConnection;

try

{

HRESULT hr = pConnection.CreateInstance("ADODB.Connection");//创建Connection对象

pConnection->Open("driver={SQL Server};Server=HC\\MSSQL2008;DATABASE=master;","","",adModeUnknown);

//pConnection->Open("driver={SQL Server};Server=HC\\MSSQL2008;DATABASE=master;UID=sa; PWD=","","",adModeUnknown);

//连接数据库

CString sql; //定义字符串变量

sql.Format("Backup Database HMSys to Disk = '%s' ", m_strPath);

pConnection->Execute((_bstr_t)sql, NULL, adCmdText);//执行SQL语句

MessageBox("备份成功!");

pConnection->Close(); //关闭连接

}

CATCH_ERROR;

}

点歌系统实验

过程:

1.本系统前端开发工具采用Visual C++6.0,后台数据库系统采用大型数据库系统SQL Server2005,系统的运行平台为Windows,开发的系统在管理员的操作部分能实现歌曲的添加、删除,歌手的添加删除以及歌手信息的修改,设置房间的价格、会员卡的折扣等,在用户操作部分能实现根据歌手地区、性别、歌手的拼音、歌曲名字数、歌曲类别查询,可以查看或编辑播放列表,也可以删除单首歌曲,还可以根据自己的喜好选择播放模式,本系统设计了结账模块,并提供打印、注销用户、用户消费具体信息等功能

2.数据库、表的设计:本系统数据库名为music,数据库中包括5个表,admin表、musiclist表、singer表和临时用户表usertemp及播放歌曲列表playlist,利用SQL语句动态创建数据库表,然后为数据库表添加关系图

3.系统框架界面的设计:工程类型选择给予对话框风格,分别插入一个列表控件和4个单选按钮,设置好第一个按钮属性,再插入播放控件按钮和点哥按钮,最后插入Windows Media Player控件,现在重要介绍插入Windows Media Player的过程:选择【Project|Add to Project|Components and Controls】命令,从弹出的对话框中选择【Registered ActiveX Controls】目录,查找并添加【Windows Media Player】控件到工程,并将控件与CMediaPlayer2类对象建立关联,如果在程序中控制媒体的播放,可以使用该对象的Play()、Stop()、Pause()、SetCurrentPosition()、GetVolume()完成播放、停止、暂停、快进、快退、音量等相应动作,在初始化函数中对以上控件进行初始化

4.歌曲选择设计:添加对话框,完成对对话框的布局,包括根据歌手查询、根据歌曲类别查询、根据拼音查询,添加开户点歌对话框,包括房间类型(小包间、大包间、中包间、豪华包间)、会员卡类型(非会员、一般会员、中级会员、高级会员)、预付金额等等,实现代码见源程序。

5.播放控制模块功能分析:在主界面中添加以下按钮:上一首、下一首、增加音量、减小音量、快进、快退、暂停、停止按钮,本系统是基于对话框风格的,所以没有IDR_MAINFRAME,所以新建一个菜单,选择【Insert|Resourse】命令,打开资源对话框,在其中MENU选项,添加菜单添加OnClickList2()函数,实现右键菜单的弹出,根据需要选择需要执行的选项

1.后台模块设计:本系统定义一个保存MP3信息的结构体,分析MP3数据可知,最后一字节描述Genre(流派),倒数2~31字节是描述Comment(注释,评论),倒数32~35字节是描述Year,据此向前推30字节是描述Album,再向前推30字节是描述Artist等等,后台模块界面包括歌曲和歌手的操作界面、歌曲信息获取界面、费率设定界面、管理员密码修改界面等

2.上机调试程序,查看结果,调试结果是否符合自己的预期效果

结果:1.进入系统界面后,界面分成4个区域,左上区是播放窗口区域,可以实现对音频、视频文件的播放,右边是选歌和系统管理功能模块操作区,可以根据各种方式选歌,可以对系统进行设置,右下区是播放控制区域,实现对播放音量、播放速度、播放模式等控制

2.在点歌界面上,用户单击【按歌手查询】按钮,显示按歌手查询界面,通过改变组合框中歌手类别,在列表控件中显示该类别的所有歌手,选中某一个歌手,上机该选项会在列表中显示该歌手的所有歌曲,如果选中某一个歌手,双击该选项后显示界面,该歌手的歌曲,双击某一首歌曲,该歌曲会添加到主界面播放列表中,通过单击【返回上一级】按钮,可以回到歌手表界面

3.在点歌界面上,用户单击【按拼音查询】按钮,显示按拼音查询界面,通过输入拼音,在列表控件中显示歌手姓中以该拼音开头的所有歌手,在列表破控件中选中某一歌手,双击该选项后会在列表控件中显示该歌手的所有歌曲,双击某一歌曲,该歌曲会添加到主界面的播放列表中

4.在点歌界面上,用户单击【按歌曲类别查询】按钮,显示按歌曲类别查询界面,通过改变组合框中的歌曲类型,在列表控件中显示该类别的所有歌曲,双击某一歌曲,该歌曲会添加到主界面的播放列表中

5.在主界面上单击【管理员设置】按钮,输入正确的管理员密码后,显示管理界面,通过该界面实现歌曲添加、删除歌曲、添加歌手、删除歌手、修改歌手信息及设置费率操作

6.在点歌主界面上单击【结账】按钮,弹出【打印账单】对话框,该界面可以显示消费的时间范围、包括类型、会员级别、及消费金额单击【确认收账】按钮,则完成结账操作,如果用户需要消费小票,可以单击【打印预览】按钮,打开【打印预览】窗口显示结账i型昂系并打印出小票

疑难

1.插入Windows Media Player的过程与此将控件与CMediaPlayer2类对象建立关联的过程如果在程序中控制媒体的播放过程中函数的添加

2.数据库表包括了的字段和关系表的关系图

3.实现.根据歌手查询歌曲、根据歌曲类别查询歌曲、根据拼音查询歌曲功能

4.实现管理员设置功能:输入正确的管理员密码后,显示管理界面,通过该界面实现歌曲添加、删除歌曲、添加歌手、删除歌手、修改歌手信息及设置费率操作

5.结账时,完成结账操作,如果用户需要消费小票,打印出小票的打印功能的实现

1.系统框架界面的设计代码

BOOL CHCOKDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// Set the icon for this dialog.  The framework does this automatically

//  when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

//***********初始化窗体指针***********************//

seleceddlg  =  NULL ; //已点歌曲

bysingerdlg = NULL;  //按歌手查询

bypinyindlg = NULL;   //按拼音查询 

bynumdlg =NULL;       //按歌曲名字数查询

bysongtypedlg = NULL;  //按歌曲类别查询

//**************************************************///

m_text="点歌系统";            //m_text:字符串对应的值变量 

m_textctrl.SetFontSize(27);

m_textctrl.SetTextColor(RGB(0,255,0));

m_textctrl.SetBkColor(RGB(247,247,247));

m_textctrl.SetFontBold(TRUE);

m_textctrl.SetText(m_text);

m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);

m_list.InsertColumn(0,"序号",LVCFMT_CENTER,140);

m_list.InsertColumn(1,"节目名称",LVCFMT_CENTER,140);

m_list.InsertColumn(2,"歌手",LVCFMT_CENTER,140);

m_list.InsertColumn(3,"歌曲类别",LVCFMT_CENTER,140);

m_list.InsertColumn(4,"文件名",LVCFMT_CENTER,140);

m_list.InsertColumn(5,"文件格式",LVCFMT_CENTER,140);    

///////////////////////////////////////////////////////////////

timenum=-1;     //开始让时间无效

SetTimer(1,1000,NULL);   //设定定时器

row=0;    //初始化在第一行

m_list.SetItemState(row,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);

m_list.SetFocus();     //设定list控件的焦点  

/////////////////////////////////////

/////////////////////////////////////////////////////////////临时表操作语句

   

_bstr_t createlistsql,  createsql;

ADOConn m_AdoConn;

createsql = "Create table usertemp(tmuname varchar(50),tformate varchar(50),tfilename varchar(50),tsongtype varchar(50),tsingername varchar(50),tsingerpin varchar(50),playpath  varchar(200))"; 

createlistsql = "Create table playlist(tmuname varchar(50),tformate varchar(50),tfilename varchar(50),tsongtype varchar(50),tsingername varchar(50),tsingerpin varchar(50),playpath  varchar(200))";   

m_AdoConn.ExecuteSQL(createsql);///创建usertemp表用于存放用户点的歌      在程序关闭时删除

m_AdoConn.ExecuteSQL(createlistsql);//创建playlist表用于存放用户正在播放的歌  在程序关闭时删除

//***********************禁用相应按键*******************************************//

GetDlgItem(IDC_PREVIOUS)->EnableWindow(false);

   GetDlgItem(IDC_NEXT)->EnableWindow(false);

   GetDlgItem(IDC_VOLUP)->EnableWindow(false);

   GetDlgItem(IDC_VOLDOWN)->EnableWindow(false);

   GetDlgItem(IDC_QIUC)->EnableWindow(false);

   GetDlgItem(IDC_QBACK)->EnableWindow(false);

   GetDlgItem(IDC_PLAYPAUSE)->EnableWindow(false);

   

   

   GetDlgItem(IDC_STOP)->EnableWindow(false);

   GetDlgItem(IDC_SELECTED)->EnableWindow(false);

   GetDlgItem(IDC_DELLIST)->EnableWindow(false);

   GetDlgItem(IDC_SINFIND)->EnableWindow(false);

   GetDlgItem(IDC_PYFIND)->EnableWindow(false);

   GetDlgItem(IDC_NUFIND)->EnableWindow(false);

   GetDlgItem(IDC_TFIND)->EnableWindow(false);

   

   //************************************************************//

   ShowListDate();//显示数据

   // TODO: Add extra initialization here

   /////////////////////////////////////////////////////////设置默认播放方式

   mode=3;

   ((CButton *)GetDlgItem(IDC_RADIOdx))->SetCheck(false);  //控制播放模式的

   ((CButton *)GetDlgItem(IDC_RADIOdb))->SetCheck(false);

   ((CButton *)GetDlgItem(IDC_RADIOxb))->SetCheck(false);

   ((CButton *)GetDlgItem(IDC_RADIOlx))->SetCheck(true);/////////////循环播放列表

   return TRUE;  // return TRUE  unless you set the focus to a control

}

2.根据歌手查询歌曲

BOOL BYSGRDLG::OnInitDialog() 

{

CDialog::OnInitDialog();

//*************初始化combo************//

m_combo.InsertString(0,"大陆男歌手");

m_combo.InsertString(1,"大陆女歌手");

m_combo.InsertString(2,"香港男歌手");

m_combo.InsertString(3,"香港女歌手");

m_combo.InsertString(4,"台湾男歌手");

m_combo.InsertString(5,"台湾女歌手");

m_combo.InsertString(6,"日韩男歌手");

m_combo.InsertString(7,"日韩女歌手");

    m_combo.InsertString(8,"欧美男歌手");

m_combo.InsertString(9,"欧美女歌手");

    m_combo.InsertString(10,"其他歌手");

m_combo.SetCurSel(0);    

//*************初始化list************//

    m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);

m_list.InsertColumn(0,"序号",LVCFMT_CENTER,100);

m_list.InsertColumn(1,"歌手名",LVCFMT_CENTER,270);

k=2;  //用于判断菜单级数

SetTimer(1,5000,NULL); //设定定时器用于更新用户操作反馈

ShowDate();

    GetDlgItem(IDC_INFOR)->SetWindowText("请双击鼠标左键选择需点播歌!");

return TRUE; 

}

void BYSGRDLG::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) //的到list控件的值,OnDblclkList1中得到值更好

                                                                  //m_list.GetItemText(m_list.GetSelectionMark(),1);//得到列表中第二列的值

{                                                                 //在按拼音查询时用的那种方法

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

  int selectrow=pNMListView->iItem;   //得到选择的列

     addsingerna=m_list.GetItemText(selectrow,1);//得到第二列的值,addsingerna不仅代表歌手名,还有歌曲名

     if(k==2)       // 显示的是歌手名,保留歌手名,在返回时待用

{

 remenber=addsingerna;

}

    UpdateData(false);

*pResult = 0;

}

void BYSGRDLG::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) 

////////////////////////鼠标双击,进入下一级菜单

{

mainshowlist++;

k--;      //鼠表的级数变化

if (k<0)   //如果点多了

k=0;

    ShowDate() ;   //刷新数据

GetDlgItem(IDC_UP)->EnableWindow(true);

*pResult = 0;

}

//*******************自定义显示函数*************************************//

void BYSGRDLG::ShowDate()    

{

switch(k)     

{

case 0:  addsong();break;//执行添加歌曲到用户临时表

case 1:  showsong();break;//显示歌曲在表中

case 2:  showsinger(); break;//显示歌手函数

default:  MessageBox("错误!");break;

}

}

//********************执行添加歌曲到用户临时表**********************************************//

void BYSGRDLG::addsong()

{

ADOConn m_AdoConn;   //创建数据库操作对象

m_AdoConn.OnInitADOConn();  //创建链接

_RecordsetPtr m_pRecordset;   //定义记录集指针

_bstr_t sql;

sql = "select*from musiclist where muname='"+addsingerna+"' ";//定义SQL语句

    m_pRecordset=m_AdoConn.GetRecordSet(sql); //得到记录集

if(m_pRecordset->adoEOF)    //如果歌库中没有该条歌曲记录跳出

   {

m_AdoConn.ExitConnect();//断开链接并关闭记录集

return;

   }

//添加歌曲到临时表

   sql = "select* from usertemp where tmuname='"+addsingerna+"'\

   and tsingername = '"+remenber+"'";//查出用户表中歌名和歌手相符的记录集

   m_pRecordset=m_AdoConn.GetRecordSet(sql); //得到符合要求的记录集

   if(!m_pRecordset->adoEOF)    //如果该歌曲已经存在,则跳出添加歌曲

   {

   GetDlgItem(IDC_INFOR)->SetWindowText("该歌曲您已经点播过!");

   return;

   }

   else

   {  //如果该歌曲不存在,定义数据库复制语句,添加到usertemp

  sql = "insert into usertemp(tmuname,tformate,tfilename,tsongtype,tsingername,playpath) select  muname,format,fname,mtpye,singernam,path from musiclist where muname ='"+addsingerna+"'and singernam = '"+remenber+"' ";

  m_AdoConn.ExecuteSQL(sql );//执行

  //*********添加到播放临时表************//

  //定义数据库复制语句,添加到playlist

  sql = "insert into playlist(tmuname,tformate,tfilename,tsongtype,tsingername,playpath) select  muname,format,fname,mtpye,singernam,path from musiclist  where muname ='"+addsingerna+"'and singernam = '"+remenber+"' ";

  m_AdoConn.ExecuteSQL(sql );//执行

  GetDlgItem(IDC_INFOR)->SetWindowText("点播歌曲 "+addsingerna+" 成功!");//点播成功

   }

   m_AdoConn.ExitConnect();//释放数据库资源

   mainshowlist++;

   GetDlgItem(IDC_INFOR)->SetWindowText("点播歌曲 "+addsingerna+" 成功!");

}

//***************************显示歌曲在表中*****************************************************//

void BYSGRDLG::showsong()

{

   CString songid,  songname;

   //清除以前的显示,重新初始化list

   m_list.DeleteAllItems(); //解决显示上次列名问题

   m_list.DeleteColumn(0);

   m_list.DeleteColumn(0);

   m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);

   m_list.InsertColumn(0,"序号",LVCFMT_CENTER,100);

   m_list.InsertColumn(1,"歌曲名",LVCFMT_CENTER,270);

   ADOConn m_AdoConn;    //创建数据库操作对象

   m_AdoConn.OnInitADOConn(); //创建数据库链接

   _bstr_t sql;

   _RecordsetPtr m_pRecordset;  //记录集指针

   sql = "select*from musiclist where singernam ='"+remenber+"'"; //定义查询改歌手歌曲的语句

   m_pRecordset=m_AdoConn.GetRecordSet(sql);  //得到记录集

   if(m_pRecordset->adoEOF)  //如果没有歌曲

   {

   m_AdoConn.ExitConnect();  //释放数据库资源

   return;

   }

   

   int t=0;    //list的序列号

   while(!m_pRecordset->adoEOF)  //遍历记录集

   {int b=t+1;

   songid.Format("%d",b); //转换类型

   songname =m_pRecordset->GetFields()->GetItem("muname")->Value.bstrVal;//得到歌曲名

   m_list.InsertItem(t,songid);     //list中插值

   m_list.SetItemText(t,1, songname);

   m_pRecordset->MoveNext();   //移到下调记录

   t++;

   }

   

   m_AdoConn.ExitConnect();  //释放数据库资源

}

//*********************显示歌手函数********************************************//

void BYSGRDLG::showsinger()

{

//*****************初始化列表*************************//

m_list.DeleteAllItems(); 

m_list.DeleteColumn(0);//解决显示上次列名问题

m_list.DeleteColumn(1);

m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);

m_list.InsertColumn(0,"序号",LVCFMT_CENTER,100);

m_list.InsertColumn(1,"歌手名",LVCFMT_CENTER,270);

int L=m_combo.GetCurSel();

m_combo.GetLBText(L,singarea);  //得到combo的值

   ADOConn m_AdoConn;     //创建数据库对象

   m_AdoConn.OnInitADOConn();  //建立连接

   _bstr_t sql;

   _RecordsetPtr m_pRecordset;   //定义记录集指针

   CString  id, //序列号

   singernameby, //歌手名

   sex;//性别

   if(singarea=="其他歌手")

   {

   singarea=singarea.Left(4);   //截取得到'其他'

   sql = "select*from singer where sinarea ='"+singarea+"'";  //查找地区为'其他'的歌手

   }

   else

   {

   sex=singarea.Right (6);  //得到'性别+歌手'

   singarea=singarea.Left(singarea.GetLength()-6);   //得到地区

   sql = "select*from singer where sinarea ='"+singarea+"'and sinsex='"+sex+"'";//根据性别和地区查找

   }

   m_pRecordset=m_AdoConn.GetRecordSet(sql);   //得到记录集

   if(m_pRecordset->adoEOF) //如果不存在

   {

   m_AdoConn.ExitConnect();  //释放数据库资源

   return;   //跳出函数

   }

   int t=0;    //list的序列号

   while(!m_pRecordset->adoEOF)  //遍历记录集

   {

   int b=t+1;

   id.Format("%d",b);

   singernameby =m_pRecordset->GetFields()->GetItem("sinnam")->Value.bstrVal;//得到歌手名

   

   m_list.InsertItem(t,id);  //显示在list控件

   m_list.SetItemText(t,1,singernameby); //显示歌手姓名

   m_pRecordset->MoveNext();

   t++;

   }

   m_AdoConn.ExitConnect();  //释放数据库资源    

}

//*****************点击后显示歌手列表,k=2*************************************//

void BYSGRDLG::OnSelchangeCombo2() 

{

     k=2;   //显示歌手

ShowDate() ;

}

//*********************返回上级菜单**********************************//

void BYSGRDLG::OnUp() 

{

  k++;//菜单级数变化

 if(k>2)  //超出显示级数

 {k=2;  GetDlgItem(IDC_UP)->EnableWindow(FALSE);}  //禁用返回键

  ShowDate() ; //显示数据

}

//********************更新操作反馈信息********************************//

void BYSGRDLG::OnTimer(UINT nIDEvent) 

{

   GetDlgItem(IDC_INFOR)->SetWindowText("请双击鼠标左键选择需点播歌!");

CDialog::OnTimer(nIDEvent);

}

3.根据歌曲类别查询歌曲

BOOL BYSONGTYPDLG::OnInitDialog() 

{

CDialog::OnInitDialog();

    m_combo.InsertString(0,"流行");//初始化combo

m_combo.InsertString(1,"民族");

m_combo.InsertString(2,"通俗");

m_combo.InsertString(3,"古典");

m_combo.InsertString(4,"爵士");

m_combo.InsertString(5,"摇滚");

    m_combo.InsertString(6,"轻音乐");

m_combo.SetCurSel(0);   //设置默认

m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);//初始化list

m_list.InsertColumn(0,"序号",LVCFMT_CENTER,100);

m_list.InsertColumn(1,"歌曲名",LVCFMT_CENTER,270);

SetTimer(1,5000,NULL);//设定定时器,用于刷新用户的操作信息

GetDlgItem(IDC_INFOR)->SetWindowText("请双击鼠标左键选歌!");  //设定用户提示信息

showsong();          //显示歌曲

return TRUE;  

}

void BYSONGTYPDLG::OnSelchangeCombo1() //选择改变时刷新显示

{

showsong();

}

//*************************歌曲的显示****************************************//

void BYSONGTYPDLG::showsong()

{

int ktype=m_combo.GetCurSel();

m_combo.GetLBText(ktype,bysongtype);///////////////////得到歌类型

    CString songid,  songname;

ADOConn m_AdoConn;  //创建数据库操作对象

m_AdoConn.OnInitADOConn();  //链接

_RecordsetPtr m_pRecordset;  //记录集指针

_bstr_t sql;

sql = "select*from musiclist where mtpye ='"+bysongtype+"'"; //定义SQL查询语句

m_pRecordset=m_AdoConn.GetRecordSet(sql);   //得到记录集   

if(m_pRecordset->adoEOF)    //如果歌库中没有该条歌曲记录跳出

{

m_AdoConn.ExitConnect();//断开链接并关闭记录集

return;

}  

int t=0;   //list标号

m_list.DeleteAllItems();  //删除所有

while(!m_pRecordset->adoEOF)  //遍历记录集

{

int b=t+1;  

songid.Format("%d",b); //得到list序列号

songname =m_pRecordset->GetFields()->GetItem("muname")->Value.bstrVal;//得到歌名

m_list.InsertItem(t,songid);  //显示序列

m_list.SetItemText(t,1, songname); //显示歌名

m_pRecordset->MoveNext(); //移到下条记录

t++;

   }

m_AdoConn.ExitConnect();//释放数据库资源

}

void BYSONGTYPDLG::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) 

{

CString addtsongname =m_list.GetItemText(m_list.GetSelectionMark(),1);//得到要添加的歌曲名

ADOConn m_AdoConn;   //创建数据库操作对象

m_AdoConn.OnInitADOConn();  //建立数据库连接

_RecordsetPtr m_pRecordset;  //定义记录集指针

_bstr_t sql;

sql = "select*from musiclist where muname='"+addtsongname+"' "; //定义SQL语句

m_pRecordset=m_AdoConn.GetRecordSet(sql);   //得到记录集

if(m_pRecordset->adoEOF)  //如果不存在

{

m_AdoConn.ExitConnect();  //释放数据库资源

return;   //跳出函数

}

     //---------------------------添加歌曲到临时表--------------------------------------//

sql = "select* from usertemp where tmuname='"+addtsongname+"'";//查询该歌曲在临时表的记录

m_pRecordset=m_AdoConn.GetRecordSet(sql);  //得到记录集

if(!m_pRecordset->adoEOF)     //如果存在,则给出提示,并跳出

{

GetDlgItem(IDC_INFOR)->SetWindowText("该歌曲您已经点播过,请选择其他歌曲点播!");

return;

}

//定义数据库复制语句,添加到usertemp

sql = "insert into usertemp (tmuname,tformate,tfilename,tsongtype,tsingername,playpath) select  muname,format,fname,mtpye,singernam,path from musiclist where muname ='"+addtsongname+"' ";

m_AdoConn.ExecuteSQL(sql );//执行

//定义数据库复制语句,添加到playlist

sql = "insert into playlist (tmuname,tformate,tfilename,tsongtype,tsingername,playpath) select  muname,format,fname,mtpye,singernam,path from musiclist where muname ='"+addtsongname+"' ";

m_AdoConn.ExecuteSQL(sql );//执行

GetDlgItem(IDC_INFOR)->SetWindowText("点播歌曲  "+addtsongname+"  成功!");  //给出提示

m_AdoConn.ExitConnect();//释放数据库资源

*pResult = 0;

}

void BYSONGTYPDLG::OnTimer(UINT nIDEvent) //更新提示

{

    GetDlgItem(IDC_INFOR)->SetWindowText("请双击鼠标左键选歌!");

CDialog::OnTimer(nIDEvent);

}

4.根据拼音查询歌曲

BOOL BYPINYINDLG::OnInitDialog() 

{

   CDialog::OnInitDialog();

   m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT); //初始化列表控件

   m_list.InsertColumn(0,"序号",LVCFMT_CENTER,100);

   m_list.InsertColumn(1,"歌手名",LVCFMT_CENTER,270);

   SetTimer(1,5000,NULL);  //设定用于显示操作提示的定时器

   k1=2;                  //设定显示级数为2

   ShowDate();             //显示相关数据

   GetDlgItem(IDC_INFOR)->SetWindowText("请双击鼠标左键选择需点播歌!");

   return false;  

}

//*****************监听编辑框输入值的变化***********************************//

void BYPINYINDLG::OnChangeEdit1() 

{

    m_list.DeleteAllItems();   //清空列表框的所有内容

GetDlgItem(IDC_EDIT1)->GetWindowText( pinyin);  //的到输入的拼音值

k1=2;      // 将菜单级数设置为显示歌手的级别        

ShowDate() ;  //显示符合条件的歌手

}

//*********************列表框的鼠标双击事件****************************************//

void BYPINYINDLG::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) 

    add=m_list.GetItemText(m_list.GetSelectionMark(),1);//得到列表中第二列的值

    

if(k1==2)//保留歌手名,在返回时待用

{

singername=add;

}

k1--;       //进入一层           

if (k1<0)    //点了多次

k1=0;

ShowDate() ;     //显示数据

GetDlgItem(IDC_UP)->EnableWindow(true);  //将后退按键变为可用

*pResult = 0;

}

//******************自定义显示函数*****************************************//

void BYPINYINDLG::ShowDate()   

{

switch(k1)  //判断执行什么 操作

{

case 0:  addsong();break;       //执行添加歌曲到用户临时表

case 1:  showsong();break;      //显示歌曲在表中

case 2:  showsinger(); break;  //显示歌手函数

default:  MessageBox("错误!");break;

}

}

//*********************执行添加歌曲到用户临时表 和 播放列表 表中*****************************************//

void BYPINYINDLG::addsong()

{

    CString  sformat, sfilename, stype, ssname, spath;

    

ADOConn m_AdoConn;          //定义一个封装数据库类的对象

m_AdoConn.OnInitADOConn();  //连接数据库

_RecordsetPtr m_pRecordset;

_bstr_t sql,addtolist; 

sql = "select*from musiclist where muname='"+add+"' and singernam ='"+singername+"' ";   //查出歌库中歌名和歌手相符的记录集

addtolist="select* from playlist where tmuname='"+add+"' and  tsingername = '"+singername+"'";//查出播放列表 表中歌名和歌手相符的记录集

m_pRecordset=m_AdoConn.GetRecordSet(sql);    // musiclist取得符合要求的记录集

   if(m_pRecordset->adoEOF)    //如果歌库中没有该条歌曲记录跳出

   {

   m_AdoConn.ExitConnect();//断开链接并关闭记录集

   return;

   }

   

   ////////////////////////////////////////////////////////////////////添加歌曲到临时表

   

   sql = "select* from usertemp where tmuname='"+add+"' and tsingername = '"+singername+"'";//查出用户表中歌名和歌手相符的记录集

   m_pRecordset=m_AdoConn.GetRecordSet(sql); //得到符合要求的记录集

   if(!m_pRecordset->adoEOF)    //如果该歌曲已经存在,则跳出添加歌曲

   {

   GetDlgItem(IDC_INFOR)->SetWindowText("该歌曲您已经点播过,请选择其他歌曲点播!");

   return;

   }

   else{  //如果该歌曲不存在

   //定义数据库复制语句,添加到usertemp

   sql = "insert into usertemp (tmuname,tformate,tfilename,tsongtype,tsingername,playpath) select  muname,format,fname,mtpye,singernam,path from musiclist where muname ='"+add+"' ";

   m_AdoConn.ExecuteSQL(sql );//执行

   

   //************************添加到播放临时表*******************************************///

   //定义数据库复制语句,添加到playlist

   sql = "insert into playlist (tmuname,tformate,tfilename,tsongtype,tsingername,playpath) select  muname,format,fname,mtpye,singernam,path from musiclist where muname ='"+add+"' ";

   m_AdoConn.ExecuteSQL(sql );//执行

   GetDlgItem(IDC_INFOR)->SetWindowText("点播歌曲   "+add+"   成功!");//点播成功

   }

   m_AdoConn.ExitConnect();//释放数据库资源

   

}

//*************************显示歌曲在表中**********************************************//

void BYPINYINDLG::showsong()

{

CString songid,  songname;

   m_list.DeleteColumn(0);    //解决显示上次列名问题

   m_list.DeleteColumn(0);

   m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);

   m_list.InsertColumn(0,"序号",LVCFMT_CENTER,100);

   m_list.InsertColumn(1,"歌曲名",LVCFMT_CENTER,270);

   

   ADOConn m_AdoConn;     //定义一个封装数据库类的对象

   m_AdoConn.OnInitADOConn();//连接数据库

   _bstr_t sql;           

   _RecordsetPtr m_pRecordset; //定义记录集指针

   

   sql = "select * from musiclist where singernam ='"+add+"'";  //将该歌手的所有歌曲显示

   

   m_pRecordset=m_AdoConn.GetRecordSet(sql); //的到歌曲记录集

   if(m_pRecordset->adoEOF)    //如果没有则跳出函数

   {

   m_AdoConn.ExitConnect();

   return;

   }

   if(!m_pRecordset->adoEOF)     //该歌手有歌曲

   {  

   int t=0;

   m_list.DeleteAllItems();  //删除先前的显示

   while(!m_pRecordset->adoEOF)   //遍历记录集

   {

   int b=t+1; //列序号

   songid.Format("%d",b);  //转换类型

   songname =m_pRecordset->GetFields()->GetItem("muname")->Value.bstrVal; //得歌名

   m_list.InsertItem(t,songid);   //设置列序号

   m_list.SetItemText(t,1, songname);  //设置歌名

   m_pRecordset->MoveNext();  //移到下条记录

   t++;

   }

   }

   

   else 

   {

   m_list.DeleteAllItems();//删除所有歌曲记录

   }

   

   m_AdoConn.ExitConnect();//断开数据库连接

   

}

//***********************显示歌手函数**************************************//

void BYPINYINDLG::showsinger()

{

//m_list.DeleteAllItems();   //删除列表元素

   m_list.DeleteColumn(0);    //解决显示上次列名问题

   m_list.DeleteColumn(0); 

   m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT); //初始化列表控件

   m_list.InsertColumn(0,"序号",LVCFMT_CENTER,100);

   m_list.InsertColumn(1,"歌手名",LVCFMT_CENTER,270);

   

   ADOConn m_AdoConn;

   m_AdoConn.OnInitADOConn();

   _bstr_t sql;

   CString songid,  singernameby, songtotal,sex;

   _RecordsetPtr m_pRecordset;

   sql = "select * from singer where 1=1";//没有输入时显示所有歌曲

  

   if(pinyin !="")   //没有输入则跳出

   {

   sql = sql +"and sinpin like '"+pinyin+"%'";//定义根据歌手拼音模糊查询语句

  

   }

   m_pRecordset=m_AdoConn.GetRecordSet(sql);   //得到记录集

   if(m_pRecordset->adoEOF)    //如果没有符合输入的记录,则跳出

   {

   m_AdoConn.ExitConnect();

   return;

   }

   if(!m_pRecordset->adoEOF)    //有记录

   {    

   int t=0;    

   m_list.DeleteAllItems();    //删除列表控件元素

   while(!m_pRecordset->adoEOF) //遍历记录集

   {

   int b=t+1;

   songid.Format("%d",b);

   singernameby =m_pRecordset->GetFields()->GetItem("sinnam")->Value.bstrVal;//取歌手名

   m_list.InsertItem(t,songid);    //添加序列号

   m_list.SetItemText(t,1,singernameby);  //添加歌手名

   m_pRecordset->MoveNext();  //移到下条

   t++;

   }

   }

   

   else 

   {

   m_list.DeleteAllItems(); //清空显示

   }

   

   m_AdoConn.ExitConnect();

   

}

//********************返回键*************************************//

void BYPINYINDLG::OnUp() 

{

if(k1==0) //如果完成了添加则将显示的默认级别加 1

k1=1;

k1++;   //将显示的级别加 1

if(k1>2)  //如果K1>设定值

{k1=2;  GetDlgItem(IDC_UP)->EnableWindow(FALSE);} //恢复到定值,并禁用后退按钮

ShowDate() ;//调用显示函数

}

void BYPINYINDLG::OnTimer(UINT nIDEvent) //设置提示信息

{

    GetDlgItem(IDC_INFOR)->SetWindowText("请双击鼠标左键选歌!");

CDialog::OnTimer(nIDEvent);

}

5.管理员管理播放控制模块功能分析代码

void ManageDLG::OnAddsong() 

{

MADDSONG mydlg;

mydlg.DoModal();

}

void ManageDLG::OnPrice() 

{

SETPRICE mydlg;

mydlg.DoModal();

}

BOOL ManageDLG::OnInitDialog() 

{

CDialog::OnInitDialog();

//*********************初始化控件************************************//

m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);

m_list.InsertColumn(0,"歌名",LVCFMT_CENTER,150);

m_list.InsertColumn(1,"歌手名",LVCFMT_CENTER,100);

m_list.InsertColumn(2,"歌曲风格",LVCFMT_CENTER,80);

m_list.InsertColumn(3,"格式",LVCFMT_CENTER,80);

m_list2.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);

m_list2.InsertColumn(0,"歌手名",LVCFMT_CENTER,80);

ShowData() ;

singerShowData() ;//显示歌手

SetTimer(1,10,NULL); //设置刷新列表定时器

return TRUE;  // return TRUE unless you set the focus to a control

// EXCEPTION: OCX Property Pages should return FALSE

}

void ManageDLG::ShowData() 

{

CString  muname, singername, mtype,format;

m_list.DeleteAllItems();

int k=0;

ADOConn m_AdoConn;/////////////////////////////ADO连接数据库

m_AdoConn.OnInitADOConn();

_RecordsetPtr m_pRecordset;

_bstr_t sql;

sql = "select*from musiclist";

m_pRecordset=m_AdoConn.GetRecordSet(sql);

if(m_pRecordset->adoEOF)

{

m_AdoConn.ExitConnect();

return;

}

m_pRecordset->MoveFirst();

while(!m_pRecordset->adoEOF)

{   

muname=m_pRecordset->GetFields()->GetItem("muname")->Value.bstrVal;/////////////////取字段

singername=m_pRecordset->GetFields()->GetItem("singernam")->Value.bstrVal;/////////////////取字段

mtype=m_pRecordset->GetFields()->GetItem("mtpye")->Value.bstrVal;/////////////////取字段

format=m_pRecordset->GetFields()->GetItem("format")->Value.bstrVal;/////////////////取字段

m_list.InsertItem(k, muname);

m_list.SetItemText(k,1,singername);

m_list.SetItemText(k,2, mtype);

m_list.SetItemText(k,3,format);

m_pRecordset->MoveNext();

k++;

}

m_AdoConn.ExitConnect();

}

//***************注释与删除歌手类似****************************//

void ManageDLG::OnDelsong() 

{

ADOConn m_AdoConn;//ADO连接数据库

m_AdoConn.OnInitADOConn();

_RecordsetPtr m_pRecordset;

_bstr_t sql;

sql = "delete from musiclist where singernam='"+desingername+"'and muname='"+desongname+"'";

m_pRecordset=m_AdoConn.GetRecordSet(sql);

CString sPath ;

int nPos;

GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);

nPos=sPath.ReverseFind('\\');

sPath=sPath.Left(nPos);

nPos=sPath.ReverseFind('\\');

sPath=sPath.Left(nPos);

sPath=sPath+"\\歌库文件夹";

desongname.TrimRight();

CString defilename=desongname+'.'+deformat;

CString filename=sPath+"\\"+defilename;

DeleteFile(filename);

ShowData() ;

}

void ManageDLG::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) 

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

int selectrow=pNMListView->iItem;

desongname=m_list.GetItemText(selectrow,0);//得到list表中第一列的值

desingername=m_list.GetItemText(selectrow,1);//得到list表中第二的值

deformat=m_list.GetItemText(selectrow,3);//得到list表中第四列的值

UpdateData(false);

*pResult = 0;

}

void ManageDLG::OnTimer(UINT nIDEvent) //用于在添加歌曲和歌手时可以看到表的变化

{

if(tempshow1!=tempshow)

{

ShowData() ;

singerShowData();

tempshow1=0;

tempshow=0;

}

if(showsinger1!=showsinger2)

{

singerShowData() ;

showsinger1=0;

showsinger2=0;

}

if(delsongfresh!=0)

{

ShowData() ;

delsongfresh=0;

}

CDialog::OnTimer(nIDEvent);

}

void ManageDLG::OnAddsinger() ///////////////////////////////添加歌手

{

GetDlgItem(IDC_INFOR)->SetWindowText("");

ADDSGEDLG mysgrdlg;

if(mysgrdlg.DoModal()==IDOK)//弹出添加歌手对话框

{

showsinger2++;

return;

}

}

void ManageDLG::OnItemchangedList2(NMHDR* pNMHDR, LRESULT* pResult) 

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

int selectrow=pNMListView->iItem;

delkusinger=m_list2.GetItemText(selectrow,0);//得到要删除的歌手

UpdateData(false);

*pResult = 0;

}

void ManageDLG::singerShowData() 

{

CString  kusingername;

m_list2.DeleteAllItems();

int k=0;

ADOConn m_AdoConn;//ADO连接数据库

m_AdoConn.OnInitADOConn();

_RecordsetPtr m_pRecordset;

_bstr_t sql;

sql = "select*from singer";

m_pRecordset=m_AdoConn.GetRecordSet(sql);

if(m_pRecordset->adoEOF)

{

m_AdoConn.ExitConnect();

return;

}

m_pRecordset->MoveFirst();

while(!m_pRecordset->adoEOF)

{   

kusingername=m_pRecordset->GetFields()->GetItem("sinnam")->Value.bstrVal;//取字段

m_list2.InsertItem(k, kusingername);

m_pRecordset->MoveNext();

k++;

}

m_AdoConn.ExitConnect();

}

//********与上模块类似*************//

void ManageDLG::OnDel() ////////////////////////删除歌手

{

GetDlgItem(IDC_INFOR)->SetWindowText("");

if (delkusinger=="")

{

GetDlgItem(IDC_INFOR)->SetWindowText("请先选择歌手!");

return;

}

ADOConn m_AdoConn;/////////////////////////////ADO连接数据库

_bstr_t delkusinsql;

    delkusinsql= "delete from singer where sinnam='"+delkusinger+"'";

m_AdoConn.ExecuteSQL(delkusinsql);///////////////////删除临时表

singerShowData() ;

delkusinger="";

}

void ManageDLG::OnModifsinger() 

{

GetDlgItem(IDC_INFOR)->SetWindowText("");

if (delkusinger=="")

{

GetDlgItem(IDC_INFOR)->SetWindowText("请先选择歌手!");

return;

}

//得到歌手的信息

ADOConn m_AdoConn;

m_AdoConn.OnInitADOConn();

_RecordsetPtr m_pRecordset;

_bstr_t sql;

sql = "select*from singer where sinnam='"+delkusinger+"'";

m_pRecordset=m_AdoConn.GetRecordSet(sql);

mkusingername=delkusinger;

mkusingersex =m_pRecordset->GetFields()->GetItem("sinsex")->Value.bstrVal;/////////////////取字段

mkusingerarea =m_pRecordset->GetFields()->GetItem("sinarea")->Value.bstrVal;/////////////////取字段

mkusingerpin =m_pRecordset->GetFields()->GetItem("sinpin")->Value.bstrVal;/////////////////取字段

MODIFISINGER modifidlg;

modifidlg.DoModal();

GetDlgItem(IDC_INFOR)->SetWindowText("修改歌手 "+delkusinger+" 资料完成!");

delkusinger="";

m_AdoConn.ExitConnect();

}

6.管理员设置功能的代码

BOOL MADDSONG::OnInitDialog() 

{

CDialog::OnInitDialog();

//*********************初始化歌曲名字数选项*********************///

    m_comb1.InsertString(0,"1");

m_comb1.InsertString(1,"2");

m_comb1.InsertString(2,"3");

m_comb1.InsertString(3,"4");

m_comb1.InsertString(4,"5");

m_comb1.InsertString(5,"6");

    m_comb1.InsertString(6,"7");

m_comb1.InsertString(7,"8");

m_comb1.InsertString(8,"9");

m_comb1.InsertString(9,"10");

m_comb1.InsertString(10,"11");

m_comb1.InsertString(11,"12");

    m_comb1.SetCurSel(0);

//*********************初始化歌曲类型选项*********************///

m_comb2.InsertString(0,"流行");

m_comb2.InsertString(1,"民族");

m_comb2.InsertString(2,"通俗");

m_comb2.InsertString(3,"古典");

m_comb2.InsertString(4,"爵士");

m_comb2.InsertString(5,"摇滚");

    m_comb2.InsertString(6,"轻音乐");

   m_comb2.SetCurSel(0);

//*********************初始化list控件********************///

   

   m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);

   m_list.InsertColumn(0,"歌名",LVCFMT_CENTER,150);

   m_list.InsertColumn(1,"歌手名",LVCFMT_CENTER,100);

   m_list.InsertColumn(2,"歌曲风格",LVCFMT_CENTER,80);

   m_list.InsertColumn(3,"格式",LVCFMT_CENTER,80);

   m_radio.SetCheck(1);  //默认选择链接添加

/////////////////////////////////////////////

   mp3filebroken=false;

   ShowData() ;

   return TRUE;  // return TRUE unless you set the focus to a control

//

}

void MADDSONG::OnChoose() 

{

//设置可以选择的文件类型

char szFilter[] =" 媒体文件 (所有类型)|*.mp3;*.wma;*.wmv;*.wav;*.avi;*.rm;*.rmvb\

|视频文件 |*.wmv;*.avi;*.rm;*.rmvb|音频文件|*.mp3;*.wma;*.wav|所有文件 (*.*)|*.*||";

CFileDialog filedlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFilter); 

if(filedlg.DoModal()==IDOK)

{

CString  strname,strname1;

strname=filedlg.GetFileName();////////////////////////的到文件名

strname1=filedlg.GetFileTitle();////////////////////////文件名

Qfilename1=filedlg.GetPathName();/////////////////////////传值

Qfilename2=strname;//////////////////传值

GetDlgItem(IDC_FILENAME)->SetWindowText(strname);//显示到编辑框

CString strname2,strname3,strname4;

GetDlgItem(IDC_SONGNAME)->GetWindowText(strname2);//得到编辑后的值

GetDlgItem(IDC_FILENAME)->GetWindowText(strname3);//得到编辑后的值

strname4=strname3.Right(strname3.GetLength()-strname1.GetLength()-1);//得到文件的格式 ,'mp3,wma'

if( strname4=="mp3")//如果是MP3格式的就用方法自动读取文件属性

{

CFile file;

file.Open(strname,CFile::modeRead);

//把文件的最后128字节信息读给pbuf数组

long seekPos = 128;

file.Seek(-seekPos,CFile::end);

BYTE pbuf[128];

memset(pbuf,0,sizeof(pbuf));

file.Read(pbuf,128);

//获得tag,如果不是tag,那么就返回

if(!((pbuf[0] == 'T'|| pbuf[0] == 't')

&&(pbuf[1] == 'A'|| pbuf[1] == 'a')

&&(pbuf[2] == 'G'|| pbuf[0] == 'g')))

{

file.Close();

mp3filebroken=true;

return ;

}

mp3=(MP3INFO *) new BYTE[sizeof(MP3INFO)];

ZeroMemory(mp3,sizeof(MP3INFO));

memcpy(mp3->Identify,pbuf,3); //获得tag

memcpy(mp3->Title,pbuf+3,30); //获得歌名

memcpy(mp3->Artist,pbuf+33,30); //获得作者

memcpy(mp3->Album,pbuf+63,30); //获得唱片名

memcpy(mp3->Year,pbuf+93,4); //获得年

memcpy(mp3->Comment,pbuf+97,28); //获得注释

memcpy(&mp3->reserved,pbuf+125,1); //获得保留

memcpy(&mp3->reserved2,pbuf+126,1);

memcpy(&mp3->reserved3,pbuf+127,1);

GetDlgItem(IDC_SONGNAME)->SetWindowText(mp3->Title);//将歌名返回编辑框

GetDlgItem(IDC_SINGER)->SetWindowText(mp3->Artist);//将歌手名返回编辑框

GetDlgItem(IDC_FORMAT)->SetWindowText(strname4);//将格式返回编辑框

file.Close();

delete mp3;

}

else{

GetDlgItem(IDC_FORMAT)->SetWindowText(strname4);//是用截取得到的值

GetDlgItem(IDC_SONGNAME)->SetWindowText(  strname1); //显示歌名

GetDlgItem(IDC_FILENAME)->SetWindowText(strname);//文件名

}

mp3filebroken=false;

}  

}

void MADDSONG::OnAdd() 

{  

tempshow++;

CString songname,format,strname4,singer,addpath,newfilename,strtemp;

GetDlgItem(IDC_SONGNAME)->GetWindowText(  songname);  

GetDlgItem(IDC_FORMAT)->GetWindowText(  format);

GetDlgItem(IDC_SINGER)->GetWindowText(  singer);///////////////////获取歌手名

if(Qfilename1==""||songname=="")  //路径和歌名为空时

GetDlgItem(IDC_INFOR)->SetWindowText("请先选择歌曲!");

else

{

if( singer=="")//如果歌手名为空

{ GetDlgItem(IDC_INFOR)->SetWindowText("请填歌手!");

if( mp3filebroken==true)

GetDlgItem(IDC_INFOR)->SetWindowText("请填歌手姓名和格式形式!");

}

else

{

ADOConn m_AdoConn;/////////////////////////////ADO连接数据库

m_AdoConn.OnInitADOConn();  //连接数据库

_RecordsetPtr m_pRecordset;  //定义记录集

_bstr_t sql;

sql ="select*from musiclist where muname ='"+songname+"'and singernam='"+singer+"'";//查询歌曲

m_pRecordset=m_AdoConn.GetRecordSet(sql);

if(!(m_pRecordset->adoEOF))////////////////////////判断有歌曲记录

GetDlgItem(IDC_INFOR)->SetWindowText("您已经添加过这首歌曲!");

else//判断有没歌手

{  

_bstr_t findsin;

findsin = "select* from singer where sinnam='"+ singer+"'";////////////////////

m_pRecordset=m_AdoConn.GetRecordSet(findsin);

if(m_pRecordset->adoEOF)  //没有当前你输入的歌手的资料,会弹出对话框让你添加

{

GetDlgItem(IDC_INFOR)->SetWindowText("歌库中没有该歌曲歌手的信息,请补充!");

ADDSGEDLG addsinger;

addsinger.m_singer=singer;

addsinger.DoModal();

}

//物理添加,将文件添加到工程文件夹下,此方法不好,可用直接的文件复制函数

if(!m_radio.GetCheck() )//添加文件到歌曲文件夹/////////////////

{

CString sPath ,fullname;

int nPos;

CFile* writefile;//////////////////////写文件

CFile* readfile;////////////////////////读文件

long readlen,poslen,filelen;

LPVOID pvData;

HGLOBAL hGlobal;

GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);//得到要输出文件的路径

nPos=sPath.ReverseFind('\\');

sPath=sPath.Left(nPos);

nPos=sPath.ReverseFind('\\');

    sPath=sPath.Left(nPos);

sPath=sPath+"\\歌库文件夹";

CString  strname,strname1,filename1;

filename1=  Qfilename1; ////////////////得到路径 ,在选择文件那边得到的

strname=   Qfilename2;////////////////////////的到文件名,在选择文件那边得到的

fullname.Format("%s\\%s",sPath,strname);

readfile=new CFile(filename1,CFile::modeRead);

HANDLE hfile=::CreateFile( fullname,GENERIC_WRITE|GENERIC_WRITE,0,0,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0);

CloseHandle(hfile);

writefile=new CFile(fullname,CFile::modeWrite);

filelen=readfile->GetLength();

hGlobal = GlobalAlloc(GMEM_MOVEABLE,512);

pvData = GlobalLock(hGlobal);

while(1)

{

ZeroMemory(pvData,512);

readlen=readfile->ReadHuge(pvData,512);

poslen=readfile->GetPosition();//获取文件指针的位置

writefile->WriteHuge(pvData,readlen);

if(poslen==filelen)//如果指针移到末尾,就退出循环

break;

}

GlobalUnlock(hGlobal);

readfile->Close();  //流关闭

writefile->Close();

//重命名文件

songname.TrimRight();  //去空格

CString stredfilename=songname+'.'+format;//得到文件名+格式

CString temp,strtemp;strtemp=temp= fullname;

int pos1=temp.Find("\\");

while(pos1>0)

{

temp=temp.Right(temp.GetLength()-1-pos1);

pos1=temp.Find("\\");

}

strtemp=strtemp.Left(strtemp.GetLength()-temp.GetLength());

strtemp+=stredfilename; 

CFile::Rename(fullname,strtemp);

addpath="系统文件夹下";

newfilename=stredfilename;

}    

else//*************用于只存地址的不复制文件的

{

addpath=Qfilename1;

songname.TrimRight();

newfilename=songname+'.'+format;

}

CString strname5, format;

GetDlgItem(IDC_SINGER)->GetWindowText(  strname5);///////////////////获取歌手名

CString munum;

int k=m_comb1.GetCurSel();

m_comb1.GetLBText(k,munum);///////////////////得到歌字数

CString mutype;

int k2=m_comb2.GetCurSel();

m_comb2.GetLBText(k2,mutype);////////////////////得到歌类型名

GetDlgItem(IDC_FORMAT)->GetWindowText( format);//得到格式名

m_AdoConn.ExitConnect();

m_AdoConn.OnInitADOConn();

_RecordsetPtr m_pRecordset;

_bstr_t sql;

sql = "select*from musiclist";

m_pRecordset=m_AdoConn.GetRecordSet(sql);

m_pRecordset->AddNew();//添加新行

m_pRecordset->GetFields()->GetItem("singernam")->Value=(_bstr_t) strname5 ;///写入歌手名

m_pRecordset->GetFields()->GetItem("muname")->Value=(_bstr_t) songname;////写入歌名

m_pRecordset->GetFields()->GetItem("mnum")->Value=(_bstr_t)  munum;////写入歌字数

m_pRecordset->GetFields()->GetItem("mtpye")->Value=(_bstr_t)  mutype ;////写入歌的类型

m_pRecordset->GetFields()->GetItem("fname")->Value=(_bstr_t) newfilename;////写入文件名

m_pRecordset->GetFields()->GetItem("format")->Value=(_bstr_t)  format ;////写入格式

m_pRecordset->GetFields()->GetItem("path")->Value=(_bstr_t)  addpath ;////写入路径

m_pRecordset->Update();

m_AdoConn.ExitConnect();//释放数据库资源

GetDlgItem(IDC_INFOR)->SetWindowText("添加"+songname+"成功到歌库!");

GetDlgItem(IDC_SONGNAME)->SetWindowText("");  //清空输入框

GetDlgItem(IDC_SINGER)->SetWindowText(""); //清空输入框

GetDlgItem(IDC_FILENAME)->SetWindowText(""); //清空输入框

GetDlgItem(IDC_FORMAT)->SetWindowText("");//清空输入框

m_comb1.SetCurSel(0);//设置显示第一列

m_comb2.SetCurSel(0);//设置显示第一列

}

}

}

ShowData() ;

}

void MADDSONG::ShowData() //显示信息

{

CString  muname, singername, mtype,format;

m_list.DeleteAllItems();  //删除所有的

int k=0;

ADOConn m_AdoConn;//定义数据库操作对象

m_AdoConn.OnInitADOConn();//连接数据库

   _RecordsetPtr m_pRecordset; //定义记录集

_bstr_t sql;

sql = "select*from musiclist";

m_pRecordset=m_AdoConn.GetRecordSet(sql);//得到记录集

if(m_pRecordset->adoEOF)  //如果没有就退出函数

{

m_AdoConn.ExitConnect(); //释放数据库资源

return;

}

m_pRecordset->MoveFirst();

while(!m_pRecordset->adoEOF)  //遍历记录集显示在list

{   

muname=m_pRecordset->GetFields()->GetItem("muname")->Value.bstrVal;/////////////////取歌曲名

   singername=m_pRecordset->GetFields()->GetItem("singernam")->Value.bstrVal;/////////////////取歌手名

   

   mtype=m_pRecordset->GetFields()->GetItem("mtpye")->Value.bstrVal;/////////////////取歌的类型

   format=m_pRecordset->GetFields()->GetItem("format")->Value.bstrVal;/////////////////取格式

   m_list.InsertItem(k, muname);  //显示歌名到list

   m_list.SetItemText(k,1,singername);//显示歌手到list

   m_list.SetItemText(k,2, mtype);

   m_list.SetItemText(k,3,format);

   m_pRecordset->MoveNext();

   k++;

}

m_AdoConn.ExitConnect();

}

void MADDSONG::OnDel() 

{

delsongfresh++;

ADOConn m_AdoConn;//创建数据库连接对象

m_AdoConn.OnInitADOConn();  //创建连接

_RecordsetPtr m_pRecordset; //定义记录集

     _bstr_t sql;

sql = "delete from musiclist where singernam='"+desingername1+"'and muname='"+desongname1+"'";

    m_pRecordset=m_AdoConn.GetRecordSet(sql);//删除数据库中

//得到系统文件路径\Debug\歌库文件夹

    CString sPath ;

int nPos;

GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);

nPos=sPath.ReverseFind('\\');

sPath=sPath.Left(nPos);

nPos=sPath.ReverseFind('\\');

sPath=sPath.Left(nPos);

sPath=sPath+"\\歌库文件夹";

desongname1.TrimRight();//去右边的空格

CString defilename1=desongname1+'.'+deformat1; //得到文件加格式名

     CString filename=sPath+"\\"+defilename1;//得到完整路径

DeleteFile(filename);

ShowData() ;

GetDlgItem(IDC_INFOR)->SetWindowText("删除"+desongname1+"成功!");

}

void MADDSONG::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) 

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

int selectrow=pNMListView->iItem;

   desongname1=m_list.GetItemText(selectrow,0);//得到歌名

    desingername1=m_list.GetItemText(selectrow,1); //得到歌手名

    deformat1=m_list.GetItemText(selectrow,3);//得到格式

   UpdateData(false);

*pResult = 0;

}

7.打印预览界面的设计代码

BOOL UserPrintDlg::OnInitDialog() 

{

CDialog::OnInitDialog();

m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);

   m_list.InsertColumn(0,"",LVCFMT_CENTER,120);

   m_list.InsertColumn(1,"",LVCFMT_CENTER,120);

   m_list.InsertColumn(2,"",LVCFMT_CENTER,100);

      GetDlgItem(IDC_EDIT1)->SetWindowText(  timestr1);

 GetDlgItem(IDC_EDIT2)->SetWindowText(   timestr2);

 GetDlgItem(IDC_EDIT3)->SetWindowText(  addroomtype);

 GetDlgItem(IDC_EDIT4)->SetWindowText(  addcardtype);

 GetDlgItem(IDC_EDIT5)->SetWindowText( printprice);

 GetDlgItem(IDC_EDIT6)->SetWindowText(  printabate);

 GetDlgItem(IDC_EDIT7)->SetWindowText(  givenmoney);

 GetDlgItem(IDC_EDIT8)->SetWindowText(  printmoneybake);

   showprint();

return TRUE;  // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

void UserPrintDlg::showprint()

{   

m_list.DeleteAllItems();

/* m_list.InsertItem(0,  timestr1);

m_list.SetItemText(0,1,   timestr2);

m_list.SetItemText(0,2, addroomtype);

m_list.SetItemText(0,3, addcardtype);

m_list.SetItemText(0,4, printabate );

m_list.SetItemText(0,5, printprice);

m_list.SetItemText(0,6, givenmoney);

m_list.SetItemText(0,7, printmoneybake);

*/

  CString title[8]={"开始消费时间","结束消费时间","包房类型","会员卡类型","每小时单价()","打折率","预付金额()","找零()"};

    printprice.TrimRight ();

   CString mingxi[8]={timestr1, timestr2,addroomtype,addcardtype,printprice,printabate, givenmoney,printmoneybake};

   CString s0,s1,s2;

int i=0; 

while(i<8)  

{

s2=mingxi[i];

s1= title[i];

         s0.Format("%d",i+1 );

m_list.InsertItem(i,s0);

m_list.SetItemText(i,1,s1);

m_list.SetItemText(i,2,s2); 

            i++;

   }

void UserPrintDlg::OnButton1()/////////////////////////打印预览按钮

{ if(m_list.GetItemCount()<= 0)

return;

PRNINFO PrnInfo = {0};

PrnInfo.hListView = m_list.m_hWnd;

PrnInfo.hWnd = this->m_hWnd;

PrnInfo.IsPrint = FALSE;

PrnInfo.nCurPage = 1;

PrnInfo.nMaxLine = m_list.GetItemCount();

CPreParent DlgPreView;

DlgPreView.SetCallBackFun(DrawInfo, PrnInfo);

DlgPreView.DoModal();

}

void UserPrintDlg::DrawInfo(CDC &memDC, PRNINFO PrnInfo)

{

if(memDC.m_hDC == NULL)

return;

int nCurPage = PrnInfo.nCurPage; //当前页

BOOL IsPrint = PrnInfo.IsPrint; //是否打印

int nMaxPage = PrnInfo.nCountPage; //最大页码

HWND hWnd = PrnInfo.hWnd;

HWND hList = PrnInfo.hListView;

CString csLFinality, csRFinality;

CTime time;

time=CTime::GetCurrentTime();

csLFinality = time.Format("打印日期:%Y-%m-%d");

csRFinality.Format("第 %i /共 %i ", nCurPage, nMaxPage);

TCHAR szTitle[] = TEXT("强强点歌顾客消费账单");

CRect rc, rt1, rt2, rt3, rt4, rt5, rt6,rt7,rt8,rt9,rt10,rt11;

CPen *hPenOld;

CPen cPen;

CFont TitleFont, DetailFont, *oldfont;

//标题字体

TitleFont.CreateFont(-MulDiv(14,memDC.GetDeviceCaps(LOGPIXELSY),72),

0,0,0,FW_NORMAL,0,0,0,GB2312_CHARSET,

OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,

VARIABLE_PITCH|FF_SWISS,_T("楷体_GB2312"));

//细节字体

DetailFont.CreateFont(-MulDiv(10,memDC.GetDeviceCaps(LOGPIXELSY),72),

0,0,0,FW_NORMAL,0,0,0,GB2312_CHARSET,

OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,

VARIABLE_PITCH|FF_SWISS,_T("宋体"));

//粗笔

cPen.CreatePen(PS_SOLID, 2, RGB(0, 0, 255));

  int xP = GetDeviceCaps(memDC.m_hDC, LOGPIXELSX); //x方向每英寸像素点数

int yP = GetDeviceCaps(memDC.m_hDC, LOGPIXELSY); //y方向每英寸像素点数

DOUBLE xPix = (DOUBLE)xP*10/254; //每 mm 宽度的像素

DOUBLE yPix = (DOUBLE)yP*10/254; //每 mm 高度的像素

DOUBLE fAdd = 7*yPix; //每格递增量

DOUBLE nTop = 25*yPix; //第一页最上线

int   iStart = 0; //从第几行开始读取

DOUBLE nBottom = nTop+B5_ONELINE*fAdd;

if(nCurPage != 1)

nTop = 25*yPix-fAdd; //非第一页最上线

if(nCurPage == 2)

iStart = B5_ONELINE;

if(nCurPage>2)

iStart = B5_ONELINE+(nCurPage - 2)*B5_OTHERLINE;

DOUBLE nLeft = 20*xPix; //最左线

DOUBLE nRight = xPix*(B5_W-20); //最右线

DOUBLE nTextAdd = 1.5*xPix;

if(IsPrint)

{

//真正打印部分

static DOCINFO di = {sizeof (DOCINFO),  szTitle} ;

//开始文档打印

if(memDC.StartDoc(&di)<0)

{

::MessageBox(hWnd, "连接到打印机化败!", "错误", MB_ICONSTOP);

}

else

{

iStart = 0;

nTop = 25*yPix; //第一页最上线

for(int iTotalPages = 1; iTotalPages<=nMaxPage; iTotalPages++)

{

int nCurPage = iTotalPages;

csRFinality.Format("第 %i /共 %i ", nCurPage, nMaxPage);

time=CTime::GetCurrentTime();

csLFinality = time.Format("打印日期:%Y-%m-%d");

if(nCurPage != 1)

nTop = 25*yPix-fAdd; //非第一页最上线

if(nCurPage == 2)

iStart = B5_ONELINE;

if(nCurPage>2)

iStart = B5_ONELINE+(nCurPage - 2)*B5_OTHERLINE;

//开始页

if(memDC.StartPage() < 0)

{

::MessageBox(hWnd, _T("打印失败!"), "错误", MB_ICONSTOP);

memDC.AbortDoc();

return;

}

else

{/*

*/}

}

memDC.EndDoc();

}

}

else

{

//打印预览

//边框线

hPenOld = memDC.SelectObject(&cPen);

rc.SetRect(0, 0, B5_W*xPix, B5_H*yPix);

memDC.Rectangle(&rc);

memDC.SelectObject(hPenOld);

//标题

oldfont = memDC.SelectObject(&TitleFont);

int nItem = B5_OTHERLINE;

if(nCurPage == 1)

{

nItem = B5_ONELINE;

rc.SetRect(0, yPix*10, B5_W*xPix, yPix*20);

memDC.DrawText(szTitle, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

}

//细节

  memDC.SelectObject(&DetailFont);

rc.SetRect(nLeft, nTop, nRight, nTop+fAdd);

//上横线

memDC.MoveTo(rc.left, rc.top);

memDC.LineTo(rc.right, rc.top);

rt1.SetRect(nLeft, nTop, nLeft+20*xPix, nTop+fAdd);

rt2.SetRect(rt1.right, rt1.top, rt1.right + 50*xPix, rt1.bottom);

   rt3.SetRect(rt3.right, rt1.top, rc.right, rt1.bottom);

memDC.DrawText("", &rt1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

memDC.DrawText("", &rt2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

memDC.DrawText("", &rt3, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

memDC.MoveTo(rt1.right, rt1.top);

memDC.LineTo(rt1.right, rt1.bottom);

memDC.MoveTo(rt2.right, rt1.top);

memDC.LineTo(rt2.right, rt1.bottom);

memDC.MoveTo(rt3.right, rt1.top);

memDC.LineTo(rt3.right, rt1.bottom);

       memDC.MoveTo(rc.left, rt1.bottom);

memDC.LineTo(rc.right, rt1.bottom);

//TCHAR CID[32]={0}, SName[16]={0}, GName[16]={0};

TCHAR num[32]={0}, titl[32]={0}, ming[50]={0};

rc.SetRect(nLeft, nTop+fAdd, nRight, nTop+2*fAdd);

rt1.SetRect(nLeft+nTextAdd, rc.top, nLeft+20*xPix, rc.bottom);

rt2.SetRect(rt1.right+nTextAdd, rt1.top, rt1.right + 50*xPix, rt1.bottom);

        rt3.SetRect(rt2.right+nTextAdd, rt1.top, rc.right, rt1.bottom);

int nCountItem = ListView_GetItemCount(hList);

for(int i=0;i<nItem; i++)

{

ListView_GetItemText(hList, i+iStart, 0, num, 32);

ListView_GetItemText(hList, i+iStart, 1, titl,16);

ListView_GetItemText(hList, i+iStart, 2, ming, 32);

memDC.DrawText( num, &rt1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

memDC.DrawText(titl, &rt2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

memDC.DrawText(ming, &rt3, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

//下横线

memDC.MoveTo(rc.left, rc.bottom);

memDC.LineTo(rc.right, rc.bottom);

memDC.MoveTo(rt1.right, rt1.top);

memDC.LineTo(rt1.right, rt1.bottom);

memDC.MoveTo(rt2.right, rt1.top);

memDC.LineTo(rt2.right, rt1.bottom);

memDC.MoveTo(rt3.right, rt1.top);

memDC.LineTo(rt3.right, rt1.bottom);

     

memDC.MoveTo(rc.left, rt1.bottom);

memDC.LineTo(rc.right, rt1.bottom);

rc.top += fAdd;

rc.bottom += fAdd;

rt1.top = rc.top;

rt1.bottom = rc.bottom;

rt2.top = rt1.top;

rt2.bottom = rt1.bottom;

rt3.top = rt1.top;

rt3.bottom = rt1.bottom;

if((i+iStart+1)>=nCountItem)

break;

  }

//结尾

memDC.MoveTo(rc.left, nTop);

memDC.LineTo(rc.left, rc.top);

memDC.MoveTo(rc.right, nTop);

memDC.LineTo(rc.right, rc.top);

memDC.DrawText(csLFinality, &rc, DT_LEFT| DT_VCENTER | DT_SINGLELINE);

memDC.DrawText(csRFinality, &rc, DT_RIGHT| DT_VCENTER | DT_SINGLELINE);

memDC.SelectObject(oldfont);

memDC.SelectObject(hPenOld);

}

TitleFont.DeleteObject();

DetailFont.DeleteObject();

cPen.DeleteObject();

}

posted @ 2013-10-12 08:41  ZhangAihua  阅读(1707)  评论(0编辑  收藏  举报