首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

個人考勤軟體開發實例:對話方塊型應用實現列印預覽的非標準架構

     編輯:關於VC++

本軟體為對話方塊型個人考勤工具,功能:系統時鐘取時、點擊記錄上下班工時、月統計/年彙總/歷史查詢/月報表列印、年彙總可選月份檢視列印。

核心架構:嵌入子框架與子視圖

對話方塊型應用原無 CFrameWnd/CView,為實現列印功能,採用「子框架 CChildFrame + 子視圖 CChildView」嵌入主對話方塊的非常規 MFC 架構(改良自《Visual C++ 程式設計高手》範例)。

實作關鍵步驟

  1. InitInstance 建立主對話方塊並雙重保存指標
    CAttendanceDlg dlg;
    m_pMainWnd = &dlg;
    m_pMiddle = &dlg; // 保留主視窗參考
  2. 主對話方塊 OnCreate 建立隱藏子框架
    CChildFrame* pFrame = new CChildFrame;
    m_pChildFrame = pFrame;
    pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL);
    pFrame->ShowWindow(SW_HIDE);
  3. 子框架 OnCreate 建立隱藏子視圖並設為作用中視圖
    CCreateContext ctx;
    ctx.m_pNewViewClass = RUNTIME_CLASS(CChildView);
    ctx.m_pCurrentFrame = this;
    m_pView = STATIC_DOWNCAST(CChildView, CreateView(&ctx));
    if (m_pView) { m_pView->ShowWindow(SW_HIDE); SetActiveView(m_pView); }
  4. 列印/預覽觸發:主對話方塊向子框架發送命令
    // 列印
    m_pChildFrame->SendMessage(WM_COMMAND, ID_FILE_PRINT);
    // 預覽
    m_pChildFrame->ShowWindow(SW_SHOW);
    m_pChildFrame->SendMessage(WM_COMMAND, ID_FILE_PRINT_PREVIEW);
  5. 子框架預覽處理:暫時替換 m_pMainWnd 為自身
    CAttendanceApp* app = (CAttendanceApp*)AfxGetApp();
    app->m_pMainWnd = this;
    m_pView->ShowWindow(SW_SHOW);
    SetActiveView(m_pView);
    m_pView->OnFilePrintPreview(this);
  6. 預覽結束清理:恢復隱藏與 m_pMainWnd
    pParent->ShowWindow(SW_HIDE);
    pParent->UpdateWindow();
    app->m_pMainWnd = app->m_pMiddle;
    app->m_pMiddle->UpdateWindow();

    置於 CWrapperView::OnEndPrintPreview 結尾。

  7. 子框架菜單資源 IDR_MAINFRAME 僅含列印/預覽
  8. 列印版面於 CChildView::OnDraw 繪製
  9. SetPrntOrientation() 強制直向列印

此架構巧妙繞過 MFC 文檔/視圖框架限制,讓對話方塊型應用擁有完整列印預覽能力。完整原始碼請參考附件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved