基于MFC的学生成绩管理系统的设计与实现,MFC中

作者: 编程技术  发布:2019-09-23

1、技能介绍
MFC是微软基础类库的简称,是微软集团落到实处的八个C++类库,首要封装了比相当多的WINDOWS API函数,而且带有七个应用程序框架,以减掉应用程序开拓职员专门的学问量。VC++是微软集团开荒的C/C++的购并开垦条件,所谓集成开采条件,即是说利用它你能够编写,编写翻译,调节和测量试验,并非行使多种工具轮换操作,灵活性相当大。有时大家说VC呢也指它的中间编写翻译器,集成开拓条件必需有二个编写翻译器内核,要不有怎么样用,举例DEVC++在那之中二个编写翻译器内核便是GCC。 MFC除了是二个类库以外,照旧贰个框架,你应该试过,在VC++里新建一个MFC的工程,开荒条件会自行帮你生出非常多文本,同时它使用了mfcxx.dll。xx是本子,它包裹了MFC内核,所以你在你的代码看不到原来的SDK编制程序中的音信循环等等东西,因为MFC框架帮您封装好了,那样你就能够专注的思索你程序的逻辑,并非那些每趟编制程序都要再度的事物,可是出于是通用框架,未有最佳的对准,当然也就丧失了有的世故和频率。可是MFC的卷入很浅,所以效用上损失相当小,灵活性还是能,纵然也可能有为数相当多瑕玷,但要么叁个比较好的东西。

五、MFC对多线程编制程序的协助

2、作用供给
趁着消息化时期的赶来,使用软件技术实行数量管理已经成为了一项特别推广的数据管理办法。而本校作为三个可怜宏伟的团体群众体育,对于学员的大成管理也是一项非常光辉的劳作。由此各大高校就供给一款能够辅助这个学院开展学生成绩管理的软件程序。
一款好的上学的小孩子战表管理种类应该具有管理端和学员端五个部分,当中管理端能够对学生的音信实行管理,满含充裕学生战表音信、修改学生战表信息、删除学生战表音讯、导出学生成绩、条件查询学生战绩等成效;而学员端则只好开展学生成绩的查阅与查询操作。
管理端:
丰硕学生战表:能够拓宽学生语文、数学、法文、物理、化学、生物、体育八门学科战绩的拉长。
修改学生成绩:在班级模块点击内定的学员数量,点击“修改”按键能够对所选中的上学的小孩子成绩举办修改操作。
除去学生成绩:选中学生成绩音信后,点击“删除”按键能够对所选中的学生战绩音信进行删除操作。
导出学生成绩:点击“导出”能够对系统中已有个别学员战表消息举办导出操作,导出的格式为Excel格式,文件名由顾客自行定义。
标准查询:条件查询分为两种,一种是通过学生的学号对学员的大成新闻进行询问操作,另一种是依赖学科以及分数区间对学生的实际绩效举行询问操作。

  MFC中有两类线程,分外号为工我线程和客户分界面线程。二者的要紧区别在于工笔者线程未有消息循环,而顾客分界面线程有投机的音信队列和音讯循环。
  工小编线程未有新闻机制,日常用来进行后台计算和护卫职务,如冗长的乘除进程,打字与印刷机的后台打字与印刷等。客商分界面线程一般用于拍卖独立于别的线程实践之外的客商输入,响应客商及系统所产生的事件和音信等。但对此Win32的API编制程序来讲,那三种线程是从未分其余,它们都只需线程的开发行址就可以运营线程来实施职责。
  在MFC中,一般用全局函数AfxBeginThread()来创建并最初化一个线程的运维,该函数有三种重载方式,分别用于创立工作者线程和客户分界面线程。两种重载函数原型和参数分别证实如下:

3、代码达成
创办数量链接完结代码如下:
void CAccessConn::OnInitAccessConn()
{
CoInitialize;
try
{
m_pConnection.CreateInstance(“ADODB.Connection”);
m_pConnection->ConnectionString=“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db11.mdb”;

(1) CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,                      LPVOID pParam,                      nPriority=THREAD_PRIORITY_NORMAL,                      UINT nStackSize=0,                      DWORD dwCreateFlags=0,                      LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);

m_pConnection->Open("","","",adModeUnknown);
1
}
catch(_com_error e)
{
AfxMessageBox(e.Description;
}
}
报到校验完毕代码如下:
void CDlgDR::OnOK()
{
// TODO: Add extra validation here
UpdateData();
CString str;
CAccessConn m_Conn;
m_Conn.OnInitAccessConn();
_RecordsetPtr m_Set;
_bstr_t vSQL;
if
vSQL=“select * from managemessage”;
else
vSQL=“select * from studentmassage”;
m_Set=m_Conn.GetRecordSet;
while(!m_Set->adoEOF)
{
if(str=m_Set->GetCollect),strm_HaoMa)
{
str=m_Set->GetCollect;
if(strm_MiMa)
{
MessageBox;
//m_Set->Close();
//m_Set.Release();
m_Conn.CutConn();

PfnThreadProc:指向工小编线程的试行函数的指针,线程函数原型必得注脚如下:

CDialog::OnOK();
return ;

UINT ExecutingFunction(LPVOID pParam);

}
}
m_Set->MoveNext();
1
2
3
4
5
6
}
static n=0;
n++;
MessageBox(“帐号或密码错误!”);

请留神,ExecutingFunction()应再次回到一个UINT类型的值,用以指明该函数停止的原由。一般情状下,重临0评释施行成功。

if
{
//m_Set->Close();
//m_Set.Release();
m_Conn.CutConn();
SendMessage(WM_CLOSE,0,0);
}
//CDialog::OnOK();
}
4、项目显得

  • pParam:传递给线程函数的一个30人衔数,实践函数将用某种格局讲解该值。它能够是数值,或是指向一个组织的指针,乃至能够被忽略;
  • nPriority:线程的事先级。若是为0,则线程与其父线程具备一样的优先级;
  • nStackSize:线程为友好分配饭店的轻重,其单位为字节。假诺nStackSize被设为0,则线程的旅馆被设置成与父线程仓库同样大小;
  • dwCreateFlags:要是为0,则线程在创建后马上最早试行。倘若为CREATE_SUSPEND,则线程在开创后立时被挂起;
  • lpSecurityAttrs:线程的安全品质指针,一般为NULL;

图片 1

 下载地址:http://webcodeschool.hrxxkj.com/webindex
 (2) CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass,                      int nPriority=THREAD_PRIORITY_NORMAL,                      UINT nStackSize=0,                      DWORD dwCreateFlags=0,                      LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);

  

 

  pThreadClass 是指向 CWinThread 的一个导出类的运营时类对象的指针,该导出类定义了被创造的客商分界面线程的起步、退出等;其它参数的含义同格局1。使用函数的那一个原型生成的线程也可以有新闻机制,在随后的例子中大家将开掘同主线程的建制大概等同。

下面大家对CWinThread类的多寡成员及常用函数实行简易表明。

  • m_hThread:当前线程的句柄;
  • m_nThreadID:当前线程的ID;
  • m_pMainWnd:指向应用程序主窗口的指针
BOOL CWinThread::CreateThread(DWORD dwCreateFlags=0,UINT nStackSize=0,LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);

  该函数中的dwCreateFlags、nStackSize、lpSecurityAttrs参数和API函数CreateThread中的对应参数有同样含义,该函数实行成功,再次回到非0值,否则再次回到0。
  一般景观下,调用AfxBeginThread()来叁遍性地开创并运转三个线程,不过也得以通过两步法来创建线程:首先创设CWinThread类的三个目的,然后调用该目的的成员函数CreateThread()来运行该线程。

virtual BOOL CWinThread::InitInstance();

重载该函数以调节顾客界面线程实例的伊始化。早先化成功则赶回非0值,不然重返0。顾客分界面线程平常重载该函数,工小编线程一般不应用InitInstance()。

virtual int CWinThread::ExitInstance();

在线程终结前重载该函数进行部分必须的清总管业。该函数重临线程的退出码,0意味着实施成功,非0值用来标记各类不当。同InitInstance()成员函数同样,该函数也只适用于客商分界面线程。

六、MFC十二线程编制程序实例

  在Visual C++ 6.0编程意况中,大家不仅能够编写C风格的叁拾叁位Win32应用程序,也得以动用MFC类库编写C++风格的应用程序,二者各有其优瑕玷。基于Win32的应用程序推行代码小巧,运维效用高,但需要程序员编写的代码非常多,且需求管住连串提供给程序的全数能源;而基于MFC类库的应用程序能够便捷建构起应用程序,类库为程序猿提供了大批量的封装类,并且Developer Studio为程序猿提供了一些工具来治本客商源程序,其症结是类库代码很庞大。由于采纳类库所推动的长足、简捷和功效庞大等优越性,由此唯有有出色的急需,不然Visual C++推荐使用MFC类库实行程序支付。

我们了然,MFC中的线程分为二种:客商分界面线程和劳引力线程。大家将分头比如表达。

用 MFC 类库编制程序达成劳重力线程

例程5 MultiThread5

为了与Win32 API对照,咱们选拔MFC 类库编制程序达成例程3 MultiThread3。

  1. 确立一个依据对话框的工程MultiThread5,在对话框IDD_MULTITHREAD5_DIALOG中进入两个编写制定框IDC_MILLISECOND,一个开关IDC_START,标题为“开始” ,叁个进程条IDC_PROGRESS1;
  2. 开发ClassWizard,为编写制定框IDC_MILLISECOND添加int型变量m_nMilliSecond,为进程条IDC_PROGRESS1添加CProgressCtrl型变量m_ctrlProgress;
  3. 在MultiThread5Dlg.h文件中增多贰个构造的概念:

    struct threadInfo{UINT nMilliSecond;CProgressCtrl* pctrlProgress;};
    

    线程函数的宣示:

    UINT ThreadFunc(LPVOID lpParam); 
    

    留神,二者应在类CMultiThread5Dlg的表面。

    在类CMultiThread5Dlg内部增多protected型变量:

    CWinThread* pThread; 
    
  4. 在MultiThread5Dlg.cpp文件中开展如下操作: 定义公共变量:

    threadInfo Info; 
    

    双击开关IDC_START,加多相应消息管理函数:

    void CMultiThread5Dlg::OnStart() {// TODO: Add your control notification handler code hereUpdateData(TRUE);Info.nMilliSecond=m_nMilliSecond;Info.pctrlProgress=&m_ctrlProgress;pThread=AfxBeginThread(ThreadFunc,&Info);}
    

    在函数BOOL CMultiThread3Dlg::OnInitDialog()中加多语句:

    {……// TODO: Add extra initialization herem_ctrlProgress.SetRange(0,99);m_nMilliSecond=10;UpdateData(FALSE);return TRUE;  // return TRUE  unless you set the focus to a control}
    

    增加线程管理函数:

    UINT ThreadFunc(LPVOID lpParam){threadInfo* pInfo=(threadInfo*)lpParam;for(int i=0;i<100;i++){int nTemp=pInfo->nMilliSecond;pInfo->pctrlProgress->SetPos(i);Sleep(nTemp);}return 0;}
    

用 MFC 类库编程完毕用户分界面线程

创办客商界面线程的手续:

  1. 行使ClassWizard创设类CWinThread的派生类(以CUIThread类为例)

    class CUIThread : public CWinThread{DECLARE_DYNCREATE(CUIThread)protected:CUIThread();           // protected constructor used by dynamic creation// Attributespublic:// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CUIThread)public:virtual BOOL InitInstance();virtual int ExitInstance();//}}AFX_VIRTUAL// Implementationprotected:virtual ~CUIThread();// Generated message map functions//{{AFX_MSG(CUIThread)// NOTE - the ClassWizard will add and remove member functions here.//}}AFX_MSGDECLARE_MESSAGE_MAP()};
    
  2. 重载函数InitInstance()和ExitInstance()。

    BOOL CUIThread::InitInstance(){CFrameWnd* wnd=new CFrameWnd;wnd->Create(NULL,"UI Thread Window");wnd->ShowWindow(SW_SHOW);wnd->UpdateWindow();m_pMainWnd=wnd;return TRUE;}
    

    创办新的客户分界面线程

    void CUIThreadDlg::OnButton1() {CUIThread* pThread=new CUIThread();pThread->CreateThread();}
    

    请留心以下两点:

     

    A、在UIThreadDlg.cpp的开首参预语句:

    #include "UIThread.h"
    

    B、把UIThread.h中类CUIThread()的构造函数的风味由 protected 改为 public。

      客商分界面线程的推行顺序与应用程序主线程一样,首先调用客商分界面线程类的InitInstance()函数,假诺回去TRUE,继续调用线程的Run()函数,该函数的成效是运转叁个专门的学问的新闻循环,并且当接过WM_QUIT音讯后抛锚,在新闻循环进度中,Run()函数检查实验到线程空闲时(未有音信),也将调用OnIdle()函数,最终Run()函数重返,MFC调用ExitInstance()函数清理财富。
      你能够成立多少个从未分界面而有新闻循环的线程,举例:你能够从CWinThread派生贰个新类,在InitInstance函数中完成某项职分并赶回FALSE,那代表仅施行InitInstance函数中的职责而不实施音讯循环,你能够由此这种情势,达成三个劳力线程的职能。

例程6 MultiThread6

  1. 确立贰个依照对话框的工程MultiThread6,在对话框IDD_MULTITHREAD6_DIALOG中走入二个开关IDC_UI_THREAD,标题为“客商分界面线程”
  2. 右击工程并当选“New Class…”为工程增多基类为CWinThread派生线程类CUIThread。
  3. 给工程增多新对话框IDD_UITHREADDLG,标题为“线程对话框”。
  4. 为对话框IDD_UITHREADDLG创造一个根据CDialog的类CUIThreadDlg。使用ClassWizard为CUIThreadDlg类增添WM_LBUTTONDOWN音信的管理函数OnLButtonDown,如下:

    void CUIThreadDlg::OnLButtonDown(UINT nFlags, CPoint point) {AfxMessageBox("You Clicked The Left Button!");CDialog::OnLButtonDown(nFlags, point);}
    
  5. 在UIThread.h中添加

    #include "UIThreadDlg.h"
    

    并在CUIThread类中增添protected变量CUIThread m_dlg:

    class CUIThread : public CWinThread{DECLARE_DYNCREATE(CUIThread)protected:CUIThread();           // protected constructor used by dynamic creation// Attributespublic:// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CUIThread)public:virtual BOOL InitInstance();virtual int ExitInstance();//}}AFX_VIRTUAL// Implementationprotected:CUIThreadDlg m_dlg;virtual ~CUIThread();// Generated message map functions//{{AFX_MSG(CUIThread)// NOTE - the ClassWizard will add and remove member functions here.//}}AFX_MSGDECLARE_MESSAGE_MAP()};
    
  6. 各自重载InitInstance()函数和ExitInstance()函数:

    BOOL CUIThread::InitInstance(){m_dlg.Create(IDD_UITHREADDLG);m_dlg.ShowWindow(SW_SHOW);m_pMainWnd=&m_dlg;return TRUE;}int CUIThread::ExitInstance(){m_dlg.DestroyWindow();return CWinThread::ExitInstance();}
    
  7. 双击开关IDC_UI_THREAD,加多消息响应函数:

    void CMultiThread6Dlg::OnUiThread() {CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CUIThread));}
    

    并在MultiThread6Dlg.cpp的开首加上:

    #include "UIThread.h"
    

  好了,编写翻译并运转程序吗。每单击贰遍“顾客分界面线程”开关,都会弹出二个线程对话框,在任何叁个线程对话框内按下鼠标左键,都会弹出一个音信框。

 

比如不new出的非模态对话框
则m_dlg.Create(IDD_UITHREADDLG); //此处为不当
m_dlg.ShowWindow(SW_SHOW); 
m_pMainWnd=&m_dlg;

 

接下来在CUIThreadDlg 类中重载OnCancel(),调用DestroyWindow()就可以,而没有要求再调用CDialog::Oncancel(). 不要重载PostNcDestroy()中delete this;那样能够完全自由财富。 
这样int CUIThread::ExitInstance()
{
m_dlg.DestroyWindow();
return CWinThread::ExitInstance();
}
中的m_dlg.DestroyWindow();就不要供给了 ( badboyfind 公布于 二零零六-3-19 9:38:00)
 
图片 2 改正为
CUIThreadDlg *m_dlg = new CUIThreadDlg();
m_dlg->Create(IDD_UI_MUTITHREAD_DLG);
m_dlg->ShowWindow(SW_SHOW);
m_pMainWnd=m_dlg;

然后在CUIThreadDlg类中重载OnCancel(),调用DestroyWindow(),重载PostNcDestroy()中delete this;那样能够完全释放财富( badboyfind 公布于 二〇〇八-3-19 9:25:00)
 
图片 3 你们说的荒唐在上边
m_dlg.Create(IDD_UITHREADDLG); //此处为错误
m_dlg.ShowWindow(SW_SHOW); 
m_pMainWnd=&m_dlg;

自然要记得,在开立非模态对话框的时候,要new出来的对话框才须要DestroyWindow(),然后再在PostNcDestroy()中delete this;

提出阅读上边包车型地铁小说:
( badboyfind 发表于 2008-3-19 9:13:00)
 
图片 4 代码中
int CUIThread::ExitInstance()
{
m_dlg.DestroyWindow();
return CWinThread::ExitInstance();
}
不会被实施所以导致内部存款和储蓄器败露。
可以在void CUIThreadDlg::OnOK() 
{
// TODO: Add extra validation here

CDialog::OnOK();
DestroyWindow();
}

void CUIThreadDlg::OnCancel() 
{
// TODO: Add extra cleanup CDialog
CDialog::OnCancel();
DestroyWindow();
}
追加DestroyWindow();来销毁对象;
抑或在CUIThread中宣称的CUIThreadDlg指针来操作;
在void CUIThreadDlg::OnDestroy() 
{
CDialog::OnDestroy();
delete this;
// TODO: Add your message handler code here

}
调用delete this;
总的说来要把Create出的目的调用DestroyWindow()
来销毁

作者用的
ExitInstance里销毁 那么将要协和重载Run函数在当中开展拍卖信息来调用ExitInstance ( hongjie7117 发布于 二〇〇六-8-31 15:20:00)

本文由贝博体育app发布于编程技术,转载请注明出处:基于MFC的学生成绩管理系统的设计与实现,MFC中

关键词:

上一篇:如何设置Hystrix线程池大小
下一篇:没有了