チュートリアル : MFC Scribble アプリケーションの更新 (パート 2)
更新 : 2007 年 11 月
このチュートリアルのパート 1 では、Office Fluent リボンを従来の Scribble アプリケーションに追加しました。パート 2 では、以前はメニュー バーを使用して実行されていたタスクを実行するための、リボンのパネルとコントロールを追加します。
前提条件
SCRIBBLE サンプル : MFC MDI 描画アプリケーション
セクション
このチュートリアルのパート 2 は、次のセクションで構成されています。
リボンへの新しいパネルの追加
リボンへのヘルプ パネルの追加
リボンへのペン パネルの追加
リボンへのカラー ボタンの追加
ドキュメント クラスへのカラー メンバの追加
設定の初期化と保存
リボンへの新しいパネルの追加
この手順では、2 つのパネルを追加します。まず、2 つのチェック ボックスを含む [表示] パネルを追加します。それらのチェック ボックスは、ツール バーとステータス バーの表示/非表示を制御します。次に、垂直方向の分割ボタンを含む [ウィンドウ] パネルを追加します。そのボタンは、MDI ウィンドウの作成と配置を制御します。
リボン バーに [表示] パネルと [ウィンドウ] パネルを追加するには
パート 1 で追加した [編集] パネル コードの直後で、CMainFrame::OnCreate メソッドに次のコードを追加します。
// Add a panel to control the visibility of tool bars CMFCRibbonPanel* pPanelView = pCategory->AddPanel( // Set panel name _T("View"), // Set panel icon m_PanelImages.ExtractIcon(0)); // Add panel buttons for Toolbar and Status Bar pPanelView->Add(new CMFCRibbonCheckBox( ID_VIEW_TOOLBAR, _T("Toolbar"))); pPanelView->Add(new CMFCRibbonCheckBox( ID_VIEW_STATUS_BAR, _T("Status Bar")));
[表示] パネルを作成したコードの直後に、分割ボタンを持つ新しい [ウィンドウ] という名前のパネルを作成する次のコードを追加します。ユーザーが分割ボタンをクリックすると、ポップアップ メニューに 3 つのメニュー項目 (Scribble 1.0 で定義したもの) が表示されます。
// Add a panel to control the display of MDI windows CMFCRibbonPanel* pPanelWindow = pCategory->AddPanel( _T("Window"), m_PanelImages.ExtractIcon(0)); CMFCRibbonButton* pBtnWindows = new CMFCRibbonButton( 0, _T("Windows\nw"), -1, 1); pBtnWindows->AddSubItem(new CMFCRibbonButton( ID_WINDOW_NEW, _T("New Window"), -1, -1), -1); pBtnWindows->AddSubItem(new CMFCRibbonButton( ID_WINDOW_CASCADE, _T("Cascade"), -1, -1), -1); pBtnWindows->AddSubItem(new CMFCRibbonButton( ID_WINDOW_TILE_HORZ, _T("Tile"), -1, -1), -1); pPanelWindow->Add(pBtnWindows);
変更を保存し、アプリケーションをビルドして実行します。[表示] パネルと [ウィンドウ] パネルが表示されます。ボタンをクリックして、正しく機能することを確認します。
[ページのトップへ]
リボンへのヘルプ パネルの追加
次に、Scribble 1.0 で定義された 2 つのメニュー項目を [Help Topics] と [Scribble バージョン情報] という名前のリボン ボタンに割り当てます。[ヘルプ]. という名前の新しいパネルにそれらのボタンを追加します。
ヘルプ パネルを追加するには
前の手順で追加した [ウィンドウ] パネルのコードの直後で、次のコードを CMainFrame::OnCreate メソッドに追加します。
// Create a new panel with the name "Help" CMFCRibbonPanel* pPanelHelp = pCategory->AddPanel( _T("Help"), m_PanelImages.ExtractIcon(0)); pPanelHelp->Add(new CMFCRibbonButton(ID_HELP_FINDER, _T("Help Topics"))); pPanelHelp->Add(new CMFCRibbonButton(ID_APP_ABOUT, _T( "About Scribble...")));
変更を保存し、アプリケーションをビルドして実行します。2 つのリボン ボタンを持つ [ヘルプ] パネルが表示されます。
重要 : [Help Topics] ボタンをクリックすると、Scribble アプリケーションによって、圧縮された HTML (.chm) ヘルプ ファイル your_project_name.chm が開かれます。そのため、プロジェクトが名前付き Scribble でない場合は、ヘルプ ファイルの名前をプロジェクト名に変更する必要があります。
[ページのトップへ]
リボンへのペン パネルの追加
次に、ペンの太さと色を制御するボタンを表示するパネルを追加します。このパネルには、太いペンと細いペンを切り替えるチェック ボックスが含まれます。この機能は、Scribble 1.0 の [太い線] メニュー項目に似ています。
元の Scribble アプリケーションでは、ユーザーは、メニューの [ペンの太さ] を選択したときに表示されるダイアログ ボックスでペンの太さを選択しました。このリボン バーには新しいコントロールのための場所が十分にあるため、そのダイアログ ボックスをリボン上の 2 つのコンボ ボックスで置き換えます。1 つのコンボ ボックスは細いペンの太さを調整し、もう 1 つのコンボ ボックスでは太い線の太さを調整します。
リボンにペン パネルとコンボ ボックスを追加するには
パート 1 で作成した [編集] パネルのコードの直後で、CMainFrame::OnCreate メソッドに次のコードを追加します。
// Create a new panel for the pen-related buttons CMFCRibbonPanel* pPanelPen = pCategory->AddPanel( // Panel name _T("Pen"), // Panel icon m_PanelImages.ExtractIcon(0)); pPanelPen->Add(new CMFCRibbonCheckBox( ID_PEN_THICK_OR_THIN, _T("Use Thick"))); // Add combo boxes for pen thicknesses CMFCRibbonComboBox* pThinComboBox = new CMFCRibbonComboBox( ID_PEN_THIN_WIDTH, 0, 20, "Thin Pen :", -1); pThinComboBox->AddItem(_T("1"), 1); pThinComboBox->AddItem(_T("2"), 2); pThinComboBox->AddItem(_T("3"), 3); pThinComboBox->AddItem(_T("4"), 4); pThinComboBox->AddItem(_T("5"), 5); pThinComboBox->AddItem(_T("6"), 6); pThinComboBox->AddItem(_T("7"), 7); pThinComboBox->AddItem(_T("8"), 8); pThinComboBox->AddItem(_T("9"), 9); pThinComboBox->SelectItem(1); pPanelPen->Add(pThinComboBox); CMFCRibbonComboBox* pThickComboBox = new CMFCRibbonComboBox( ID_PEN_THICK_WIDTH, 0, 20, "Thick Pen:", -1); pThickComboBox->AddItem(_T("5"), 5); pThickComboBox->AddItem(_T("6"), 6); pThickComboBox->AddItem(_T("7"), 7); pThickComboBox->AddItem(_T("8"), 8); pThickComboBox->AddItem(_T("9"), 9); pThickComboBox->AddItem(_T("10"), 10); pThickComboBox->AddItem(_T("11"), 11); pThickComboBox->AddItem(_T("12"), 12); pThickComboBox->AddItem(_T("13"), 13); pThickComboBox->AddItem(_T("14"), 14); pThickComboBox->AddItem(_T("15"), 15); pThickComboBox->AddItem(_T("16"), 16); pThickComboBox->AddItem(_T("17"), 17); pThickComboBox->AddItem(_T("18"), 18); pThickComboBox->AddItem(_T("19"), 19); pThickComboBox->AddItem(_T("20"), 20); pThickComboBox->SelectItem(0); pPanelPen->Add(pThickComboBox);
新しいコンボ ボックスは既存のメニュー項目には対応していません。したがって、それぞれのペン オプションに対するメニュー項目を作成する必要があります。
[リソース ビュー] ウィンドウで、IDR_SCRIBBTYPE メニュー リソースを開きます。
[ペン] をクリックして [ペン] メニューを開きます。[ここへ入力] をクリックし、「Thi&n Pen」と入力します。
今入力した文字列を右クリックすると [プロパティ] ダイアログ ボックスが表示されます。その ID プロパティを ID_PEN_THIN_WIDTH に変更します。
また、ペン メニューの各項目に対するイベント ハンドラを作成する必要があります。直前に作成した [Thi&n Pen] メニュー項目を右クリックして、[イベント ハンドラの追加] をクリックします。イベント ハンドラ ウィザードが表示されます。
このウィザードの [クラス リスト] ボックスで [CScribbleDoc] を選択し、次に [追加と編集] ボタンをクリックします。これによって、CScribbleDoc::OnPenThinWidth という名前のイベント ハンドラが作成されます。
CScribbleDoc::OnPenThinWidth に次のコードを追加します。
// Get a pointer to the ribbon bar CMFCRibbonBar* pRibbon = ((CMDIFrameWndEx*) AfxGetMainWnd())->GetRibbonBar(); ASSERT_VALID(pRibbon); // Get a pointer to the Thin Width combo box CMFCRibbonComboBox* pThinComboBox = DYNAMIC_DOWNCAST( CMFCRibbonComboBox, pRibbon->FindByID(ID_PEN_THIN_WIDTH)); //Get the selected value int nCurSel = pThinComboBox->GetCurSel(); if (nCurSel >= 0) { m_nThinWidth = (int) pThinComboBox->GetItemData(nCurSel); } // Create a new pen using the selected width ReplacePen();
次に、太いペンのメニュー項目とイベント ハンドラを作成します。
[リソース ビュー] ウィンドウで、IDR_SCRIBBTYPE メニュー リソースを開きます。
[ペン] をクリックして [ペン] メニューを開きます。[ここへ入力] をクリックし、「Thic&k Pen」と入力します。
今入力した文字列を右クリックすると [プロパティ] ダイアログ ボックスが表示されます。その ID プロパティを ID_PEN_THICK_WIDTH に変更します。
直前に作成した [Thick Pen] メニュー項目を右クリックして、[イベント ハンドラの追加] をクリックします。イベント ハンドラ ウィザードが表示されます。
このウィザードの [クラス リスト] ボックスで [CScribbleDoc] を選択し、次に [追加と編集] ボタンをクリックします。これによって、CScribbleDoc::OnPenThickWidth という名前のイベント ハンドラが作成されます。
CScribbleDoc::OnPenThickWidth に次のコードを追加します。
// Get a pointer to the ribbon bar CMFCRibbonBar* pRibbon = ((CMDIFrameWndEx *) AfxGetMainWnd())->GetRibbonBar(); ASSERT_VALID(pRibbon); CMFCRibbonComboBox* pThickComboBox = DYNAMIC_DOWNCAST( CMFCRibbonComboBox, pRibbon->FindByID(ID_PEN_THICK_WIDTH)); // Get the selected value int nCurSel = pThickComboBox->GetCurSel(); if (nCurSel >= 0) { m_nThickWidth = (int) pThickComboBox ->GetItemData(nCurSel); } // Create a new pen using the selected width ReplacePen();
変更を保存し、アプリケーションをビルドして実行します。新しいボタンとコンボ ボックスが表示されます。フリーハンドでさまざまな太さのペンを使用してみます。
[ページのトップへ]
ペン パネルへのカラー ボタンの追加
モノクロでもよいのですが、カラーではいっそう明確になります。次に、ユーザーのフリーハンドをカラーにできる CMFCRibbonColorButton オブジェクトを追加します。
ペン パネルにカラー ボタンを追加するには
カラー ボタンを追加する前に、カラー ボタンに対するメニュー項目を作成します。[リソース ビュー] ウィンドウで、IDR_SCRIBBTYPE メニュー リソースを開きます。[ペン] メニュー項目をクリックして [ペン] メニューを開きます。[ここへ入力] をクリックし、「&Color」と入力します。今入力した文字列を右クリックすると [プロパティ] ダイアログ ボックスが表示されます。その ID を ID_PEN_COLOR に変更します。
太いペンのコンボ ボックスを作成したコードの直後で、次のコードを CMainFrame::OnCreate メソッドに追加します。
CMFCRibbonColorButton* pColorBtn = new CMFCRibbonColorButton( ID_PEN_COLOR, _T("Color"), TRUE, -1, 1); pColorBtn->SetAlwaysLargeImage(); pColorBtn->SetColor(RGB(0,0,0)); // Black is the initial color pColorBtn->SetDefaultCommand(FALSE); pPanelPen->Add(pColorBtn);
変更を保存し、アプリケーションをビルドして実行します。新しいカラー ボタンが [ペン] パネルに表示されます。ただし、イベント ハンドラがないため、このボタンを使用できません。次の手順では、カラー ボタンのイベント ハンドラを追加します。
[ページのトップへ]
ドキュメント クラスへのカラー メンバの追加
Scribble 1.0 にはカラー ペンがないため、その実装を作成する必要があります。ドキュメントのペン カラーを格納するには、ドキュメント クラス CscribbleDoc に新しいメンバを追加します。
ドキュメント クラスにカラー メンバを追加するには
scribdoc.h の CScribbleDoc クラスで // Attributes セクションを探します。m_nThickWidth データ メンバの定義の後に、次のコード行を追加します。
// Current pen color COLORREF m_penColor;
各ドキュメントには、ユーザーが既に描画したストロークの一覧があります。各ストロークは、CStroke オブジェクトによって定義されます。CStroke クラスには、ペン カラーに関する情報は含まれません。したがって、このクラスを修正する必要があります。scribdoc.h の CStroke クラスで、m_nPenWidth データ メンバの後に次のコード行を追加します。
// Pen color for the stroke COLORREF m_penColor;
scribdoc.h に、新しい CStroke コンストラクタを追加し、そのパラメータで幅とカラーを指定します。次のコード行を CStroke(UINT nPenWidth); ステートメントの後に追加します。
CStroke(UINT nPenWidth, COLORREF penColor);
scribdoc.cpp に、新しい CStroke コンストラクタの実装を追加します。CStroke::CStroke(UINT nPenWidth) コンストラクタの実装の後に、次のコードを追加します。
// Constructor that uses the document's current width and color CStroke::CStroke(UINT nPenWidth, COLORREF penColor) { m_nPenWidth = nPenWidth; m_penColor = penColor; m_rectBounding.SetRectEmpty(); }
CStroke::DrawStroke メソッドの 2 行目を次のように変更します。
if (!penStroke.CreatePen(PS_SOLID, m_nPenWidth, m_penColor))
ドキュメント クラスに対する既定のペン カラーを設定します。scribdoc.cpp では、m_nThickWidth = 5; ステートメントの後に、次のコードを CScribbleDoc::InitDocument に追加します。
// default pen color is black m_penColor = RGB(0,0,0);
scribdoc.cpp で、CScribbleDoc::NewStroke メソッドの最初の行を次のように変更します。
CStroke* pStrokeItem = new CStroke(m_nPenWidth, m_penColor);
CScribbleDoc::ReplacePen メソッドの最終行を次のように変更します。
m_penCur.CreatePen(PS_SOLID, m_nPenWidth, m_penColor);
前の手順では、m_penColor メンバを追加しました。次に、メンバを設定するカラー ボタンのイベント ハンドラを作成します。
[リソース ビュー] ウィンドウで、IDR_SCRIBBTYPE メニュー リソースを開きます。
[カラー] メニュー項目を右クリックし、[イベント ハンドラの追加] をクリックします。イベント ハンドラ ウィザードが表示されます。
このウィザードの [クラス リスト] ボックスで [CScribbleDoc] を選択し、次に [追加と編集] ボタンをクリックします。この操作によって CScribbleDoc::OnPenColor イベント ハンドラ スタブが作成されます。
CScribbleDoc::OnPenColor イベント ハンドラのスタブを次のコードで置き換えます。
void CScribbleDoc::OnPenColor() { // Change pen color to reflect color button's current selection CMFCRibbonBar* pRibbon = ((CMDIFrameWndEx*) AfxGetMainWnd())->GetRibbonBar(); ASSERT_VALID(pRibbon); CMFCRibbonColorButton* pColorBtn = DYNAMIC_DOWNCAST( CMFCRibbonColorButton, pRibbon->FindByID(ID_PEN_COLOR)); m_penColor = pColorBtn->GetColor(); // Create new pen using the selected color ReplacePen(); }
変更を保存し、アプリケーションをビルドして実行します。カラー ボタンを押して、ペンのカラーを変更できるようになります。
[ページのトップへ]
設定の初期化と保存
次に、ペンのカラーと太さを初期化します。最後に、カラー描画をファイルに保存し、ファイルから読み込みます。
リボン バーのコントロールを初期化するには
リボン バーのペンを初期化します。
scribdoc.cpp で、CScribbleDoc::InitDocument メソッドの m_sizeDoc = CSize(200,200) ステートメントの後に次のコードを追加します。
// Reset the ribbon UI to its initial values CMFCRibbonBar* pRibbon = ((CMDIFrameWndEx*) AfxGetMainWnd())->GetRibbonBar(); ASSERT_VALID(pRibbon); CMFCRibbonColorButton* pColorBtn = DYNAMIC_DOWNCAST( CMFCRibbonColorButton, pRibbon->FindByID(ID_PEN_COLOR)); // Set ColorButton to black pColorBtn->SetColor(RGB(0,0,0)); CMFCRibbonComboBox* pThinComboBox = DYNAMIC_DOWNCAST( CMFCRibbonComboBox, pRibbon->FindByID(ID_PEN_THIN_WIDTH)); // Set Thin pen combobox to 2 pThinComboBox->SelectItem(1); CMFCRibbonComboBox* pThickComboBox = DYNAMIC_DOWNCAST( CMFCRibbonComboBox, pRibbon->FindByID(ID_PEN_THICK_WIDTH)); // Set Thick pen combobox to 5 pThickComboBox->SelectItem(0);
ファイルにカラー描画を保存します。scribdoc.cpp で、CStroke::Serialize メソッドの ar << (WORD)m_nPenWidth; ステートメントの後に、次のコードを追加します。
ar << (COLORREF)m_penColor;
最後に、ファイルからカラー描画を読み込みます。CStroke::Serialize メソッドの m_nPenWidth = w; ステートメントの後に、次のコード行を追加します。
ar >> m_penColor;
次に、カラーでフリーハンド描画し、それをファイルに保存します。
[ページのトップへ]
成功
MFC Scribble アプリケーションが正常に更新されました。既存のアプリケーションを修正するときに、そのガイドとしてこのチュートリアルを使用してください。
参照
処理手順
チュートリアル : MFC Scribble アプリケーションの更新 (パート 1)