本軟體為對話方塊型個人考勤工具,功能:系統時鐘取時、點擊記錄上下班工時、月統計/年彙總/歷史查詢/月報表列印、年彙總可選月份檢視列印。
對話方塊型應用原無 CFrameWnd/CView,為實現列印功能,採用「子框架 CChildFrame + 子視圖 CChildView」嵌入主對話方塊的非常規 MFC 架構(改良自《Visual C++ 程式設計高手》範例)。
CAttendanceDlg dlg;
m_pMainWnd = &dlg;
m_pMiddle = &dlg; // 保留主視窗參考
CChildFrame* pFrame = new CChildFrame;
m_pChildFrame = pFrame;
pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL);
pFrame->ShowWindow(SW_HIDE);
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); }
// 列印
m_pChildFrame->SendMessage(WM_COMMAND, ID_FILE_PRINT);
// 預覽
m_pChildFrame->ShowWindow(SW_SHOW);
m_pChildFrame->SendMessage(WM_COMMAND, ID_FILE_PRINT_PREVIEW);
CAttendanceApp* app = (CAttendanceApp*)AfxGetApp();
app->m_pMainWnd = this;
m_pView->ShowWindow(SW_SHOW);
SetActiveView(m_pView);
m_pView->OnFilePrintPreview(this);
pParent->ShowWindow(SW_HIDE);
pParent->UpdateWindow();
app->m_pMainWnd = app->m_pMiddle;
app->m_pMiddle->UpdateWindow();
置於 CWrapperView::OnEndPrintPreview 結尾。
此架構巧妙繞過 MFC 文檔/視圖框架限制,讓對話方塊型應用擁有完整列印預覽能力。完整原始碼請參考附件。