チュートリアル : MFC Scribble アプリケーションの更新 (パート 1)
更新 : 2007 年 11 月
このチュートリアルでは、既存の MFC アプリケーションを変更して、2007 Microsoft Office リリースで導入された新しい Office Fluent リボン ユーザー インターフェイスを使用する方法について説明します。Office Fluent リボン ユーザー インターフェイスの詳細については、MSDN ライブラリの「Office Fluent User Interface Developer Portal」を参照してください。
このチュートリアルでは、マウスを使用して線画を描く、従来の Scribble 1.0 MFC サンプルを変更します。このチュートリアルのパート 1 では、リボン バーを表示するよう Scribble サンプルを変更します。パート 2 では、リボン バーにボタンを追加していきます。
前提条件
SCRIBBLE サンプル : MFC MDI 描画アプリケーション
RibbonGadgets サンプル : Ribbon Gadgets アプリケーション
セクション
このチュートリアルのパート 1 は、次のセクションで構成されています。
基本クラスの置き換え
リボンのアプリケーションへの追加
ビットマップのリボンへの追加
リボン バーのインスタンスの作成
リボン カテゴリの追加
アプリケーションの外観の設定
基本クラスの置き換え
メニュー ベースのアプリケーションをリボン ベースのアプリケーションに変換するには、アプリケーション、フレーム ウィンドウ、ツール バーの各クラスを、Visual C++ 2008 Feature Pack で提供されている基本クラスから派生させる必要があります (元の Scribble サンプルは変更せず、Scribble プロジェクトをクリーンアップし、別のディレクトリにコピーして、コピーの方を変更することをお勧めします)。
Scribble アプリケーションの基本クラスを置き換えるには
scribble.cpp で、CScribbleApp::InitInstance に AfxOleInit の呼び出しが含まれていることを確認します。
stdafx.h ファイルに次のコードを追加します。
#include <afxcontrolbars.h>
scribble.h で、CScribbleApp クラスの定義を変更し、CWinAppEx クラスから派生するようにします。
class CScribbleApp: public CWinAppEx
Scribble 1.0 は、Windows アプリケーションが初期化 (.ini) ファイルを使用してユーザー設定のデータを保存したときに書き込まれています。初期化ファイルは変更せず、Scribble を変更してユーザー設定をレジストリに格納します。レジストリ キーとベースを設定するには、次のコードを、LoadStdProfileSettings() ステートメントの後ろの CScribbleApp::InitInstance に含めます。
SetRegistryKey(_T("MFCNext\\Samples\\Scribble2")); SetRegistryBase(_T("Settings"));
Visual C++ 2008 Feature Pack では、マルチ ドキュメント インターフェイス (MDI) アプリケーション用のメイン フレームが CMDIFrameWnd クラスからは派生しません。代わりに、CMDIFrameWndEx クラスから派生します。
mainfrm.h ファイルと mainfrm.cpp ファイルで、CMDIFrameWnd への参照をすべて、CMDIFrameWndEx への参照に置き換えます。
childfrm.h ファイルと childfrm.cpp ファイルで、CMDIChildWnd を CMDIChildWndEx に置き換えます。
childfrm.h ファイルで、CSplitterWnd を CSplitterWndEx に置き換えます。
ツール バーとステータス バーを変更して、新しい MFC クラスを使用します。
mainfrm.h ファイルでは、次の手順に従います。
CToolbar を CMFCToolBar に置き換えます。
CStatusBar を CMFCStatusBar に置き換えます。
mainfrm.cpp ファイルでは、次の手順に従います。
m_wndToolBar.SetBarStyle を m_wndToolBar.SetPaneStyle に置き換えます。
m_wndToolBar.GetBarStyle を m_wndToolBar.GetPaneStyle に置き換えます。
DockControlBar(&m_wndToolBar) を DockPane(&m_wndToolBar) に置き換えます。
ipframe.cpp ファイルでは、コードの次の 3 行をコメント アウトします。
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); pWndFrame->EnableDocking(CBRS_ALIGN_ANY); pWndFrame->DockPane(&m_wndToolBar);
アプリケーションを静的にリンクする場合は、プロジェクトのリソース (.rc) ファイルの先頭に次のコードを追加します。
#include "afxribbon.rc"
afxribbon.rc ファイルには、移行したアプリケーションで Visual C++ 2008 Feature Pack のダイアログ ボックスや文字列を使用する場合に、実行時に必要となるリソースが含まれています。MFC アプリケーション ウィザードには、新しいアプリケーションを作成するときに、このファイルが自動的に含まれます。
変更を保存し、アプリケーションをビルドして実行します。
[ページのトップへ]
リボンのアプリケーションへの追加
メニューを使用するアプリケーションを、リボンを使用するアプリケーションに変更する場合は、既存のメニューを削除する必要も、無効にする必要もありません。代わりに、リボン バーを作成し、リボン ボタンを追加し、新しいボタンを既存のメニュー項目と関連付けます。メニューは表示されなくなりますが、リボン バーからのメッセージはメニュー経由で送られます。また、メニューのショートカットは引き続き機能します。
リボン バーはアプリケーション ボタンと 1 つ以上のタブで構成されます。アプリケーション ボタンは、リボンの左上隅にある大きいボタンです。各タブは、1 つ以上のパネルで構成されます。パネルは、リボンのボタンやコントロールのコンテナとして動作します。
リボン バーをアプリケーションに追加するには、mainfrm.h ファイルでリボン バーを宣言します。mainfrm.cpp ファイルには、リボン バーにコントロールを追加するコードを作成します。
リボンをアプリケーションに追加するには
mainfrm.h ファイルで、メイン フレームのクラス定義 CMainFrame の保護されたセクションに 2 つのデータ メンバを追加します。これらのメンバは、リボン バーとアプリケーション ボタンを表します。
// Ribbon bar for the application CMFCRibbonBar m_wndRibbonBar; // The application button for the ribbon CMFCRibbonApplicationButton m_MainButton;
前の 2 つのメンバの後ろに、リボン パネルで使用されるイメージ リスト用のデータ メンバを追加します。このイメージは、ユーザーがアプリケーションのサイズを変更し、それに伴ってリボンのサイズが変更されたときにのみ表示されます。
// Ribbon panel icons CMFCToolBarImages m_PanelImages;
[ページのトップへ]
ビットマップのリボンへの追加
このチュートリアルの次の 4 つの手順には、ビットマップ リソースが必要です。適切なビットマップをさまざまな方法で取得できます。
リソース エディタを使用して、独自のビットマップを作成します。または、リソース エディタを使用して、Visual Studio に用意されている Portable Network Graphics (.png) イメージからビットマップを作成します。これらのイメージは VS2008ImageLibrary ディレクトリに格納されています。
ただし、リボン ユーザー インターフェイスでは、特定のビットマップが透明なイメージをサポートしている必要があります。透明なビットマップの色深度は 32 ビットで、そのうち 24 ビットは赤、緑、青の各色成分を表し、残りの 8 ビットは色の透明度を指定するアルファ チャネルを表します。現行のリソース エディタでは、色深度が 32 ビットのビットマップを表示できますが、変更できません。そのため、透明なビットマップを作成する場合は、リソース エディタではなく、外部のイメージ エディタを使用します。
適切なリソース ファイルを別のアプリケーションからプロジェクトにコピーし、そのファイルからビットマップをインポートします。
このチュートリアルでは、Samples ディレクトリにあるアプリケーションからリソース ファイルをコピーします。
ビットマップをリボンに追加するには
Windows エクスプローラを使用して、RibbonGadgets サンプルのリソース ディレクトリ (res) から次の .bmp ファイルをコピーします。
main.bmp を Scribble プロジェクトにコピーします。
filesmall.bmp と filelarge.bmp を Scribble プロジェクトにコピーします。
filelarge.bmp ファイルと filesmall.bmp ファイルの新しいコピーを作成します。このとき、コピーは RibbonGadgets サンプルに保存します。homesmall.bmp と homelarge.bmp のコピーの名前を変更し、それらを Scribble プロジェクトに移動します。
toolbar.bmp ファイルのコピーを作成します。このとき、コピーを RibbonGadgets サンプルに保存します。panelicons.bmp のコピーの名前を変更し、それを Scribble プロジェクトに移動します。
MFC アプリケーション用のビットマップをインポートします。[リソース ビュー] で、[scribble.rc] ノードをダブルクリックし、[ビットマップ] ノードをダブルクリックして [リソースの追加] をクリックします。表示されたダイアログ ボックスで、[インポート] をクリックします。res ディレクトリを参照し、main.bmp ファイルを選択して、[開く] をクリックします。
main.bmp ビットマップには、26 × 26 イメージが含まれています。ビットマップの ID を IDB_RIBBON_MAIN に変更します。
アプリケーション ボタンにアタッチされるファイル メニュー用のビットマップをインポートします。
filesmall.bmp ファイルをインポートします。このファイルには 16 × 16 イメージが 10 個 (16 × 160) 含まれています。必要な 16 × 16 イメージは 8 個 (16 × 128) なので、[リソース ビュー] を使用して、ビットマップの幅を 160 から 128 に変更します。ビットマップの ID を IDB_RIBBON_FILESMALL に変更します。
filelarge.bmp をインポートします。このファイルには 32 × 32 イメージが 8 個 (32 × 256) 含まれています。ビットマップの ID を IDB_RIBBON_FILELARGE に変更します。
リボンのカテゴリとパネル用のビットマップをインポートします。リボン バーの各タブはカテゴリであり、テキスト ラベルと省略可能なイメージで構成されます。
homesmall.bmp ビットマップをインポートします。このファイルには、小さいボタン用の 16 × 16 イメージが 8 個含まれています。ビットマップの ID を IDB_RIBBON_HOMESMALL に変更します。
homelarge.bmp ビットマップをインポートします。このファイルには、大きいボタン用の 32 × 32 イメージが 8 個含まれています。ビットマップの ID を IDB_RIBBON_HOMELARGE に変更します。
サイズが変更されたリボン パネル用のビットマップをインポートします。このビットマップ、つまりパネル アイコンは、リボンが小さすぎてパネル全体を表示できない場合に、サイズ変更操作後に使用されます。
- panelicons.bmp をインポートします。このファイルには 16 × 16 イメージが 8 個含まれています。ビットマップ エディタの [プロパティ] ウィンドウで、ビットマップの幅を 64 (16 × 64) に変更します。ビットマップの ID を IDB_PANEL_ICONS に変更します。
[ページのトップへ]
リボン バーのインスタンスの作成
次の手順では、アプリケーションの起動時にリボン バーのインスタンスを作成する方法を示します。その次に、アプリケーション ボタンに関連付けられているメニュー項目とイメージを初期化する方法を示します。
リボン バーのインスタンスを作成するには
mainfrm.cpp ファイルで、CMainFrame::OnCreate 関数の末尾にある最後の return ステートメントの前に、次のコードを追加します。このコードは、リボン バーのインスタンスを作成します。
// Create the ribbon bar if (!m_wndRibbonBar.Create(this)) { return -1; //Failed to create ribbon bar }
前の手順のステートメントの後に次のコードを追加します。このコードは、リボン パネルとアプリケーション ボタン用のイメージを読み込み、次にアプリケーション ボタンをリボンにアタッチします。
// Load images for ribbon panels m_PanelImages.SetImageSize(CSize(16,16)); m_PanelImages.Load(IDB_PANEL_ICONS); // Initialize the application button m_MainButton.SetImage(IDB_RIBBON_MAIN); m_MainButton.SetToolTipText(_T("File")); m_MainButton.SetText(_T("\nf")); // Attach the application button to the ribbon m_wndRibbonBar.SetApplicationButton(&m_MainButton, CSize(45,45));
前の手順のステートメントの後に次のコードを追加します。このコードは、ユーザーがアプリケーション ボタンを押したときに表示されるメニューを作成します。このコードで使用されているメッセージ ID は、Scribble 1.0 用のメニューで定義済みのものです。
CMFCRibbonMainPanel* pMainPanel = m_wndRibbonBar.AddMainCategory( _T("File"), IDB_RIBBON_FILESMALL, IDB_RIBBON_FILELARGE); pMainPanel->Add(new CMFCRibbonButton( ID_FILE_NEW, _T("&New"), 0, 0)); pMainPanel->Add(new CMFCRibbonButton(ID_FILE_OPEN, _T("&Open..."), 1, 1)); pMainPanel->Add(new CMFCRibbonButton(ID_FILE_CLOSE, _T("&Close"), 5, 5)); pMainPanel->Add(new CMFCRibbonButton(ID_FILE_SAVE, _T("&Save"), 2, 2)); pMainPanel->Add(new CMFCRibbonButton(ID_FILE_SAVE_AS, _T("Save &As..."), 3, 3)); CMFCRibbonButton* pBtnPrint = new CMFCRibbonButton(ID_FILE_PRINT, _T("&Print"), 4, 4); pBtnPrint->AddSubItem(new CMFCRibbonLabel(_T("Preview and print the document"))); pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT, _T("&Print"), 4, 4, TRUE)); pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_DIRECT, _T("&Quick Print"), 7, 7, TRUE)); pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_PREVIEW, _T("Print Pre&view"), 6, 6, TRUE)); pBtnPrint->SetKeys(_T("p"), _T("w")); pMainPanel->Add(pBtnPrint); pMainPanel->Add(new CMFCRibbonSeparator(TRUE)); pMainPanel->Add(new CMFCRibbonButton(ID_FILE_CLOSE, _T("&Close"), 5, 5)); pMainPanel->AddRecentFilesList(_T("Recent Documents")); pMainPanel->AddToBottom(new CMFCRibbonMainPanelButton(ID_APP_EXIT, _T("E&xit"), 8));
[ページのトップへ]
リボン カテゴリの追加
アプリケーション ボタンを作成したので、最初のリボン カテゴリとリボン パネルを追加する準備ができました。各カテゴリは、リボンに表示されるタブを定義します (このチュートリアルでは、すべてのパネルで同じパネル アイコンを使用します。ただし、実験的に他のイメージ リスト インデックスを使用して、他のアイコンを表示してもかまいません)。
[Home] カテゴリと [Edit] パネルを追加するには
この Scribble プログラムに必要なカテゴリは 1 つだけです。このカテゴリの名前を「Home」とします。前の手順のステートメントの後に次のコードを追加します。
// Add a Home category to the ribbon bar. CMFCRibbonCategory* pCategory = m_wndRibbonBar.AddCategory( _T("&Home"), // Category name IDB_RIBBON_HOMESMALL, // Category small images (16 x 16) IDB_RIBBON_HOMELARGE); // Category large images (32 x 32)
各リボン カテゴリは名前付きパネルに整理されます。各パネルには、関連操作を実行するコントロールのセットが含まれています。次のコードを追加して、編集機能を処理するパネルを作成します。このパネルの名前は「Edit」とします。
// Add an Edit panel to the Home category. CMFCRibbonPanel* pPanelEdit = pCategory->AddPanel( _T("Edit"), // Panel name m_PanelImages.ExtractIcon(0)); // Panel icon
[Edit] パネルにボタンを追加します。このパネルは、ドキュメントの内容を消去します。このボタンのメッセージ ID は、IDR_SCRIBBTYPE メニュー リソースに定義済みです。ボタン テキストと、ボタンを装飾するビットマップのインデックスに、「Clear All」と指定します。
// Add a Clear All button to the Edit panel. pPanelEdit->Add(new CMFCRibbonButton(ID_EDIT_CLEAR_ALL, _T("Clear All"), 0));
変更を保存し、アプリケーションをビルドして実行します。見慣れた Scribble アプリケーションが起動されますが、ウィンドウ最上部にはメニュー バーではなく、リボンが表示されます。リボン バーには [Home] というカテゴリが 1 つだけあり、そこには [Edit] というパネルが 1 つだけあります。
追加したリボン ボタンは既存のイベント ハンドラに関連付けられており、[開く]、[閉じる]、[保存]、[印刷]、[すべてクリア] の各ボタンは、従来どおり動作します。
[ページのトップへ]
アプリケーションの外観の設定
ビジュアル マネージャは、アプリケーションのすべての描画を制御するグローバル オブジェクトです。このアプリケーションは既定の GUI スタイル (Office 2000) を使用しているので、外観が多少古い印象を与えます。このチュートリアルでは、Office 2007 ビジュアル マネージャを使用して、この Scribble アプリケーションの外観を、Office 2007 アプリケーションのような新しいものに変更します。
アプリケーションの外観を設定するには
CMainFrame::OnCreate 関数に次のコードを入力して、既定のマネージャとスタイルを変更します。
// Set the default manager to Office 2007 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007)); CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);
変更を保存し、アプリケーションをビルドして実行します。アプリケーションのユーザー インターフェイスが Office 2007 のユーザー インターフェイスのようになります。
[ページのトップへ]
これで処理は完了しました。
これで、このチュートリアルのパート 1 は完了しました。パート 2 へ進んでください。
参照
処理手順
チュートリアル : MFC Scribble アプリケーションの更新 (パート 2)
SCRIBBLE サンプル : MFC MDI 描画アプリケーション