次の方法で共有


チュートリアル: MFC Scribble アプリケーションの更新 (パート 2)

このチュートリアルのパート 1 では、従来の Scribble アプリケーションに Office Fluent リボンを追加する方法について説明しました。 このパートでは、メニューやコマンドの代わりにユーザーが使用できるリボン パネルとコントロールを追加する方法を示します。

[前提条件]

Visual C++ のサンプル

セクション

このチュートリアルのこの部分には、次のセクションがあります。

リボンへの新しいパネルの追加

次の手順では、ツール バーとステータス バーの表示を制御する 2 つのチェック ボックスを含む ビュー パネルと、複数ドキュメント インターフェイス (MDI) ウィンドウ の作成と配置を制御する垂直方向の分割ボタンを含むウィンドウ パネルを追加する方法を示します。

ビュー パネルとウィンドウ パネルをリボン バーに追加するには

  1. Viewという名前のパネルを作成します。このパネルには、ステータス バーとツール バーを切り替える 2 つのチェック ボックスがあります。

    1. ツールボックスから、パネル[ホーム] カテゴリにドラッグします。 次に、2 つの チェック ボックス をパネルにドラッグします。

    2. パネルをクリックしてプロパティを変更します。 キャプションViewに変更します。

    3. 最初のチェック ボックスをクリックして、そのプロパティを変更します。 ID をID_VIEW_TOOLBAR に変更し、キャプションToolbar に変更します。

    4. 2 番目のチェック ボックスをクリックして、そのプロパティを変更します。 ID をID_VIEW_STATUS_BAR に変更し、キャプションStatus Bar に変更します。

  2. 分割ボタンを持つ Window という名前のパネルを作成します。 ユーザーが分割ボタンをクリックすると、ショートカット メニューに、Scribble アプリケーションで既に定義されている 3 つのコマンドが表示されます。

    1. ツールボックスから、パネル[ホーム] カテゴリにドラッグします。 次に、 ボタン をパネルにドラッグします。

    2. パネルをクリックしてプロパティを変更します。 キャプションWindowに変更します。

    3. ボタンをクリックします。 キャプションWindowsに、キーwに、大きな画像インデックス1に変更し、分割モードFalseに変更します。 次に、メニュー項目の横にある省略記号 (...) をクリックして、[アイテム エディター] ダイアログ ボックスを開きます。

    4. [ 追加] を 3 回クリックして、3 つのボタンを追加します。

    5. 最初のボタンをクリックし、[ キャプション ] を [ New Window] に変更し、[ ID] を [ ID_WINDOW_NEW] に変更します。

    6. 2 番目のボタンをクリックし、[ キャプション ] を [ Cascade] に変更し、[ ID] を [ ID_WINDOW_CASCADE] に変更します。

    7. 3 番目のボタンをクリックし、[ キャプション ] を [ Tile] に変更し、[ ID] を [ ID_WINDOW_TILE_HORZ] に変更します。

  3. 変更を保存し、アプリケーションをビルドして実行します。 [表示] パネルと [ウィンドウ] パネルが表示されます。 ボタンをクリックして、正しく機能することを確認します。

リボンへのヘルプ パネルの追加

これで、Scribble アプリケーションで定義されている 2 つのメニュー項目を、 ヘルプ トピックAbout Scribble という名前のリボン ボタンに割り当てることができます。 ボタンは 、ヘルプという名前の新しいパネルに追加されます。

ヘルプ パネルを追加するには

  1. ツールボックスから、パネル[ホーム] カテゴリにドラッグします。 次に、2 つの ボタンを パネルにドラッグします。

  2. パネルをクリックしてプロパティを変更します。 キャプションHelpに変更します。

  3. 最初のボタンをクリックします。 キャプションHelp Topicsに変更し、ID をID_HELP_FINDERに変更します。

  4. 2 番目のボタンをクリックします。 キャプションAbout Scribble...に変更し、ID をID_APP_ABOUTに変更します。

  5. 変更を保存し、アプリケーションをビルドして実行します。 2 つのリボン ボタンを含む ヘルプ パネルを表示する必要があります。

    Von Bedeutung

    [ヘルプ トピック] ボタンをクリックすると、Scribble アプリケーションによって、your_project_name.chm という名前の圧縮された HTML (.chm) ヘルプ ファイルが開きます。 そのため、プロジェクトの名前が Scribble でない場合は、ヘルプ ファイルの名前をプロジェクト名に変更する必要があります。

リボンへのペン パネルの追加

次に、ペンの太さと色を制御するボタンを表示するパネルを追加します。 このパネルには、太いペンと細いペンを切り替えるチェック ボックスが含まれています。 その機能は、Scribble アプリケーションの [太線 ] メニュー項目に似ています。

元の Scribble アプリケーションでは、ユーザーがメニューの [ペンの幅] をクリックしたときに表示されるダイアログ ボックスから ペンの幅 を選択できます。 リボン バーには新しいコントロール用の十分なスペースがあるため、リボンの 2 つのコンボ ボックスを使用してダイアログ ボックスを置き換えることができます。 1 つのコンボ ボックスで細いペンの幅を調整し、もう 1 つのコンボ ボックスで太いペンの幅を調整します。

ペン パネルとコンボ ボックスをリボンに追加するには

  1. ツールボックスから、パネル[ホーム] カテゴリにドラッグします。 次に、 チェック ボックス と 2 つの コンボ ボックス をパネルにドラッグします。

  2. パネルをクリックしてプロパティを変更します。 キャプションPenに変更します。

  3. チェック ボックスをオンにします。 キャプションUse Thickに変更し、ID をID_PEN_THICK_OR_THINに変更します。

  4. 最初のコンボ ボックスをクリックします。 キャプションThin PenIDID_PEN_THIN_WIDTHType to Drop ListData to 1;2;3;4;5;6;7;8;9;Text to 2に変更します。

  5. 2 番目のコンボ ボックスをクリックします。 キャプションThick PenIDID_PEN_THICK_WIDTHType to Drop ListData to 5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;Text to 5に変更します。

  6. 新しいコンボ ボックスは既存のメニュー項目には対応しないため、すべてのペン オプションのメニュー項目を作成する必要があります。

    1. [ リソース ビュー ] ウィンドウで、 IDR_SCRIBBTYPE メニュー リソースを開きます。

    2. [ ペン ] をクリックしてペン メニューを開きます。 [ ここに入力 ] をクリックし、「 Thi&n Pen」と入力します。

    3. 入力したテキストを右クリックして [プロパティ ] ウィンドウを開き、ID プロパティを ID_PEN_THIN_WIDTH に変更します。

    4. すべてのペン メニュー項目のイベント ハンドラーを作成します。 作成した [Thi>n ペン ] メニュー項目を右クリックし、[ イベント ハンドラーの追加] をクリックします。 イベント ハンドラー ウィザードが表示されます。

    5. ウィザードの [クラス] リスト ボックスで、[ CScribbleDoc ] を選択し、[ 追加と編集] をクリックします。 このコマンドは、 CScribbleDoc::OnPenThinWidthという名前のイベント ハンドラーを作成します。

    6. 次のコードを 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();
      
  7. 次に、太いペンのメニュー項目とイベント ハンドラーを作成します。

    1. [ リソース ビュー ] ウィンドウで、 IDR_SCRIBBTYPE メニュー リソースを開きます。

    2. [ ペン ] をクリックしてペン メニューを開きます。 [ ここに入力 ] をクリックし、「 Thic&k Pen」と入力します。

    3. 入力したテキストを右クリックして、[ プロパティ ] ウィンドウを表示します。 ID プロパティを ID_PEN_THICK_WIDTHに変更します。

    4. 作成した シック ペン メニュー項目を右クリックし、[ イベント ハンドラーの追加] をクリックします。 イベント ハンドラー ウィザードが表示されます。

    5. ウィザードの [クラス] リスト ボックスで、[ CScribbleDoc ] を選択し、[ 追加と編集] をクリックします。 このコマンドは、 CScribbleDoc::OnPenThickWidthという名前のイベント ハンドラーを作成します。

    6. 次のコードを 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();
      
  8. 変更を保存し、アプリケーションをビルドして実行します。 新しいボタンとコンボ ボックスが表示されます。 さまざまなペンの幅を使用して、文字を書き出してみてください。

ペン パネルへのカラー ボタンの追加

次に、 CMFCRibbonColorButton オブジェクトを追加します。このオブジェクトを使用すると、ユーザーは色で文字を書き込めます。

ペン パネルにカラー ボタンを追加するには

  1. 色ボタンを追加する前に、そのメニュー項目を作成します。 [ リソース ビュー ] ウィンドウで、 IDR_SCRIBBTYPE メニュー リソースを開きます。 [ペン] メニュー項目をクリックして、ペン メニューを開きます。 [ ここに入力 ] をクリックし、「 &Color」と入力します。 入力したテキストを右クリックして、[ プロパティ ] ウィンドウを表示します。 ID を ID_PEN_COLORに変更します。

  2. 次に、色ボタンを追加します。 ツールボックスから、[色] ボタン[ペン] パネルにドラッグします。

  3. 色ボタンをクリックします。 キャプションColorIDID_PEN_COLORSimple Look to TrueLarge Image Index to 1Split ModeFalse に変更します。

  4. 変更を保存し、アプリケーションをビルドして実行します。 [ ペン ] パネルに新しい色のボタンが表示されます。 ただし、イベント ハンドラーがまだないため、使用できません。 次の手順では、カラー ボタンのイベント ハンドラーを追加する方法を示します。

ドキュメント クラスへの Color メンバーの追加

元の Scribble アプリケーションにはカラー ペンがないため、それらの実装を記述する必要があります。 ドキュメントのペンの色を保存するには、ドキュメント クラスに新しいメンバーを追加 CscribbleDoc

ドキュメント クラスにカラー メンバーを追加するには

  1. scribdoc.h の CScribbleDoc クラスで、 // Attributes セクションを見つけます。 m_nThickWidth データ メンバーの定義の後に、次のコード行を追加します。

    // Current pen color
    COLORREF m_penColor;
    
  2. すべてのドキュメントには、ユーザーが既に描画したストークの一覧が含まれています。 すべてのストロークは、 CStroke オブジェクトによって定義されます。 CStroke クラスにはペンの色に関する情報は含まれていないため、クラスを変更する必要があります。 scribdoc.h の CStroke クラスで、 m_nPenWidth データ メンバーの定義の後に次のコード行を追加します。

    // Pen color for the stroke
    COLORREF m_penColor;
    
  3. scribdoc.h で、パラメーターで幅と色を指定する新しい CStroke コンストラクターを追加します。 CStroke(UINT nPenWidth); ステートメントの後に次のコード行を追加します。

    CStroke(UINT nPenWidth, COLORREF penColor);
    
  4. 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();
    }
    
  5. CStroke::DrawStroke メソッドの 2 行目を次のように変更します。

    if (!penStroke.CreatePen(PS_SOLID, m_nPenWidth, m_penColor))
    
  6. ドキュメント クラスの既定のペンの色を設定します。 scribdoc.cppで、m_nThickWidth = 5; ステートメントの後に次の行をCScribbleDoc::InitDocumentに追加します。

    // default pen color is black
    m_penColor = RGB(0, 0, 0);
    
  7. scribdoc.cppで、 CScribbleDoc::NewStroke メソッドの最初の行を次のように変更します。

    CStroke* pStrokeItem = new CStroke(m_nPenWidth, m_penColor);
    
  8. CScribbleDoc::ReplacePen メソッドの最後の行を次のように変更します。

    m_penCur.CreatePen(PS_SOLID, m_nPenWidth, m_penColor);
    
  9. 前の手順で m_penColor メンバーを追加しました。 次に、メンバーを設定するカラー ボタンのイベント ハンドラーを作成します。

    1. [ リソース ビュー] ウィンドウで、IDR_SCRIBBTYPE メニュー リソースを開きます。

    2. [色] メニュー項目を右クリックし、[イベント ハンドラーの追加] をクリックします。 イベント ハンドラー ウィザードが表示されます。

    3. ウィザードの [クラス] リスト ボックスで、[ CScribbleDoc ] を選択し、[ 追加と編集] ボタンをクリックします。 このコマンドは、 CScribbleDoc::OnPenColor イベント ハンドラー スタブを作成します。

  10. 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();
    }
    
  11. 変更を保存し、アプリケーションをビルドして実行します。 これで、カラー ボタンを押して、ペンの色を変更できるようになりました。

ペンの初期化と環境設定の保存

次に、ペンの色と幅を初期化します。 最後に、ファイルからカラー図面を保存して読み込みます。

リボン バーのコントロールを初期化するには

  1. リボン バーのペンを初期化します。

    m_sizeDoc = CSize(200,200) ステートメントの後の CScribbleDoc::InitDocument メソッドで、次のコードをscribdoc.cppに追加します。

    // 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);
    
  2. カラー図面をファイルに保存します。 ar << (WORD)m_nPenWidth; ステートメントの後に、CStroke::Serialize メソッドで次のステートメントをscribdoc.cppに追加します。

    ar << (COLORREF)m_penColor;
    
  3. 最後に、ファイルからカラー図面を読み込みます。 m_nPenWidth = w; ステートメントの後に、CStroke::Serialize メソッドに次のコード行を追加します。

    ar >> m_penColor;
    
  4. 次に、色を付けて書き込み、図面をファイルに保存します。

結論

MFC Scribble アプリケーションを更新しました。 このチュートリアルは、既存のアプリケーションを変更する場合のガイドとして使用します。

こちらも参照ください

チュートリアル
チュートリアル: MFC Scribble アプリケーションの更新 (パート 1)