Mfc-controls-management
MFC-コントロール管理
MFCアプリケーションでは、アプリケーションに視覚的にコントロールを追加した後、コード内でコントロールを参照する場合、そのコントロールに基づいて、または関連付けられた変数を宣言できます。 MFCライブラリを使用すると、アプリケーションで使用される一部のコントロールの2種類の変数を値またはコントロール変数として宣言できます。
- 1つの変数は、コントロールに保存されている情報に使用されます。これは、*コントロール変数/インスタンス*とも呼ばれます。
- 他の変数は Control Value Variable として知られています。 ユーザーは、この変数を使用して、そのコントロールに対して何らかのアクションを実行できます。
制御変数/インスタンス
制御変数は、制御を管理するクラスに基づく変数です。 たとえば、ボタンコントロールはCButtonクラスに基づいています。
これらの概念を実際のプログラミングで見るために、MFCダイアログベースのプロジェクトMFCControlManagementを作成しましょう。
プロジェクトが作成されると、デザイナーウィンドウに次のダイアログボックスが表示されます。
- ステップ1 *-次のスナップショットに示すように、TODO行を削除し、1つのチェックボックスと1つの編集コントロールをドラッグします。 チェックボックスのキャプションを[制御を有効にする]に変更します。
- ステップ2 *-チェックボックスを右クリックします。
- ステップ3 *-[変数の追加]を選択します。
- ステップ4 *-メンバー変数の追加ウィザードが表示されます。
このダイアログボックスでさまざまなオプションを選択できます。 チェックボックスの場合、変数タイプはCButtonです。 このダイアログボックスではデフォルトで選択されています。
同様に、コントロールIDもデフォルトで選択されています。カテゴリコンボボックスで[コントロール]を選択し、[変数名]編集ボックスにm_enableDisableCheckと入力して[完了]をクリックする必要があります。
- ステップ5 *-同様に、次のスナップショットに示されている設定で編集コントロールのコントロール変数を追加します。
ダイアログクラスのヘッダーファイルを確認します。 新しい変数が追加されたことがわかります。
CButton m_enableDisableCheck;
CEdit m_myEditControl;
制御値変数
コントロールに対して宣言できる別のタイプの変数は、値変数です。 すべてのコントロールが値変数を提供するわけではありません。
- 値変数は、参照するコントロールに格納されている値のタイプを処理できる必要があります。
- たとえば、テキストベースのコントロールはテキストの処理に使用されるため、テキストベースのデータ型を宣言できます。 通常、これはCString変数になります。
チェックボックスと編集制御のためにこのタイプの変数を見てみましょう。
- ステップ1 *-チェックボックスを右クリックして、変数の追加を選択します。
- ステップ2 *-変数のタイプはBOOLです。 [カテゴリ]ドロップダウンリストから[値]を選択します。
- ステップ3 *-[完了]をクリックして続行します。
- ステップ4 *-同様に、次のスナップショットに示すように、編集コントロールの値変数を設定で追加します。
- ステップ5 *-変数タイプにCString、変数名フィールドにm_editControlValと入力します。
- ステップ6 *-これらの変数がヘッダーファイルに追加されたことを確認できます。
bool m_enableDisableVal;
CString m_editControlVal;
イベントハンドラーの制御
コントロールをアプリケーションに追加した後、視覚的に追加するか動的に作成するかに関係なく、ユーザーがコントロールに対して実行できるアクションの処理方法も決定します。
- 既にクラスに関連付けられているプロジェクトダイアログボックスの場合、イベントハンドラーを作成するときにいくつかのショートカットを利用できます。
- デフォルトのコントロール通知イベントまたは適用可能なWindowsメッセージのいずれかのハンドラーをすばやく作成できます。
チェックボックスのイベントハンドラーを追加した同じ例を見てみましょう。
- ステップ1 *-通知イベントを処理するコントロールを右クリックします。
- ステップ2 *-ショートカットメニューで、[イベントハンドラーの追加]をクリックして、イベントハンドラーウィザードを表示します。
- ステップ3 *-[メッセージタイプ]ボックスでイベントを選択して、[クラス]リストボックスで選択したクラスに追加します。
- ステップ4 *-[関数ハンドラー名]ボックスでデフォルト名を受け入れるか、選択した名前を入力します。
- ステップ5 *-[追加と編集]をクリックして、イベントハンドラーを追加します。
- ステップ6 *-CMFCControlManagementDlg.cppファイルの最後に次のイベントが追加されました。
void CMFCControlManagementDlg::OnBnClickedCheck1() {
//TODO: Add your control notification handler code here
}
コントロール管理
これまで、コントロールをアプリケーションに追加する方法を見てきました。 ユーザーの要件に応じてこれらのコントロールを管理する方法について説明します。 特定のイベントハンドラーで制御変数/インスタンスを使用できます。
- ステップ1 *-次の例を見てみましょう。 ここでは、チェックボックスがオン/オフになったときに編集コントロールを有効/無効にします。
- ステップ2 *-チェックボックスクリックイベントハンドラーを追加しました。 ここに実装があります-
void CMFCControlManagementDlg::OnBnClickedCheck1() {
//TODO: Add your control notification handler code here
UpdateData(TRUE);
if (m_enableDisableVal)
m_myEditControl.EnableWindow(TRUE);
else
m_myEditControl.EnableWindow(FALSE);
}
- *ステップ3 *-ダイアログが作成されたら、CMFCControlManagementDlg
- OnInitDialog()に次のコードを追加する必要があります。 これにより、これらのコントロールが管理されます。
UpdateData(TRUE);
if (m_enableDisableVal)
m_myEditControl.EnableWindow(TRUE);
else
m_myEditControl.EnableWindow(FALSE);
- ステップ4 *-CMFCControlManagementDlg.cppファイルの完全な実装です。
//MFCControlManagementDlg.cpp : implementation file
//
#include "stdafx.h"
#include "MFCControlManagement.h"
#include "MFCControlManagementDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//CAboutDlg dialog used for App About
class CAboutDlg : public CDialogEx {
public:
CAboutDlg();
//Dialog Data
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX);//DDX/DDV support
//Implementation
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) {
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX) {
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
//CMFCControlManagementDlg dialog
CMFCControlManagementDlg::CMFCControlManagementDlg(CWnd* pParent/* = NULL*/)
:CDialogEx(IDD_MFCCONTROLMANAGEMENT_DIALOG, pParent) ,
m_enableDisableVal(FALSE) , m_editControlVal(_T("")) {
m_hIcon = AfxGetApp()&rarr LoadIcon(IDR_MAINFRAME);
}
void CMFCControlManagementDlg::DoDataExchange(CDataExchange* pDX) {
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_CHECK1, m_enableDisableCheck);
DDX_Control(pDX, IDC_EDIT1, m_myEditControl);
DDX_Check(pDX, IDC_CHECK1, m_enableDisableVal);
DDX_Text(pDX, IDC_EDIT1, m_editControlVal);
}
BEGIN_MESSAGE_MAP(CMFCControlManagementDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_CHECK1, &CMFCControlManagementDlg::OnBnClickedCheck1)
END_MESSAGE_MAP()
//CMFCControlManagementDlg message handlers
BOOL CMFCControlManagementDlg::OnInitDialog() {
CDialogEx::OnInitDialog();
//Add "About..." menu item to system menu.
//IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL) {
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty()) {
pSysMenu → AppendMenu(MF_SEPARATOR);
pSysMenu → AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
//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
//TODO: Add extra initialization here
UpdateData(TRUE);
if (m_enableDisableVal)
m_myEditControl.EnableWindow(TRUE);
else
m_myEditControl.EnableWindow(FALSE);
return TRUE;//return TRUE unless you set the focus to a control
}
void CMFCControlManagementDlg::OnSysCommand(UINT nID, LPARAM lParam) {
if ((nID & 0xFFF0) == IDM_ABOUTBOX) {
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}else {
CDialogEx::OnSysCommand(nID, lParam);
}
}
//If you add a minimize button to your dialog, you will need the code below
//to draw the icon. For MFC applications using the document/view model,
//this is automatically done for you by the framework.
void CMFCControlManagementDlg::OnPaint() {
if (IsIconic()) {
CPaintDC dc(this);//device context for painting
SendMessage(WM_ICONERASEBKGND,
reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
//Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1)/2;
int y = (rect.Height() - cyIcon + 1)/2;
//Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}else {
CDialogEx::OnPaint();
}
}
//The system calls this function to obtain the cursor to display while the user drags
//the minimized window.
HCURSOR CMFCControlManagementDlg::OnQueryDragIcon() {
return static_cast<HCURSOR>(m_hIcon);
}
void CMFCControlManagementDlg::OnBnClickedCheck1() {
//TODO: Add your control notification handler code here
UpdateData(TRUE);
if (m_enableDisableVal)
m_myEditControl.EnableWindow(TRUE);
else
m_myEditControl.EnableWindow(FALSE);
}
- ステップ5 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。 デフォルトでは、チェックボックスはオフになっています。 これにより、編集コントロールも無効になります。
- ステップ6 *-[コントロールを有効にする]チェックボックスをオンにします。 これにより、編集コントロールが自動的に有効になります。