收藏 分销(赏)

人力资源-04用VC制作一个工资管理系统.docx

上传人:xrp****65 文档编号:8460492 上传时间:2025-02-14 格式:DOCX 页数:39 大小:396.11KB 下载积分:10 金币
下载 相关 举报
人力资源-04用VC制作一个工资管理系统.docx_第1页
第1页 / 共39页
人力资源-04用VC制作一个工资管理系统.docx_第2页
第2页 / 共39页


点击查看更多>>
资源描述
案例四  用VC++制作一个工资管理系统   关键词:VC++数据库 数据表 控件绑定 统计计算 4.1  课程设计的目的和意义 工资管理是任何企事业单位都需要进行的一项工作,因此,开发制作工资管理系统具有较大的社会现实意义,同时工资管理系统的最大特征是数据处理,它是数据库应用系统的典范,它具有一切数据库应用系统的特征,如数据录入,数据统计和数据报表等,其系统结构与现实生活紧密结合,具体直观。工资管理系统也是数据库应用开发中经常进行例证的好例子,它的开发应用简单而又不失一般性。 作为一个案例,我们仍需要重复进行一些过程,如创建工程框架,引入数据源,建立消息映射,最终实现统计计算。 本程序比较简单,我们的目的是让读者对VC的编程逐步加以理解,它的意义是非常重要的。 4.2  系统功能设计 在本系统的设计中,将主要实现如下的一些功能:增加记录功能、修改记录功能、删除记录功能、刷新记录功能,最后实现统计计算功能。 4.3  数据库与数据表的设计  作为工资管理系统,它是数据库应用系统数据处理的典范,数据库应用系统开发的前提是首先开发数据库和数据库中的数据表。因此在本案例中,我们仍采用Microsoft Access 2003创建数据库和数据表。为此我们先定义一个“职工工资数据表”的结构,如表4.1所示。   表4.1  “职工工资数据表”结构    字段名称 字段类型 字段大小 小数位数 索引 必须填写 年份 数字 整型     是 月份 数字 整型     是 输入日期 日期/时间 默认     是 职工编号 数字 整型     是 姓名 文本 16     是 部门 文本 20     是 基本工资 数字 长整型 自动   是 业绩工资 数字 长整型 自动   是 奖金 数字 长整型 自动   是 津贴 数字 长整型 自动   是 各种补助 数字 长整型 自动   是 应发数 数字 长整型 自动   是 水电费 数字 长整型 自动   是 房租 数字 长整型 自动   是 储蓄 数字 长整型 自动   是 会费 数字 长整型 自动   是 保险 数字 长整型 自动   是 扣除总计 数字 长整型 自动   是 实发工资 数字 长整型 自动   是   创建数据库及其数据表的步骤如上: (1)启动Microsoft Office 2003中的Microsoft Access应用程序,出现图4.1所示界面,通过该界面可以创建一个新的数据库或打开一个已经存在的数据库。     图4.1  新建数据库选择   (2)选择创建新数据库,即选择“空Access数据库”选项。 (3)单击“确定”按钮之后出现保存对话框,确定保存数据库的文件位置(D: \ VC++写作案例\CH4\)并给定数据库名称:工资管理数据库;然后出现图4.2所示界面。     图4.2  数据库中的数据表设计界面   在数据库设计界面中,用户可以打开已经存在的数据表,也可以创建新的数据表。 (4)单击“设计”菜单,即出现一个数据表设计器,用户可以在其中设计一个新的数据表结构,如图4.3所示。     图4.3  数据表设计器   在Microsoft Access 2003数据库设计器中,用户可以定义数据表的字段名称、字段类型、字段大小等数据表结构的内容。数据表结构一经确定,用户可以打开该数据表,在数据表中输入一些基本数据,以在后面的系统设计中体现设计的效果。 最后,系统自动将创建的数据表保存在“D:\VC++写作案例\CH4\32资管理数据库”中,将创建的数据表命名为“职工工资数据表”。 注意,在微软的Microsoft Access各版本之间,如在Microsoft Access 98与Microsoft Access 2003中,采用旧版本创建的数据库及其数据库中的数据表如要在新的版本中运用,往往需要在新版本中进行转换才行。 4.4  创建工资管理系统基本框架 在前面我们已经创建了“工资管理数据库”、“职工工资数据表”。它可为应用程序提供一个数据源。应用程序就是对该数据源的记录进行访问、增加、删除以及数据管理的一切操作。有了这一切的工作,用户就可以着手进行应用系统的构建了。 与前面的案例一样,在VC++应用系统创建中,需要通过向导先创建一个应用程序框架,然后再加入数据控件,与数据源进行绑定,并进行程序的修改与加工制作。创建“工资管理系统”应用程序框架的步骤如下: (1)结束数据库的创建并启动VC++,出现VC++主控界面。 (2)在VC++主控界面中单击“文件|新建...”菜单项,出现新建工程类型选择对话框,在工程类型列表中选择MFC AppWizard(EXE)工程类型。 (3)输入工程名称为“工资管理系统”,并选择Win32平台类型。 (4)单击“确定”按钮,进入文档类型设置。 (5)选择单文档类型,即创建一个单文档界面的应用程序,设置资源使用语言为中文,选择文档/查看体系结构支持。 (6)单击“下一步”按钮,进入框架设置的第2步,出现图4.4所示对话框。在该对话框中,需要用户对数据库的类型作一些相关的选择。     图4.4  程序框架设置的第2步   (7)选择“查看数据库不使用文件支持”;这时候Data Source按钮处于可用状态(或激活状态);在这一种选择下,VC+将为应用系统引入数据环境,即数据源,该数据源就是我们在前面创建的“工资数据库”,而不使用其他类型数据的文件支持。但数据源在系统制作中的引入需要用一定的驱动程序为之进行。 (8)单击“Data Source”按钮,出现图4.5所示的选择数据源类型的对话框。     图4.5  数据源创建类型   注意,在ODBC数据源文件列表中,我们已经创建了一个ODBC数据源文件,因此可以在其中直接选择引用即可。如果没有“工资管理数据库”这样的文件,则往往需要用操作系统控制面板中的ODBC程序加以创建,其方法参考案例一。 (9)单击OK按钮,出现数据源中的数据表,即工资数据库中的数据表。选择“职工工资数据表”,如图4.6所示。     图4.6  选择职工工资数据表   (10)单击OK按钮选定该数据表。然后返回到图4.4所示对话框,完成数据源的创建工作。 (11)在图4.4所示对话框中单击“完成”按钮,即完成应用程序框架的生成工作,出现工程框架创建的全部信息,该信息将提示用户所创建的应用程序框架包括的内容,如:应用系统名称、界面类型、适合的操作系统、类文档的创建和系统特色等,如下所示: Application type of 工资管理系统:     Single Document Interface Application targeting: Win 32 Classes to be created: Application: CMyApp in 工资管理系统.h and 工资管理系统.cpp Frame: CMainFrame in MainFrm.h and MainFrm.cpp Document: CMyDoc in 工资管理系统Doc.h and 工资管理系统Doc. Cpp RecordView : CMyView in 工资管理系统View. h and 工资管理系统View. cpp Recordset: CMyset. in 工资管理系统Set.h and 工资管理系统Set.cpp (connected to table ‘[职工工资数据表]’ in data source ‘工资管理数据库’) Features: + Initial toolbar in main frame + Initial status bar in main frame + Frinting and Print Preview support in view + 3D Controls + Uses shared DLL implementation (MFC42.DLL) + Database support, without file support + ActiveX Controls support enabled + Localizable text in: 中文[中国]   确认创建信息之后,出现应用程序框架界面,如图4.7所示。     图4.7  应用程序框架界面 4.5  开发工资处理界面 如前所述,应用系统向导只能生成一个应用程序基本框架,该框架还不具备任何功能,我们需要在框架的基础上进行系统各种功能的制作。通常一个应用程序框架生成两个对话框,一个是IDD_ABOUTBOX对话框,它是一个说明该系统的对话框,几乎由向导自动完成,如图4.8所示。     图4.8  ABOUTBOX对话框   该对话框仍然是基本的,如果用户需要修饰或修改,可以根据自己的需要进行。 在基本框架中另外一个对话框就是主对话框IDD_MY_FORM,它是我们加工制作的主要内容,数据源也是专门为该对话框引入的。 4.5.1  主对话框IDD_MY_FORM中控件的加入与布局 在工资管理系统中,主对话框主要用于处理工资管理的一切内容。制作该对话框的主要步骤如下: (1)在主对话框IDD_MY_FORM中将提示文本框“TODO:在这个对话框里设置表格控制。”删除。 (2)在主对话框IDD_MY_FORM中放入各种需要的控件,如标签控件、编辑框控件、命令按钮控件,其对话框布局如图4.9所示。     图4.9  主对话框IDD_MY_FORM控件布局   其中,各个控件的属性设置如表4.2-表4.5所示。   表4.2 标签对象的基本属性   ID 标题内容 IDC_STATICCAPTION 职工工资管理系统 IDC_STATICNE 年份 IDC_STATICYF 月份 IDC_STATICZGBH 职工编号 IDC_STATICZGXM 职工姓名 IDC_STATICZGBM 部门 IDC_STATICJBGZ 基本工资 IDC_STATICJJ 奖金 IDC_STATICYJGZ 业绩工资 IDC_STATICJT 津贴 IDC_STATICGZBZ 各种补助 IDC_STATICRDF 水电费 IDC_STATICFZOU 房租 IDC_STATICCX 储蓄 IDC_STATICHF 会费 IDC_STATICBX 保险 IDC_STATICYFHJ 应发合计 IDC_STATICKCHJ 扣除合计 IDC_STATICSFGZ 实发工资   表4.3  编辑框控件的基本属性和编辑内容   ID 编辑内容 IDC_EDITNF 年份 IDC_EDITYF 月份 IDC_EDITZGBH 职工编号 IDC_EDITZGBM 所在部门 IDC_EDITZGXM 职工姓名 IDC_EDITJBGZ 基本工资 IDC_EDITJJ 奖金 IDC_EDITYJGZ 业绩工资 IDC_EDITJT 津贴 IDC_EDITGZBZ 各种补助 IDC_EDITRDF 水电费 IDC_EDITFZOU 房租 IDC_EDITCX 储蓄 IDC_EDITHF 会费 IDC_EDITBX 保险 IDC_EDITYFHJ 应发合计 IDC_EDITKCHJ 扣除合计 IDC_EDITSFGZ 实发工资   表4.4  命令按钮对象的基本属性   ID 标题内容 IDC_BUTIONFIRST |《-第一条 IDC_BUTIONNEXT -》下一条 IDC_BUTIONPREV 《-前一条 IDC_BUTIONLAST -》|最后一条 IDC_BUTIONSUM 执行统计 IDC_RADIOADD 增加记录 IDC_RADIODELETE 删除记录 IDC_RADIOUPDATE 刷新记录   表4.5  分组控件对象的基本属性   ID 标题 IDC_STATICDATA 工资数据处理 IDC_STATICBROWSE 工资数据浏览 IDC_STATICADDDELETUPD 增加与删除 IDC_STATICCOUNT 个人工资统计   4.5.2  为编辑框控件建立数据字段映射 在对话框中的一切编辑框控件,均是用于进行数据处理和数据显示的,但首先我们应该为它们建立字段映射,即将创建的数据集中的每一个字段与一个编辑框进行‘数据绑定”。其方法我们在前面的案例中已经有所涉及。我们以其中的一个编辑框,即“年份”编辑框为例,说明为编辑框与数据集中的字段建立映射关系的方法。为此进行如下操作: (1)在主对话框IDD_MY FORM中选取“年份”编辑框控件。 (2)用鼠标右键单击该对话框,出现一个快捷菜单。 (3)在快捷菜单中单击“建立类向导”,出现类向导对话框。 (4)在类向导对话框中将页面切换至Member Variables页面并设置类名为CmySet。 该对话框列出了数据集的全部字段名、字段类型和字段的成员变量名称,但成员变量名是在创建数据源时自动生成的,往往不便于与编辑框建立映射关系,为此将全部成员变量名称删除,并重新定义字段的成员变量名称。重新定义后的字段变量名称如图4.10所示。     图4.10  重新定义的字段变量名称   (5)在Classname列表中选择CmyView,出现为编辑框控件与字段成员变量建立消息映射的页面,如图4.11所示。     图4.1l  编辑框控件与字段变量映射页面   (6)选中IDC_EDITNF(年份编辑)控件资源索引,再单击Add Variable按钮,出现变量选择列表框。在字段选择列表框中选择“年份”成员变量,如图4.12所示。     图4.12  字段成员变量列表   (7)单击OK按钮,即完成“年份”编辑框与“年份”字段成员变量的映射。 采用相同的方法为全部编辑框控件建立消息映射,然后编译对话框,则发现可以在编辑框中修改数据表中的记录。 4.5.3  为命令按钮增加函数并编制过程代码 事实上,在前面我们已经在编辑框与数据集之间建立了一种映射关系,但处理数据的功能还不是很完善。为此我们需要用一些命令来完成对数据的操作,需要为命令按钮建立函数和编制过程代码。同样,在对话框中存在多个命令按钮,我们以“第一条记录”命令按钮为例来说明建立函数与编制过程的方法。 1.“第一条记录”命令按钮的过程代码 (1)在对话框中选取“第一条记录”命令按钮。 (2)用鼠标右键单击该命令按钮,出现一个快捷菜单。 (3)在快捷菜单中单击“建立类向导”菜单项,出现一个消息映射的对话框。 (4)在消息映射的对话框中选择Message Maps页面,选择消息类型为“ON_CLICKED”并单击Add Function按钮,出现一个函数命令对话框,建议接受系统命名的函数名即可。 (5)确认函数名后单击Edit Code按钮,出现代码编辑框,在代码编辑框中编辑命令按钮的代码,如下所示: void CMyView : : OnButtonfirst () { / / TODO: Add your control notification handler code here m_pSet - > MoveFirst (); if (m_pSet - > IsBOF()) { MessageBox (“记录已经在第一条!”) m_pSet - > MoveNext (); UpdateData (FALSE); Return; } UpdateData (FALSE);   } 这样,“第一条记录”命令按钮的过程代码就编辑完成了。 采用同样的方法,我们可以编辑其他命令按钮的过程代码。 2.“下一条记录”命令按钮的过程代码 void CMyView : : OnButtonnext () { / / TODO: Add your control notification handler ode here m_pSet - > MoveNext(); if (m_pSet - > IsEOF ()) { MessageBox (“记录已经在最后一条!”); m_pSet - > MovePrev (); UpdateData (FALSE); Return; } UpdateData (FALSE);   } 3.“前一条记录”命令按钮的过程代码 void CMyView : : OnButtonprev () { / / TODO: Add your control notification handler code here m_pSet - >MovePrev (); if (m_pSet - >IsBOF()) { MessageBox (“记录已经在第一条!”); m_pSet - >MoveNext (); UpdateData (FALSE); return; } UpdateData (FALSE);   } 4.“最后一条记录”命令按钮的过程代码 void CMyView : : OnButtonlast () { / / TODO: Add your control notification handler code here m_pSet - >MoveLast (); if (m_pSet - >IsEOF ()) { MessageBox (“记录已经在最后一条!”); m_pSet - >MovePrev (); UpdateData (FALSE); Return; } UpdateData (FALSE); } 5.“增加记录”选项按钮的过程代码 void CMyView : : OnRadiodd () { //TODO: Add your control notification handler code here m_pSet - >AddNew (); UpdateData (FALSE);   } 6.“删除记录”选项按钮的过程代码 void CMyView : : OnRadiodelete () { //TODO: Add your control notification handler code here m_pSet - >Delete (); m_pSet - >MoveNext (); if (m_pSet - >IsEOF ())     m_pSet  - > MoveLast (); if (m_pSet -> IsBOf())     m_pSet - > SetFieldNull (NULL); UpdateData (FALSE);   } 7.“刷新记录”选项按钮的过程代码 void CMyView : : OnRadioupdate () { //TODO: Add your control notification handler code here   m_pSet->Edit (); UpdateData (); m_pSet-> Update (); m_pSet-> Requery (); m_pSet-> CancelUpdate ();   } 8.“执行统计”命令按钮的过程代码 void CMyView : : OnButtonsum () { //TODO: Add your control notification handler code here m_pSet->Edit (); m_pSet->m_YES = m_pSet ->m_JBGZ+m_pSet->m_JJ+m_pSet->m_YJGZ+m_pSet->m_JT+ m_pSet->m_GZBZ; m_pSet->m_KCZJ=m_pSet->m_CX+m_pSet->m_HF+m_pSet->m_FZOU+m_pSet->m_RDF +m_pSet->m_BX; m_pSet->m_SFGZ= m_pSet->m_YES- m_pSet->m_KCZZ; UpdateData (FALSE); m_pSet->Requery(); m_pSet->Update(); } 最后编译执行工程,检验对话框中的数据处理效果,如图4.13所示。     图4.13  对话框运行效果   4.5.4  资源文件分析 在工程创建完成后,读者可以对已经创建的工程的一些文件进行阅读和分析。人们常说:软件=文档+代码,这一“等式”几乎对于一切的开发平台都是适用的;这里的文档包括用户创建的文档和系统派生的文档两类,无论是用户创建的文档或是系统派生的文档,它们往往都是对系统开发的过程的“记录”。因此,通过阅读这些“记录”,不仅对VC++开发环境有了更深入的了解,而且对整个系统的实现全过程也一清二楚。本小节分析两个文档,一个是工程实现文档,另一个是工程设置文档。 1.“工资管理系统”工程实现文件 工资管理系统实现文件记录了该工程创建的声明、编写的过程代码、资源的消息映射、数据集的创建和控件映射等等内容,工程实现文档往往是用户开发过程中编写最多的文档,一切的过程代码编制往往都是在工程实现文档中进行的。“工资管理系统”工程实现文档的全部内容如下所示(仅供读者在开发实践中参考,若无必要,也可以略去对这部分的阅读): //工资管理系统View.cpp : implementation of the CMyView class   # include “stdafx.h” # include “工资管理系统.h”   # include “工资管理系统Set.h” # include “工资管理系统Doc.h” # include “工资管理系统View.h”   # ifdef _DEBUG # define new DEBUG_NEW # undef THIS_FILE static char THIS_FILE [] = __FILE__; # endif   ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// //CMyView   IMPLEMENT_DYNCREATE (CMyView, CRecordView)   BEGIN_MESSAGE_MAP (CMyView, CRecordView) //{{AFX_MSG_MAP (CMyView) ON_BN_CLICKED (IDC_BUTTONFIRST, OnButtonfirst) ON_BN_CLICKED (IDC_BUTTONNEXT, OnButtonnext) ON_BN_CLICKED (IDC_BUTTONPREV, OnButtonprev) ON_BN_CLICKED (IDC_BUTTONLAST, OnButtonlast) ON_BN_CLICKED (IDC_RADIODD, OnRadiodd) ON_BN_CLICKED (IDC_RADIODELETE, OnRadelete) ON_BN_CLICKED (IDC_RADIOUPDATE, OnRadioupdate) ON_BN_CLICKED (IDC_BUTTONSUM, OnButtonsum) ON_BN_CLICKED (IDC_RADIOEDIT, OnRadioedit) //}}AFX_MSG_MAP //Standard printing commands ON_COMMAND (ID_FILE_PRINT, CRecordView : : OnFilePrint) ON_COMMAND (ID_FILE_DIRECT, CRecordView : : OnFilePrint) ON_COMMAND (ID_FILE_PREVIEW, CRecordView : : OnFilePrieview) END_MESSAGE_MAP ()   / / / / / / / / // / / / / // / / / / / / / / / / / // / / / / // / / / / / / / / / / / // / / / / // / / / //CMyView construction/destruction CMyView : : CMyView () : CRecordView (CMyView : : IDD) { //{{AFX_DATA_INIT (CMyView) m_pSet = NULL; //}} AFX_DATA_INIT //TODO: add construction code here   }   CMyView : : ~CMyView () { }   void CMyView : : DoDataExchange (CDataExchange* pDX) { CRecordView : : DoDataExchange (pDX); //{{AFX_DATA_MAP (CMyView) DDX_FieldText (pDX, IDC_EDITNF, m_pSet - > m_NF, m_pSet); DDX_FieldText (pDX, IDC_EDITYF, m_pSet - > m_YF, m_pSet); DDX_FieldText (pDX, IDC_EDITZGBH, m_pSet - > m_ZGBH, m_pSet); DDX_FieldText (pDX, IDC_EDITZGBM, m_pSet - > m_BM, m_pSet); DDX_FieldText (pDX, IDC_EDITZGXM, m_pSet - > m_XM, m_pSet); DDX_FieldText (pDX, IDC_EDITJBGZ, m_pSet - > m_JBGZ, m_pSet); DDX_FieldText (pDX, IDC_EDITJJ, m_pSet - > m_JJ, m_pSet); DDX_FieldText (pDX, IDC_EDITSFGZ, m_pSet - > m_SFGZ, m_pSet); DDX_FieldText (pDX, IDC_EDITYFHJ, m_pSet - > m_YFS, m_pSet); DDX_FieldText (pDX, IDC_EDITKCHJ, m_pSet - > m_KCZJ, m_pSet); DDX_FieldText (pDX, IDC_EDITBX, m_pSet - > m_NF, m_pSet); DDX_FieldText(pDX, IDC_EDITBX, m_pSet->m_BX, m_pSet); DDX_ FieldText(pDX, IDC_EDITCX, m_pSet->m_CX, m_pSet); DDX _FieldText(pDX, IDC _EDITFZOU, m_pSet->m_FZOU, m_pSet); DDX _FieldText(pDX, IDC _EDITGZBZ, m_pSet->m_GZBZ, m_pSet); DDX _FieldText(pDX, IDC _EDITHF, m_pSet->m_HF, m_pSet); DDX _FieldText(pDX, IDC_ EDITJT, m_pSet->m_JT, m_pSet); DDX _FieldText(pDX, IDC_EDITRDF, m pSet->m_RDF, m pSet); DDX_FieldText(pDX, IDC_EDITYJGZ, m_pSet->m_YJGZ, m_pSet); //}}AFX_ DATA_ MAP } BOOL CMyView :: PreCreateWindow(CREATESTRUCT& { //TODO: Modify the Window class or styles here by modifying //the CREATESTRUCT cs   return CRecordView :: PreCreateWindow(cs); } void CMyView::OnInitialUpdate() { m_pSet = &GetDocument()->m_mySet; CRecordView :: OnInitialUpdate(); GetParentFrame () ->RecalcLayout(); Resize ParentToFit(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////// //CMyView printing BOOL CMyView :: OnPreparePrinting(CPrintInfo* pInfo) { //default preparation return DoPreparePrinting(pInfo); } void CMyView::OnBeginPrinting(CDC* /*pDC*/,  CPrintInfo* /*pInfo*/) { //TODO: add extra initialization before printing } void CMyView :: OnBeginPrinting (CDC* /*pDC*/,  CPrintInfo* /*pInfo*/) //TODO: add cleanup after printing ////////////////////////////////////////////////////////////////////////////////////////////////////////// // CMyView diagnostics   # ifdef _DEBUG void CMyView :: AssertValid () const { CRecordView :: AssertValid (); } void CMyView ::  Dump (CDumpContext & sc) const { CRecordView :: Dump(dc); { CMyDoc* CMyView :: GetDocument ()  // non-debug version is inline ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc))); Return  (CMyDoc*)m_pDocument; } # endif //_DEBUG //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //CMyView database support CRecordset* CMyView :: OnGetRecordset() { return m_pSet; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //CMyView message handlers   void CMyView :: OnButtonfirst() {  //TODO: Add your control notification handler code here  m_pSet->MoveFirst ();  if(m_pSet->IsBOF ())  {  Mes sageBox ( "记录已经在第一条!");  m_pSet->MoveNext ();    UpdateData (FALSE);    return;    }    UpdateData ( FALSE); } void CMyView :: OnButtonnext () {        // TODO: Add your control notification handler code here        M_ pSet->MoveNext ();        If (m_pSet->IsEOF())  {        MessageBox ( "记录已经在最后一条 ! ");        m_pSet->MovePrev ();        UpdateData(FALSE);        return;        }       UpdateData (FALSE); } void CMyView::OnButtonprev () {        // TODO: Add your control notification handler code here m_pSet->MovePrev ();        if(m_pSet->IsBOF())  {        MessageBox("记录已经在第一条!");        m_ pSet->MoveNext ();        UpdateData(FALSE);        return;       }       UpdateData (FALSE); } void CMyView::OnButtonlast () }   // TODO: Add your control notification handler code here       m_pSet->Edit ();       if m_pSet->IsEOF())       {       MessageBox("记录已经在第一条!"); m_pSet->MovePrev ();           -  UpdateData(FALSE);  return;  }  UpdateData(FALSE);             } void CMyView :: OnRadiodd() {    
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 应用文书 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服