Mfc-windows-resources

提供:Dev Guides
移動先:案内検索

MFC-Windowsリソース

  • リソース*は、コンパイラが画像、音声、マウスカーソル、ダイアログボックスなどのオブジェクトを管理できるようにするテキストファイルです。 Microsoft Visual Studioは、プログラミングに使用されるのと同じ環境で必要なツールを提供することにより、リソースファイルの作成を特に簡単にします。 つまり、通常、外部アプリケーションを使用してリソースファイルを作成または構成する必要はありません。 以下は、リソースに関連するいくつかの重要な機能です。
  • リソースは、ユーザーに情報を提供するインターフェース要素です。
  • ビットマップ、アイコン、ツールバー、およびカーソルはすべてリソースです。
  • 一部のリソースは、メニューからの選択やダイアログボックスへのデータ入力などのアクションを実行するために操作できます。
  • アプリケーションは、互いに独立して動作するさまざまなリソースを使用できます。これらのリソースは、*。rc拡張子を持つテキストファイルにグループ化されます。
  • ほとんどのリソースは、[リソースの追加]ダイアログボックスから目的のリソースを選択して作成されます。

リソースの追加

  • [リソースの追加]ダイアログボックスには、要件に従って使用できるリソースの広範なリストが表示されますが、使用できないものが必要な場合は、プログラムを実行する前に* .rcファイルに手動で追加できます。

識別子

  • 識別子*は、名前が通常IDで始まる定数整数であるシンボルです。 整数値(シンボル値)にマッピングされたテキスト文字列(シンボル名)の2つの部分で構成されます。
  • シンボルは、ソースコード内およびリソースエディタで作業している間、リソースとユーザーインターフェイスオブジェクトを説明する記述的な方法を提供します。
  • 新しいリソースまたはリソースオブジェクトを作成すると、*リソースエディター*は、IDC_DIALOG1などのリソースのデフォルト名を提供し、それに値を割り当てます。
  • 名前と値の定義は、Resource.hファイルに保存されます。

ステップ1 *-ダイアログボックスを作成し、そのIDが *IDD_EXAMPLE_DLG である最後の章の CMFCDialogDemo の例を見てみましょう。

CMFCDialogDemo

  • ステップ2 *-ソリューションエクスプローラーに移動すると、ヘッダーファイルの下にresource.hファイルが表示されます。 エディタでこのファイルを開くことで続行すると、ダイアログボックスの識別子とその整数値も表示されます。

Identifiers2

アイコン

  • アイコン*は、アプリケーションを表すウィンドウで使用される小さな画像です。 2つの主なシナリオで使用されます。
  • ウィンドウのフレームでは、タイトルバーのウィンドウ名の左側に表示されます。
  • Windowsエクスプローラー、デスクトップ、マイコンピューター、またはコントロールパネルウィンドウ。

MFCModalDemoの例を見ると、次のスナップショットに示すように、Visual Studioがタイトルバーにデフォルトアイコンを使用していることがわかります。

アイコン

以下の手順に従って、独自のアイコンを作成できます-

  • ステップ1 *-プロジェクトを右クリックして[追加]→[リソース]を選択すると、[リソースの追加]ダイアログボックスが表示されます。

リソースの追加を選択

  • ステップ2 *-アイコンを選択して[新規]ボタンをクリックすると、次のアイコンが表示されます。

アイコン

  • ステップ3 *-ソリューションエクスプローラーで、リソースビューに移動し、MFCModalDemo>アイコンを展開します。 2つのアイコンが表示されます。 IDR_MAINFRAMEはデフォルトのもので、IDI_ICON1は新しく作成されたアイコンです。
  • ステップ4 *-新しく作成されたアイコンを右クリックし、[プロパティ]を選択します。
  • ステップ5 *-IDI_ICON1はこのアイコンのIDです。このIDをIDR_MYICONに変更しましょう。
  • ステップ6 *-必要に応じて、デザイナーでこのアイコンを変更できます。 同じアイコンを使用します。
  • ステップ7 *-このアイコンを保存します。
  • ステップ8 *-次のコードのように見えるCMFCModalDemoDlg.cppファイルのCMFCModalDemoDlgコンストラクターに移動します。
CMFCModalDemoDlg::CMFCModalDemoDlg(CWnd* pParent/* = NULL*/)
   : CDialogEx(IDD_MFCMODALDEMO_DIALOG, pParent) {
   m_hIcon = AfxGetApp() -> LoadIcon(IDR_MAINFRAME);
}
  • ステップ9 *-デフォルトのアイコンがコンストラクターにロードされていることがわかります。 次のコードに示すように、IDR_ MYICONに変更します。
CMFCModalDemoDlg::CMFCModalDemoDlg(CWnd* pParent/* = NULL*/)
   : CDialogEx(IDD_MFCMODALDEMO_DIALOG, pParent) {
   m_hIcon = AfxGetApp() -> LoadIcon(IDR_ MYICON);
}
  • ステップ10 *-上記のコードをコンパイルして実行すると、ダイアログボックスに新しいアイコンが表示されます。

モーダルデモ

メニュー

  • メニュー*を使用すると、論理的で見つけやすい方法でコマンドを配置できます。 メニューエディターを使用すると、完成したアプリケーションのメニューバーによく似たメニューバーを直接操作して、メニューを作成および編集できます。 メニューを作成するには、以下の手順に従ってください-
  • ステップ1 *-プロジェクトを右クリックして、[追加]→[リソース]を選択します。 [リソースの追加]ダイアログボックスが表示されます。

リソースの追加メニュー

  • ステップ2 *-メニューを選択し、[新規]をクリックします。 メニューバーに「ここに入力」を含む四角形が表示されます。

ここにメニューバーを入力

  • ステップ3 *-ファイル、編集などのメニューオプションを記述します。 次のスナップショットに示すように。

メニューオプション

  • ステップ4 *-リソースビューでメニューフォルダーを展開すると、メニューID IDR_MENU1が表示されます。 この識別子を右クリックして、IDM_MAINMENUに変更します。

メニュー識別子

  • ステップ5 *-すべての変更を保存します。
  • ステップ6 *-このメニューをダイアログボックスに添付する必要があります。 ソリューションエクスプローラーでDialogフォルダーを展開し、ダイアログボックス識別子をダブルクリックします。

ダイアログフォルダー

  • ステップ7 *-[プロパティ]にメニューフィールドが表示されます。 上記のように、ドロップダウンからメニュー識別子を選択します。
  • ステップ8 *-このアプリケーションを実行すると、メニューオプションを含む次のダイアログボックスが表示されます。

メニューオプション

ツールバー

  • ツールバー*は、ユーザーがメニューを使用する代わりにボタンをクリックすることでフォーム上でいくつかのアクションを実行できるようにするWindowsコントロールです。
  • ツールバーは、最もアクセスしやすいアクションをボタンとして提供することにより、ユーザーの仕事を簡素化する便利なボタンのグループを提供します。
  • ツールバーは、このような一般的なアクションをユーザーに近づけることができます。
  • 通常、ツールバーはメインメニューの下に表示されます。
  • ボタンを装備することもできますが、ボタンまたはボタンの一部にキャプションが付いている場合があります。
  • ツールバーには、他のタイプのコントロールを装備することもできます。

ツールバーを作成するには、次の手順を実行します。

  • ステップ1 *-プロジェクトを右クリックして、[追加]→[リソース]を選択します。 [リソースの追加]ダイアログボックスが表示されます。

ツールバー

  • ステップ2 *-ツールバーを選択し、[新規]をクリックします。 次の画面が表示されます。

ツールバーの選択

  • ステップ3 *-次のスクリーンショットに示すように、デザイナーでツールバーを設計し、IDも指定します。

デザインツールバー

  • ステップ4 *-CMFCModalDemoDlgクラスにこれらの2つの変数を追加します。
   CToolBar m_wndToolBar;
   BOOL butD;
  • ステップ5 *-CMFCModalDemoDlg.hファイルのCMFCModalDemoDlgの完全な実装を次に示します-
class CMFCModalDemoDlg : public CDialogEx {
  //Construction
   public:
      CMFCModalDemoDlg(CWnd* pParent = NULL);//standard constructor
  //Dialog Data
   #ifdef AFX_DESIGN_TIME
      enum { IDD = IDD_MFCMODALDEMO_DIALOG };
   #endif

   protected:
      virtual void DoDataExchange(CDataExchange* pDX);//DDX/DDV support

  //Implementation
   protected:
      HICON m_hIcon;
      CToolBar m_wndToolBar;
      BOOL butD;

     //Generated message map functions
      virtual BOOL OnInitDialog();
      afx_msg void OnPaint();
      afx_msg HCURSOR OnQueryDragIcon();
      DECLARE_MESSAGE_MAP()

   public:
      afx_msg void OnBnClickedOk();
};
*ステップ6 *-次のコードに示すようにCMFCModalDemoDlg
OnInitDialog()を更新します。
BOOL CMFCModalDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

  //Set the icon for this dialog. The framework does this automatically
  //when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);      //Set big icon
   SetIcon(m_hIcon, FALSE);     //Set small icon

   if (!m_wndToolBar.Create(this)
      || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1))
     //if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |
     //WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS |
     //CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
     //!m_wndToolBar.LoadToolBar(IDR_TOOLBAR1)) {
         TRACE0("Failed to Create Dialog Toolbar\n");
         EndDialog(IDCANCEL);
      }
      butD = TRUE;
      CRect rcClientOld;//Old Client Rect
      CRect rcClientNew;//New Client Rect with Tollbar Added

     //Retrive the Old Client WindowSize
     //Called to reposition and resize control bars in the client area of a window
     //The reposQuery FLAG does not really traw the Toolbar. It only does the calculations.
     //And puts the new ClientRect values in rcClientNew so we can do the rest of the Math.

      GetClientRect(rcClientOld);
      RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0, reposQuery, rcClientNew);
     //All of the Child Windows (Controls) now need to be moved so the Tollbar does not cover them up.
     //Offest to move all child controls after adding Tollbar
      CPoint ptOffset(rcClientNew.left - rcClientOld.left, rcClientNew.top - rcClientOld.top);

      CRect rcChild;
      CWnd* pwndChild = GetWindow(GW_CHILD);//Handle to the Dialog Controls

      while (pwndChild)//Cycle through all child controls {
         pwndChild -> GetWindowRect(rcChild);//Get the child control RECT
         ScreenToClient(rcChild);

        //Changes the Child Rect by the values of the claculated offset
         rcChild.OffsetRect(ptOffset);
         pwndChild -> MoveWindow(rcChild, FALSE);//Move the Child Control
         pwndChild = pwndChild -> GetNextWindow();
      }

      CRect rcWindow;
     //Get the RECT of the Dialog
      GetWindowRect(rcWindow);

     //Increase width to new Client Width
      rcWindow.right += rcClientOld.Width() - rcClientNew.Width();

     //Increase height to new Client Height
       rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height();
     //Redraw Window
      MoveWindow(rcWindow, FALSE);

     //Now we REALLY Redraw the Toolbar
      RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

  //TODO: Add extra initialization here

   return TRUE;//return TRUE unless you set the focus to a control
}
  • ステップ7 *-このアプリケーションを実行します。 ツールバーを含む次のダイアログボックスが表示されます。

Toolbar4

加速器

  • アクセスキー*は、マウスの代わりにキーボードを使用することにより、ユーザーがメニューアクションをより速く実行できるようにする文字です。 これは通常、ユーザーがマウスをどこにでも配置する必要がないため高速であり、アクションの実行にかかる時間を短縮します。
  • ステップ1 *-アクセスキーを作成するには、メニュー項目の左側にアンパサンド「&」を入力します。

アクセスキーの作成

  • ステップ2 *-すべてのメニューオプションに対してこのステップを繰り返します。 このアプリケーションを実行し、Altキーを押します。 すべてのメニューオプションの最初の文字に下線が付いていることがわかります。

メニューオプション

ショートカットキー

ショートカットキーは、上級ユーザーがメニュー項目に対して実行するアクションを実行するために使用するキーまたはキーの組み合わせです。 ほとんどのショートカットは、Ctrlキーと文字キーを同時に押すことの組み合わせです。 たとえば、Ctrl + N、Ctrl + O、またはCtrl +D。

ショートカットを作成するには、メニューキャプションを構成する文字列の右側で、メニュー項目を右クリックしてプロパティを選択します。

[キャプション]フィールドに\ tを入力し、次に[新規]メニューオプションのように目的の組み合わせを入力します。 すべてのメニューオプションに対してこの手順を繰り返します。

ショートカットキー

アクセラレータテーブル

アクセラレータテーブルは、テーブルの各アイテムが識別子、ショートカットキー、およびアクセラレータキーの種類を指定する定数を組み合わせたアイテムのリストです。 他のリソースと同様に、アクセラレータテーブルは.rcファイルに手動で作成できます。 アクセラレータテーブルを作成する手順は次のとおりです。

ステップ1 *-アクセラレータテーブルを作成するには、ソリューションエクスプローラーで .rcファイルを右クリックします。

アクセラレータテーブル

  • ステップ2 *-アクセラレータを選択して、[新規]をクリックします。

アクセラレータを選択

  • ステップ3 *-IDコンボボックスの矢印をクリックし、メニュー項目を選択します。

アクセラレータテーブル

  • ステップ4 *-修飾子ドロップダウンからCtrlを選択します。
  • ステップ5 *-[キー]ボックスをクリックし、両方のメニューオプションに対応するキーを入力します。

また、新しいメニュー項目イベントハンドラーをテストに追加します。 [新規]メニューオプションを右クリックします。

イベントハンドラー

  • ステップ6 *-クラス、メッセージタイプ、ハンドラー名を指定できます。 とりあえず、そのままにして[追加と編集]ボタンをクリックします。

メッセージタイプハンドラー名

  • ステップ7 *-[イベントハンドラーの追加]を選択します。
  • ステップ8 *-CMFCModalDemoDlg.cppファイルの最後に追加されたイベントが表示されます。
void CMFCModalDemoDlg::OnFileNew() {
  //TODO: Add your command handler code here
   MessageBox(L"File > New menu option");
}
  • ステップ9 *-*今*シンプルなメニューオプションメッセージを表示するメッセージボックスを追加しましょう。

作業中にアクセラレータテーブルを開始するには、次のCMFCModalDemoAppに示すように、HACCEL変数とProcessMessageFilterを追加します。

class CMFCModalDemoApp : public CWinApp {
   public:
      CMFCModalDemoApp();

  //Overrides
   public:
      virtual BOOL InitInstance();
      HACCEL m_hAccelTable;

     //Implementation

      DECLARE_MESSAGE_MAP()
      virtual BOOL ProcessMessageFilter(int code, LPMSG lpMsg);
};
*ステップ10 *-CMFCModalDemoApp
InitInstance()でアクセラレータと次の呼び出しをロードします。
m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(),
   MAKEINTRESOURCE(IDR_ACCELERATOR1));
  • ステップ11 *-ProcessMessageFilterの実装です。
BOOL CMFCModalDemoApp::ProcessMessageFilter(int code, LPMSG lpMsg) {
   if (code >= 0 && m_pMainWnd && m_hAccelTable) {
      if (::TranslateAccelerator(m_pMainWnd -> m_hWnd, m_hAccelTable, lpMsg))
      return TRUE;
   }
   return CWinApp::ProcessMessageFilter(code, lpMsg);
}
  • ステップ12 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

アクセラレータ結果

  • ステップ13 *-Altキーを押してからFキーを押し、次にNキーを押すか、Ctrl + Nを押します。 次のメッセージが表示されます。

アクセラレータテーブル