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

ActiveX 控制項整合對話框、FormView 與 Document/View 架構完整指南

     編輯:關於C++

一、引入模態對話框

  1. 專案:MFC ActiveX ControlWizard → Hello
  2. 資源視圖新增對話框 IDD_HELLODIALOG
  3. 類向導建立 CHelloDialog : public CDialog
  4. HelloCtrl.h 加入 #include "HelloDialog.h" 與成員 CHelloDialog m_helloDialog;
  5. 自動化方法 void DoHello():

void CHelloCtrl::DoHello() { m_helloDialog.DoModal(); }

二、引入非模態對話框


int CHelloCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) {
    if (COleControl::OnCreate(lpCreateStruct) == -1) return -1;
    m_helloDialog.Create(IDD_HELLODIALOG); // 建立非模態
    return 0;
}
void CHelloCtrl::DoHello() { m_helloDialog.ShowWindow(SW_SHOW); }

三、以對話框作為控制項繪圖介面 (Child 模式)

對話框屬性設定:

  • Style: Child
  • Border: Dialog Frame
  • Title Bar: Unchecked
  • More Styles: Visible ✓, Control ✓
  • Extended Styles: Static Edge ✓

int CHelloCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) {
    if (COleControl::OnCreate(lpCreateStruct) == -1) return -1;
    m_helloDialog.Create(IDD_HELLODIALOG, this); // 父視窗為控制項
    return 0;
}
void CHelloCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) {
    m_helloDialog.MoveWindow(rcBounds, TRUE); // 同步大小
}

四、引入 FormView

  1. 新增對話框資源 IDD_HELLOFORMVIEW,屬性同 Child 模式
  2. 類向導建立 CHelloFormView : public CFormView
  3. HelloFormView.h:建構子/解構子改 public,加 friend class CHelloCtrl;
  4. HelloCtrl.h 成員 CHelloFormView m_helloFormView;

int CHelloCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) {
    if (COleControl::OnCreate(lpCreateStruct) == -1) return -1;
    m_helloFormView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
                           CRect(0,0,0,0), this, AFX_IDW_PANE_FIRST, NULL);
    return 0;
}
void CHelloCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) {
    m_helloFormView.MoveWindow(rcBounds, TRUE);
}

五、引入 Document/View 架構 (獨立執行緒框架視窗)

  1. 新增類別:CPrintFrame : CFrameWnd, CPrintView : CView, CPrintDoc : CDocument, CPrintThread : CWinThread
  2. 所有建構子/解構子設 public
  3. HelloCtrl.h 成員 CPrintThread* m_pPrintThread;

void CHelloCtrl::DoHello() {
    m_pPrintThread = (CPrintThread*)AfxBeginThread(RUNTIME_CLASS(CPrintThread),
                                                     THREAD_PRIORITY_NORMAL, CREATE_SUSPENDED);
    m_pPrintThread->ResumeThread();
}

// CPrintThread::InitInstance
BOOL CPrintThread::InitInstance() {
    CPrintFrame* pFrame = new CPrintFrame;
    m_pMainWnd = pFrame; m_pPrintFrame = pFrame;
    m_pPrintDoc = new CPrintDoc;
    CCreateContext ctx;
    ctx.m_pCurrentDoc = m_pPrintDoc;
    ctx.m_pNewViewClass = RUNTIME_CLASS(CPrintView);
    pFrame->Create(NULL, _T("列印主視窗"), WS_OVERLAPPEDWINDOW,
                   CRect(0,0,100,100), NULL, NULL, 0, &ctx);
    pFrame->InitialUpdateFrame(m_pPrintDoc, TRUE);
    return TRUE;
}

// CPrintThread 建構/解構管理 Doc/Frame 生命週期
CPrintThread::CPrintThread() : m_pPrintDoc(NULL), m_pPrintFrame(NULL) {}
CPrintThread::~CPrintThread() {
    if (m_pPrintFrame) delete m_pPrintFrame;
    if (m_pPrintDoc)   delete m_pPrintDoc;
}

六、實現 ActiveX 列印預覽

  1. CPrintView 覆寫 OnPreparePrinting:return DoPreparePrinting(pInfo);
  2. CHelloCtrl 加自動化方法 DoPreview()、SetPreviewControl()
  3. 自訂訊息 WM_USER_PREVIEW = WM_USER + 10

// CHelloCtrl
void CHelloCtrl::DoPreview() {
    ::PostMessage(m_pPrintThread->m_pPrintFrame->GetActiveView()->m_hWnd,
                  WM_USER_PREVIEW, 0, 0);
}
void CHelloCtrl::SetPreviewControl() {
    CView* pView = m_pPrintThread->m_pPrintFrame->GetActiveView();
    static_cast(pView)->m_pControlPreview = this;
}

// CPrintView
#define WM_USER_PREVIEW WM_USER + 10
BEGIN_MESSAGE_MAP(CPrintView, CView)
    ON_MESSAGE(WM_USER_PREVIEW, DoPreview)
END_MESSAGE_MAP()

LRESULT CPrintView::DoPreview(WPARAM, LPARAM) {
    OnFilePrintPreview(); return 0;
}

void CPrintView::OnDraw(CDC* pDC) {
    if (!m_pControlPreview) { pDC->TextOut(0,0,_T("No Preview")); return; }
    CRect cr; m_pControlPreview->GetClientRect(&cr);
    m_pControlPreview->OnDraw(pDC, cr, cr);
}

測試順序

  1. 啟動控制項
  2. 呼叫 DoHello() 建立列印執行緒
  3. 呼叫 SetPreviewControl() 綁定預覽來源
  4. 呼叫 DoPreview() 觸發預覽

關鍵架構圖

ActiveX 控制項 (UI 執行緒)
    │
    ├─ DoHello() → CPrintThread (UI 執行緒)
    │                │
    │                ├─ CPrintFrame (框架視窗)
    │                │     └─ CPrintView (視圖)
    │                │
    │                └─ CPrintDoc (文件)
    │
    ├─ SetPreviewControl() → CPrintView::m_pControlPreview = this
    │
    └─ DoPreview() → PostMessage → CPrintView::OnFilePrintPreview()
                          └─ OnDraw → m_pControlPreview->OnDraw()
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved