这是我学习VC MDI框架时写的,在VC6下通过。源代码已上传至CSDN资源。http://download.csdn.net/source/2448780
一、创建MDI项目
1、建立MDI项目WorkHelper,MDI类型,初始视图为FormView。
2、添加ADO数据库支持。
1) StdAfx.h中加入
#pragma warning (disable: 4146)
#import "c:/Program Files/Common Files/system/ado/msadox.dll"
#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF","adoEOF")
#pragma warning (default: 4146)
2) App的InitInstance中加入OLE库支持。
3) App中添加以下变量及数据库连接函数。
_RecordsetPtr m_pRecordset; //记录
_ConnectionPtr m_pConnection; //连接
int DisConnectDB(void); //断开连接
int ConnectDB(); //连接数据库
4) 在ExitInstance()加入数据库实例清理功能。
if(m_pConnection != NULL)
DisConnectDB();
3、其它
1) 加入只允许一个实例。
protected:
HANDLE hMutex;
//只允许一个实例运行
CString smutex="oneInstanceMutesNew";
hMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE,smutex);
if(hMutex == NULL)
{
hMutex = CreateMutex(NULL,TRUE,smutex);
}
else
{
AfxMessageBox("系统已经运行!");
return FALSE;
}
2) 添加CZWfun和md5类。 //CZWfun是我自己使用的一个小工具类,没难度
3)添加Splash。
工程->添加工程->Components and Controls … ->插入 Splash Screen。
更改资源中的IDB_SPLASH图片。
CSplashWnd::OnCreate中更改Splash显示时间。
二、登录与注销
1、登录
CDlgLogin对话框类,检测用户名与密码不能用空,密码加密,然后连接数据库核对用户名密码,如核对成功,则更新登录时间。允许错误三次,三次后则退出。
2、注销
直接响应应用程序关闭消息,暂不做其它处理。
三、主窗口
1、CwinApp
定义
CMultiDocTemplate* pDocTemplateDiary;
CMultiDocTemplate* pDocTemplateSystem;
CMultiDocTemplate* pDocTemplate;
WorkHelper.cpp中加入必要的头文件
#define IDR_SYSTEMTYPE WM_USER+1
#define IDR_DIARYTYPE WM_USER+2
在InitInstance()中
pDocTemplate = new CMultiDocTemplate( //主窗口
IDR_WORKHETYPE,
RUNTIME_CLASS(CWorkHelperDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CWorkHelperView));
AddDocTemplate(pDocTemplate);
pDocTemplateSystem = new CMultiDocTemplate( //系统配置
IDR_SYSTEMTYPE,
RUNTIME_CLASS(CWorkHelperDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CDlgSystem));
AddDocTemplate(pDocTemplateSystem);
pDocTemplateDiary = new CMultiDocTemplate( //业务日记
IDR_DIARYTYPE,
RUNTIME_CLASS(CWorkHelperDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CDlgDiary));
AddDocTemplate(pDocTemplateDiary);
2、CMainFrame
加入对应的消息映射处理
void CMainFrame::OnOfficeDiary()
{
// TODO: Add your command handler code here
CMDIChildWnd* pChild = MDIGetActive();
CDocument * pDoc;
if(pChild == NULL || (pDoc=pChild->GetActiveDocument()) == NULL)
{
pChild = new CMDIChildWnd();
pDoc = new CWorkHelperDoc();
}
CView* pView;
POSITION pos = pDoc->GetFirstViewPosition();
while (pos != NULL)
{
pView = pDoc->GetNextView(pos);
if (pView->IsKindOf(RUNTIME_CLASS(CDlgDiary))) //如子窗口已打开则激活
{
pView->GetParentFrame()->ActivateFrame();
return;
}
}
//创建相应子窗口
CDocTemplate * pTemplate = ((CWorkHelperApp *)AfxGetApp())->pDocTemplateDiary;
ASSERT_VALID(pTemplate);
CFrameWnd * pFrame = pTemplate->CreateNewFrame(pDoc,pChild);
if(pFrame == NULL)
{
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
return;
}
pTemplate->InitialUpdateFrame(pFrame,pDoc);
//动态设置窗口风格
pView = pFrame->GetActiveView();
//pView->GetParentFrame()->ModifyStyle(WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU,WS_CAPTION, SWP_DRAWFRAME);
pView->GetParentFrame()->ModifyStyle(0,WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU,SWP_DRAWFRAME);
}