チュートリアル: MFC Scribble アプリケーションの更新 (パート 2)
このチュートリアルのパート 1 では、従来の Scribble アプリケーションに Office Fluent リボンを追加する方法を示しました。 このパートでは、ユーザーがメニューやコマンドの代わりに使用可能なリボン パネルとコントロールを追加する方法を示します。
前提条件
セクション
このパートは、次のセクションで構成されています。
リボンへの新しいパネルの追加
次の手順では、ツール バーとステータス バーの表示を制御する 2 つのチェック ボックスを含む [表示] パネルと、マルチドキュメント インターフェイス (MDI) ウィンドウの作成と配置を制御する垂直方向の分割ボタンを含む [ウィンドウ] パネルを追加する方法を示します。
リボン バーに [表示] パネルと [ウィンドウ] パネルを追加するには
Viewという名前のパネルを作成します。このパネルには、ステータス バーとツール バーを切り替える 2 つのチェック ボックスがあります。[ツールボックス] から、[パネル] を [ホーム] カテゴリにドラッグします。 次に、2 つの [チェック ボックス] をパネルにドラッグします。
パネルをクリックしてそのプロパティを変更します。 [キャプション] を
Viewに変更します。1 つ目のチェック ボックスをクリックしてそのプロパティを変更します。 [ID] を
ID_VIEW_TOOLBARに変更し、[キャプション] をToolbarに変更します。2 つ目のチェック ボックスをクリックしてそのプロパティを変更します。 [ID] を
ID_VIEW_STATUS_BARに変更し、[キャプション] をStatus Barに変更します。
分割ボタンが付いた
Windowという名前のパネルを作成します。 ユーザーが分割ボタンをクリックすると、Scribble アプリケーションで既に定義されている 3 つのコマンドがショートカット メニューに表示されます。[ツールボックス] から、[パネル] を [ホーム] カテゴリにドラッグします。 次に、[ボタン] をパネルにドラッグします。
パネルをクリックしてそのプロパティを変更します。 [キャプション] を
Windowに変更します。ボタンをクリックします。 [キャプション] を
Windowsに、[キー] をwに、[大きいイメージのインデックス] を1に、[分割モード] をFalseに変更します。 次に、[メニュー項目] の横にある省略記号 ([...]) をクリックして、[項目エディター] ダイアログ ボックスを開きます。[追加] を 3 回クリックして、3 つのボタンを追加します。
1 つ目のボタンをクリックしてから、[キャプション] を
New Windowに、[ID] をID_WINDOW_NEWに変更します。2 つ目のボタンをクリックしてから、[キャプション] を
Cascadeに、[ID] をID_WINDOW_CASCADEに変更します。3 つ目のボタンをクリックしてから、[キャプション] を
Tileに、[ID] をID_WINDOW_TILE_HORZに変更します。
変更内容を保存し、アプリケーションをビルドして実行します。 [表示] パネルと [ウィンドウ] パネルが表示されます。 ボタンをクリックして、それらが正しく機能することを確認します。
リボンへのヘルプ パネルの追加
これで、Scribble アプリケーションで定義された 2 つのメニュー項目を、[ヘルプ トピック] と [Scribble バージョン情報] という名前のリボン ボタンに割り当てることができます。 ボタンが [ヘルプ] という名前の新しいパネルに追加されます。
ヘルプ パネルを追加するには
[ツールボックス] から、[パネル] を [ホーム] カテゴリにドラッグします。 次に、2 つの [ボタン] をパネルにドラッグします。
パネルをクリックしてそのプロパティを変更します。 [キャプション] を
Helpに変更します。1 つ目のボタンをクリックします。 [キャプション] を
Help Topicsに、[ID] をID_HELP_FINDERに変更します。2 つ目のボタンをクリックします。 [キャプション] を
About Scribble...に、[ID] をID_APP_ABOUTに変更します。変更内容を保存し、アプリケーションをビルドして実行します。 2 つのリボン ボタンを含む [ヘルプ] パネルが表示されます。
重要
[ヘルプ トピック] ボタンをクリックすると、Scribble アプリケーションで、your_project_name.chm という名前の圧縮された HTML (.chm) ヘルプ ファイルが開きます。 その結果、プロジェクトに Scribble という名前が付けられていない場合は、ヘルプ ファイルの名前をプロジェクト名に変更する必要があります。
リボンへの [ペン] パネルの追加
ここで、ペンの太さと色を制御するボタンを表示するためのパネルを追加します。 このパネルには、太いペンと細いペンを切り替えるチェック ボックスがあります。 この機能は、Scribble アプリケーションの [太線] メニュー項目の機能に似ています。
オリジナルの Scribble アプリケーションを使用すると、メニューの [ペンの太さ] をクリックしたときに表示されるダイアログ ボックスからペンの太さを選択できます。 リボン バーには新しいコントロール用の十分なスペースがあるため、リボンの 2 つのコンボ ボックスを使用してダイアログ ボックスを置き換えることができます。 一方のコンボ ボックスは細いペンの太さを調整し、もう一方のコンボ ボックスは太いペンの太さを調整します。
[ペン] パネルとコンボ ボックスをリボンに追加するには
[ツールボックス] から、[パネル] を [ホーム] カテゴリにドラッグします。 次に、1 つの [チェック ボックス] と 2 つの [コンボ ボックス] をパネルにドラッグします。
パネルをクリックしてそのプロパティを変更します。 [キャプション] を
Penに変更します。チェック ボックスをオンにします。 [キャプション] を
Use Thickに、[ID] をID_PEN_THICK_OR_THINに変更します。1 つ目のコンボ ボックスをクリックします。 [キャプション] を
Thin Penに、[ID] をID_PEN_THIN_WIDTHに、[タイプ] をDrop Listに、[データ] を1;2;3;4;5;6;7;8;9;に、[テキスト] を2に変更します。2 つ目のコンボ ボックスをクリックします。 [キャプション] を
Thick Penに、[ID] をID_PEN_THICK_WIDTHに、[タイプ] をDrop Listに、[データ] を5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;に、[テキスト] を5に変更します。新しいコンボ ボックスは、既存のメニュー項目に対応していないため、すべてのペン オプションのメニュー項目を作成する必要があります。
[リソース ビュー] ウィンドウで、[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 = atoi(CStringA(pThinComboBox->GetItem(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 = atoi(CStringA(pThickComboBox->GetItem(nCurSel))); } // Create a new pen using the selected width ReplacePen();
変更内容を保存し、アプリケーションをビルドして実行します。 新しいボタンとコンボ ボックスが表示されます。 別のペンの太さを使って走り書きを試してください。
[ペン] パネルへのカラー ボタンの追加
次に、ユーザーが色付きで走り書きができるようにする CMFCRibbonColorButton オブジェクトを追加します。
[ペン] パネルにカラー ボタンを追加するには
カラー ボタンを追加する前に、それ用のメニュー項目を作成します。 [リソース ビュー] ウィンドウで、[IDR_SCRIBBTYPE] メニュー リソースを開きます。 [ペン] メニュー項目をクリックして、[ペン] メニューを開きます。 次に、[ここに入力] をクリックし、「
&Color」と入力します。 入力したテキストを右クリックして、[プロパティ] ウィンドウを表示します。 ID をID_PEN_COLORに変更します。ここで、カラー ボタンを追加します。 [ツール ボックス] から、[カラー ボタン] を [ペン] パネルにドラッグします。
カラー ボタンをクリックします。 [キャプション] を
Colorに、[ID] をID_PEN_COLORに、[簡易表示] をTrueに、[大きいイメージのインデックス] を1に、[分割モード] をFalseに変更します。変更内容を保存し、アプリケーションをビルドして実行します。 新しいカラー ボタンが [ペン] パネルに表示されます。 ただし、イベント ハンドラーがまだないため、使用できません。 次の手順では、カラー ボタンのイベント ハンドラーを追加する方法について説明します。
ドキュメント クラスへのカラー メンバーの追加
オリジナルの Scribble アプリケーションにはカラー ペンがないため、それ用の実装を作成する必要があります。 ドキュメントのペンの色を保存するには、ドキュメント クラス 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 アプリケーションを更新しました。 既存のアプリケーションを変更するときに、このチュートリアルをガイドとして使用してください。