Mfc-windows-resources
MFC-Windowsリソース
- リソース*は、コンパイラが画像、音声、マウスカーソル、ダイアログボックスなどのオブジェクトを管理できるようにするテキストファイルです。 Microsoft Visual Studioは、プログラミングに使用されるのと同じ環境で必要なツールを提供することにより、リソースファイルの作成を特に簡単にします。 つまり、通常、外部アプリケーションを使用してリソースファイルを作成または構成する必要はありません。 以下は、リソースに関連するいくつかの重要な機能です。
- リソースは、ユーザーに情報を提供するインターフェース要素です。
- ビットマップ、アイコン、ツールバー、およびカーソルはすべてリソースです。
- 一部のリソースは、メニューからの選択やダイアログボックスへのデータ入力などのアクションを実行するために操作できます。
- アプリケーションは、互いに独立して動作するさまざまなリソースを使用できます。これらのリソースは、*。rc拡張子を持つテキストファイルにグループ化されます。
- ほとんどのリソースは、[リソースの追加]ダイアログボックスから目的のリソースを選択して作成されます。
- [リソースの追加]ダイアログボックスには、要件に従って使用できるリソースの広範なリストが表示されますが、使用できないものが必要な場合は、プログラムを実行する前に* .rcファイルに手動で追加できます。
識別子
- 識別子*は、名前が通常IDで始まる定数整数であるシンボルです。 整数値(シンボル値)にマッピングされたテキスト文字列(シンボル名)の2つの部分で構成されます。
- シンボルは、ソースコード内およびリソースエディタで作業している間、リソースとユーザーインターフェイスオブジェクトを説明する記述的な方法を提供します。
- 新しいリソースまたはリソースオブジェクトを作成すると、*リソースエディター*は、IDC_DIALOG1などのリソースのデフォルト名を提供し、それに値を割り当てます。
- 名前と値の定義は、Resource.hファイルに保存されます。
ステップ1 *-ダイアログボックスを作成し、そのIDが *IDD_EXAMPLE_DLG である最後の章の CMFCDialogDemo の例を見てみましょう。
- ステップ2 *-ソリューションエクスプローラーに移動すると、ヘッダーファイルの下にresource.hファイルが表示されます。 エディタでこのファイルを開くことで続行すると、ダイアログボックスの識別子とその整数値も表示されます。
アイコン
- アイコン*は、アプリケーションを表すウィンドウで使用される小さな画像です。 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 *-このアプリケーションを実行します。 ツールバーを含む次のダイアログボックスが表示されます。
加速器
- アクセスキー*は、マウスの代わりにキーボードを使用することにより、ユーザーがメニューアクションをより速く実行できるようにする文字です。 これは通常、ユーザーがマウスをどこにでも配置する必要がないため高速であり、アクションの実行にかかる時間を短縮します。
- ステップ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を押します。 次のメッセージが表示されます。