程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 利用非模窗口生成MDI界面

利用非模窗口生成MDI界面

編輯:關於VC++

我想生成一個MDI窗口的界面,但發現用VC實現起來很麻煩,要加很多很多的RUNTIME_CLASS,而且不能實現在主窗口中加入功能選項。就是說生成一個OUTLOOK的主窗口,在主窗口中再加入多文檔窗口(象OFFICE的多文檔子窗口)。因此,寫了這個 CMDIChild 類。效果如圖一所示。

要實現本類:

第一步:生成一個單文檔程序(基類是CFormView)。

第二步:在工程中加入 MDIChild.H 和 MDIChild.cpp 兩個文件。

第三步:在主窗口中加入一個變量 CMDIChild m_Child。

#include "MDIChild.H"
class CMainFrame : public CFrameWnd
{
protected: // create from serialization only
  CMainFrame();
  DECLARE_DYNCREATE(CMainFrame)
  // Attributes
public:
  CMDIChild m_Child; ///////////////////////////////
  .....
}

第四步:在 OnCreate() 事件中加入m_Child.InitMainWnd(this)。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  ......
    RECT Rect;
  SetRect(&Rect, 0,64,800, 574); // 非模子窗口的活動區域,沒想出自動計算的好辦法,
  m_Child.InitMainWnd(this, &Rect); //所以只能手工設置。
}

第五步:增加菜單事件

#include "Dlg1.H"
void CMainFrame::OnDialog1()
{
  CDlg1 *pDlg = NULL;
  char *sName = "功能1"; ////////////////////////////////
  if(!m_Child.GetClassChild(sName))
  {
    pDlg = new CDlg1;
    if(!pDlg) return;
    pDlg->Create(IDD_DIALOG1, this);
  }
  m_Child.ADD((CView*)pDlg, sName);
}

第六步:補充CDlg1是一個CDialog的彈出窗口,將普通彈出窗口轉變成非模窗口的方法在網上有很多,這裡就不多說了,也可以自己看代碼。非模子窗口是用名稱進行管理的,就是說可以生成兩個基類相同的窗口,但是它們 在 m_Child.ADD 的時候要用不同的名稱登記。

技術細節:

利用非模窗口在彈出時依然響應消息流的特點,程序主要是通過管理主窗和非模子窗口,讓它們在得到和失去焦點的時候標題欄依然顯示正常。因為,激活非模子窗口時會使主窗口的標題變灰,激活主窗口時非模子窗口也會變灰。要實現這種功能並不困難,但要把這些功能封裝成一個類方便使用就比較復雜。我是運用 了 SetWindowLong(hWnd,GWL_WNDPROC,(LONG)MDIChildProc) 來欄截主窗口和非模子窗口的信息。在 MDIChildProc 和 MDIMainProc 兩個函數中處理標題欄。

缺點:

沒有想出方便的方法得到主窗口客戶區的大小,因此我強制了主窗口始終為最大化,並且需要手工計算出客戶區的大小。以後我就不用它了。

圖一 圖像描述

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved