程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 軟件框架的利器、TangramMini組件應用教程六:MDI應用一

軟件框架的利器、TangramMini組件應用教程六:MDI應用一

編輯:關於VC++

上一篇中我介紹了TangramMini組件在SDI程序中的應用,從這一篇開始我計劃寫兩到三篇關於TangramMini組件在MDI應用程序中的使用,其實在MDI中的應用與SDI中應用創建步驟是一致的。在MDI應用程序中使用了TangramMini組件之後,使應用程序的框架設計更加快捷、簡單、易於修改,並且使MDI應用程序有了很強的個性化色彩。

TangramMini組件的安裝,請到http://www.tangrammini.com中下載組件安裝包並安裝。

由於在MDI應用程序中使用TangramMini組件與在SDI中的使用基本上一致,所以下面的說明我也采用了上一篇介紹SDI中應用TangramMini組件文檔的原版,只是稍微做一些修改。

首先我們要生成一個普通的MDI程序。啟動Microsoft Visual C++ 6.0開發環境,進入主菜單中的File->New,在New對話框,選擇Projects頁,然後選擇MFC AppWizard (exe),在Project name中輸入MDI(請注意:這裡的MDI是工程名,你也可以隨便取個什麼名字),然後單擊OK按鈕,在向導的第一頁選擇Multiple documents(多文檔)類型,然後單擊Finish完成單文檔程序的創建,你也可以不直接Finish,可以先Next做一些別的修改,然後完成。

由於不是對話框程序,這次我們不能直接在界面上拖入TangramMiniCtrl控件,只能動態創建TangramMiniCtrl控件,在這裡我們有兩個辦法創建TangramMiniCtrl,一個辦法當然是直接手工創建;另一個辦法就是利用TangramMiniB2C組件創建,因為TangramMiniB2C有輔助創建TangramMiniCtrl的功能,當然要利用TangramMiniB2C組件創建TangramMiniCtrl控件,我們就必須先創建TangramMiniB2C組件。在這裡我決定使用第二種辦法,就是利用TangramMiniB2C組件創建TangramMiniCtrl控件,因為方法更加簡單方便,編碼更少。在TangramMini組件安裝之後,所帶的案例中,這兩種創建方法都有相對應的例子,大家也可以自己查看。

為了編碼方便,我們直接從安裝包的案例源碼中找到TangramMini_i.c與TangramMini_i.h兩個文件復制到之前新建的MDI工程源碼下。搞定之後,我們前期工作准備完畢,開始編碼:

1、打開stdafx.h文件,加入包含頭文件語句:

#include "TangramMini_i.c"
#include "TangramMini_i.h"

為了編譯不出現問題,我這裡提醒大家,最好是先包含.c文件,再包含.h文件。

2、由於需要創建ActiveX組件,所以需要COM支持,在創建TangramMiniB2C組件之前必須調用CoInitialize(NULL)語句。

3、在CMainFrame類中分別加入成員變量m_pMiniB2C與m_pMiniCtrl,類型分別為ITangramMiniB2C*與ITangramMiniCtrl*類型。

4、修改CMainFrame類的OnCreate()函數,在函數尾部加入下例代碼(也是本篇中最主要的代碼):

CoInitialize(NULL);
HRESULT hr = CoCreateInstance(CLSID_TangramMiniB2C,
    NULL,
    CLSCTX_INPROC_SERVER,
    IID_ITangramMiniB2C,
    (LPVOID*)&m_pMiniB2C);
if (SUCCEEDED(hr) && (m_pMiniB2C != NULL))
{
    m_pMiniB2C->put_TargetHandle((LONG)m_hWnd);
    m_pMiniB2C->get_TangramMiniCtrl(&m_pMiniCtrl);
    VARIANT_BOOL bSucceed;
    m_pMiniCtrl->LoadFile(L"test.xtml",&bSucceed);
    m_pMiniCtrl->SetMDIClient(L"Page1_S0001_S0000",0,3,&bSucceed);
}
其中CoInitialize(NULL)為初始化,然後調用CoCreateInstance()函數創建TangramMiniB2C組件並保存在m_pMiniB2C成員變量中,創建TangramMiniB2C組件之後,開始由TangramMiniB2C組件輔助創建TangramMiniCtrl控件,在這裡我先說明下一下TangramMiniB2C的TargetHandle與TangramMiniCtrl兩個屬性,其中TargetHandle表示要創建的TangramMiniCtrl控件的父窗口,這裡設置為m_hWnd,表示將TangramMiniCtrl控件創建在主框架窗口上,成為主框架窗口的一個子窗口。TangramMiniB2C的TangramMiniCtrl屬性表示為創建後的TangramMiniCtrl控件的引用,在這裡我們用get_TangramMiniCtrl(&m_pMiniCtrl)得到創建後的TangramMiniCtrl控件的引用並返回給成員變量m_pMiniCtrl。

得到TangramMiniCtrl控件的引用之後,我們就像之前在對話框程序中使用TangramMiniCtrl控件了,首先調用LoadFile()方法加載框架文件,然後調用SetMDIClient(…)方法安裝框架以及客戶區。使用SetMDIClient的方法表示將TangramMiniCtrl控件填充當前視圖的位置,並將當前MDI客戶區平移到名為Page1_S0001_S0000(你也可以用別的有效空白視圖名稱)的Tangram空白視圖區域中。

BOOL SetMDIClient(BSTR strObjName, LONG nMDIHandle, LONG nMDIStyle);

由於TangramMini組件最初的設計目的是針對MDI應用程序而設計的,所以存在這個SetMDIClient方法,此方法存在三個參數,第一個參數就是像其它方法一樣,為Tangram空白視圖的名稱;第二個為MDI客戶區窗口句柄,如果為0表示自動匹配MDI客戶區,在此案例中,我們也可以設置此參數為m_hWndMDIClient,如果非MDI應用程序,就有必要指定一個有效的窗口句柄;第三個參數為MDI客戶區風格,其中nMDIStyle有效值為0、1、2、3四個值,表示四種風格。

經過上面幾個簡單的步驟之後,最終的效果圖如下。這裡我直接使用了SDI的案例中的test.xtml框架文件。

上圖是已經新建了三個子窗口的效果,由上圖可見,TangramMiniCtrl控件填充了整個客戶區,其實並不是TangramMiniCtrl控件自動填充了整個客戶區,而是因為MDI客戶區窗口填充整個客戶區,而調用SetMDIClient方法之後,TangramMiniCtrl控件就會自動適應MDI客戶區窗口的位置,而且平移MDI客戶區窗口到指定的Tangram空白視圖位置。並且可以看出在MDI客戶區上方有一個Tab分頁的效果,這種效果是nMDIStyle(SetMDIClient方法中的第三個參數)值為3的時候效果。

下面是調用SetMDIClient方法時,更改了幾個參數之後的效果,語句如下:

m_pMiniCtrl->SetMDIClient(L"Page1_S0000",0,0,&bSucceed);

效果卻大不相同,由於第一個參數的Tangram空白視圖的名稱對象已經改變,所以MDI客戶區定位點更改,第三個參數nMDIStyle設置為0,因此MDI客戶區上方的Tab分頁的風格也有所改變。

第一篇關於在MDI中應用TangramMini組件的文檔就寫到這裡,這一篇中主要介紹了TangramMini組件在MDI中的創建,並沒有做實際應用。不過,一些基本的方法,如SetWnd,SetCaption,SetActive等方法我相信大家通過之前幾篇文檔都已經了解,所以我相信大家到了現在可以自行安裝當前例子中的Tangram空白視圖的窗口對象了。好了,下一篇我將介紹在MDI程序中TangramMini組件的一些應用。

本文配套源碼

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