チュートリアル: MFC Scribble アプリケーションの更新 (パート 2)
このチュートリアルのパート 1 では、Office Fluent リボンを従来の Scribble アプリケーションに追加する方法を説明しました。 ここでは、ユーザーがメニューやコマンドの代わりに使用できるリボン パネルやコントロールを追加する方法を説明します。
必須コンポーネント
サンプル ジグザグ線します。MFC MDI 描画アプリケーション
セクション
このパートは、次のセクションで構成されています。
リボンへの新しいパネルの追加
リボンへのヘルプ パネルの追加
リボンへのペン パネルの追加
リボンへのカラー ボタンの追加
ドキュメント クラスへのカラー メンバーの追加
設定の初期化と保存
リボンへの新しいパネルの追加
次の手順では、ツール バーとステータス バーの表示/非表示を制御する 2 つのチェック ボックスがある [ビュー] パネルの追加方法と、マルチ ドキュメント インターフェイス (MDI: Multiple Document Interface) の作成と配置を制御する垂直方向の分割ボタンがある [ウィンドウ] パネルの追加方法を説明します。
リボン バーに [表示] パネルと [ウィンドウ] パネルを追加するには
ステータス バーとツール バーを切り替える 2 つのチェック ボックスがある、「表示」という名前のパネルを作成します。
[ツールボックス] から、パネルを [ホーム] カテゴリにドラッグします。 2 つのチェック ボックスをパネルにドラッグします。
パネルをクリックして、そのプロパティを修正します。 [キャプション] を「表示」に変更します。
1 つ目のチェック ボックスをクリックして、そのプロパティを修正します。 [ID] を「ID_VIEW_TOOLBAR」に変更し、[キャプション] を「ツール バー」に変更します。
2 つ目のチェック ボックスをクリックして、そのプロパティを修正します。 [ID] を「ID_VIEW_STATUS_BAR」に変更し、[キャプション] を「ステータス バー」に変更します。
分割ボタンのある「ウィンドウ」という名前のパネルを作成します。 ユーザーが分割ボタンをクリックすると、ショートカット メニューに (Scribble アプリケーションで定義した) 3 つのコマンドが表示されます。
[ツールボックス] から、パネルを [ホーム] カテゴリにドラッグします。 ボタンをパネルにドラッグします。
パネルをクリックして、そのプロパティを修正します。 [キャプション] を「ウィンドウ」に変更します。
ボタンをクリックします。 [キャプション]、[キー]、[Large Image Index]、[分割モード] を、それぞれ「ウィンドウ」、「w」、「1」、「False」に変更します。 省略記号ボタンをクリックします (...) 横に メニュー項目 を開くには、 アイテム エディター ダイアログ ボックス。
[追加] を 3 回クリックして、ボタンを 3 つ追加します。
1 つ目のボタンをクリックし、[キャプション] を「新しいウィンドウ」に変更し、[ID] を「ID_WINDOW_NEW」に変更します。
2 つ目のボタンをクリックし、[キャプション] を「重ねて表示」に変更し、[ID] を「ID_WINDOW_CASCADE」に変更します。
3 つ目のボタンをクリックし、[キャプション] を「並べて表示」に変更し、[ID] を「ID_WINDOW_TILE_HORZ」に変更します。
変更内容を保存し、アプリケーションをビルドして実行します。 [表示] パネルと [ウィンドウ] パネルが表示されます。 ボタンをクリックして、正しく機能することを確認します。
[セクション]
リボンへのヘルプ パネルの追加
これで、Scribble アプリケーションで定義されている 2 つのメニュー項目を、[ヘルプのトピック] と [Scribble バージョン情報] という名前のリボン ボタンに割り当てることができます。 これらのボタンは、[ヘルプ] という名前の新しいパネルに追加されます。
ヘルプ パネルを追加するには
[ツールボックス] から、パネルを [ホーム] カテゴリにドラッグします。 2 つのボタンをパネルにドラッグします。
パネルをクリックして、そのプロパティを修正します。 [キャプション] を「ヘルプ」に変更します。
1 つ目のボタンをクリックします。 [キャプション] を「ヘルプのトピック」に変更し、[ID] を「ID_HELP_FINDER」に変更します。
2 つ目のボタンをクリックします。 [キャプション] を「バージョン情報...」に変更し、[ID] を「ID_APP_ABOUT」に変更します。
変更内容を保存し、アプリケーションをビルドして実行します。 2 つのリボン ボタンのある [ヘルプ] パネルが表示されます。
重要
[Help Topics] ボタンをクリックすると、Scribble アプリケーションによって、圧縮された HTML (.chm) ヘルプ ファイル your_project_name.chm が開かれます。 そのため、プロジェクトが名前付き Scribble でない場合は、ヘルプ ファイルの名前をプロジェクト名に変更する必要があります。
[セクション]
リボンへのペン パネルの追加
ここでは、ペンの太さと色を制御するボタンを表示するパネルを追加します。 このパネルには、太いペンと細いペンを切り替えるチェック ボックスが含まれます。 この機能は、Scribble アプリケーションの [太い線] メニュー項目に似ています。
元の Scribble アプリケーションでは、ユーザーは、メニューの [ペンの太さ] をクリックしたときに表示されるダイアログ ボックスでペンの太さを選択しました。 このリボン バーには新しいコントロールのための場所が十分にあるため、ダイアログ ボックスをリボン上の 2 つのコンボ ボックスで置き換えることができます。 1 つのコンボ ボックスは細いペンの太さを調整し、もう 1 つのコンボ ボックスでは太い線の太さを調整します。
リボンにペン パネルとコンボ ボックスを追加するには
[ツールボックス] から、パネルを [ホーム] カテゴリにドラッグします。 次に、チェック ボックスと 2 つのコンボ ボックスをパネルにドラッグします。
パネルをクリックして、そのプロパティを修正します。 [キャプション] を「ペン」に変更します。
チェック ボックスをクリックします。 [キャプション] を「太さ」に変更し、[ID] を「ID_PEN_THICK_OR_THIN」に変更します。
1 つ目のコンボ ボックスをクリックします。 [キャプション]、[ID]、[テキスト]、[種類]、[データ] を、それぞれ「細いペン」、「ID_PEN_THIN_WIDTH」、「2」、「ドロップダウン リスト」、「1;2;3;4;5;6;7;8;9;」に変更します。
2 つ目のコンボ ボックスをクリックします。 [キャプション]、[ID]、[テキスト]、[種類]、[データ] を、それぞれ「太いペン」、「ID_PEN_THICK_WIDTH」、「5」、「ドロップダウン リスト」、「5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;」に変更します。
新しいコンボ ボックスは既存のメニュー項目には対応していません。 したがって、それぞれのペン オプションに対するメニュー項目を作成する必要があります。
[リソース ビュー] ウィンドウで、IDR_SCRIBBTYPE メニュー リソースを開きます。
[ペン] をクリックして [ペン] メニューを開きます。 次に、[ここへ入力] をクリックし、「細いペン(&N)」と入力します。
今入力した文字列を右クリックすると [プロパティ] ウィンドウが表示されます。ここで、ID プロパティを「ID_PEN_THIN_WIDTH」に変更します。
また、ペン メニューの各項目に対するイベント ハンドラーを作成する必要もあります。 直前に作成した [細いペン(&N)] メニュー項目を右クリックし、[イベント ハンドラーの追加] をクリックします。 イベント ハンドラー ウィザードが表示されます。
このウィザードの [クラス リスト] ボックスで [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(pThinComboBox->GetItem(nCurSel)); } // Create a new pen using the selected width ReplacePen();
次に、太いペンのメニュー項目とイベント ハンドラーを作成します。
[リソース ビュー] ウィンドウで、IDR_SCRIBBTYPE メニュー リソースを開きます。
[ペン] をクリックして [ペン] メニューを開きます。 次に、[ここへ入力] をクリックし、「太いペン(&K)」と入力します。
今入力したテキストを右クリックすると、[プロパティ] ウィンドウが表示されます。 ID プロパティを「ID_PEN_THICK_WIDTH」に変更します。
直前に作成した [太いペン] メニュー項目を右クリックし、[イベント ハンドラーの追加] をクリックします。 イベント ハンドラー ウィザードが表示されます。
このウィザードの [クラス リスト] ボックスで [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(pThickComboBox->GetItem(nCurSel)); } // Create a new pen using the selected width ReplacePen();
変更内容を保存し、アプリケーションをビルドして実行します。 新しいボタンとコンボ ボックスが表示されます。 フリーハンドでさまざまな太さのペンを使用してみます。
[セクション]
ペン パネルへのカラー ボタンの追加
次は、カラーでフリーハンド描画できる CMFCRibbonColorButton オブジェクトを追加します。
ペン パネルにカラー ボタンを追加するには
カラー ボタンを追加する前に、カラー ボタンのメニュー項目を作成します。 [リソース ビュー] ウィンドウで、IDR_SCRIBBTYPE メニュー リソースを開きます。 [ペン] メニュー項目をクリックして [ペン] メニューを開きます。 [ここへ入力] をクリックし、「カラー(&C)」と入力します。 今入力したテキストを右クリックすると、[プロパティ] ウィンドウが表示されます。 ID を「ID_PEN_COLOR」に変更します。
ここで、カラー ボタンを追加します。 [ツールボックス] から、カラー ボタンを [ペン] パネルにドラッグします。
カラー ボタンをクリックします。 [キャプション]、[ID]、[Simple Look]、[Large Image Index]、[分割モード] を、それぞれ「カラー」、「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 アプリケーションの更新を行いました。 既存のアプリケーションを修正するときに、そのガイドとしてこのチュートリアルを使用してください。
参照
処理手順
チュートリアル: MFC Scribble アプリケーションの更新 (パート 1)