這是我學習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);
}