一個MDI窗口框架,可作爲簡單的MIS窗口框架使用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章