Mfc-controls-management

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

MFC-コントロール管理

MFCアプリケーションでは、アプリケーションに視覚的にコントロールを追加した後、コード内でコントロールを参照する場合、そのコントロールに基づいて、または関連付けられた変数を宣言できます。 MFCライブラリを使用すると、アプリケーションで使用される一部のコントロールの2種類の変数を値またはコントロール変数として宣言できます。

  • 1つの変数は、コントロールに保存されている情報に使用されます。これは、*コントロール変数/インスタンス*とも呼ばれます。
  • 他の変数は Control Value Variable として知られています。 ユーザーは、この変数を使用して、そのコントロールに対して何らかのアクションを実行できます。

制御変数/インスタンス

制御変数は、制御を管理するクラスに基づく変数です。 たとえば、ボタンコントロールはCButtonクラスに基づいています。

これらの概念を実際のプログラミングで見るために、MFCダイアログベースのプロジェクトMFCControlManagementを作成しましょう。

MFCControlManagement

プロジェクトが作成されると、デザイナーウィンドウに次のダイアログボックスが表示されます。

作成されたMFCControlManagement

  • ステップ1 *-次のスナップショットに示すように、TODO行を削除し、1つのチェックボックスと1つの編集コントロールをドラッグします。 チェックボックスのキャプションを[制御を有効にする]に変更します。

キャプションの変更

  • ステップ2 *-チェックボックスを右クリックします。

MFCControlManagement Checkbox

  • ステップ3 *-[変数の追加]を選択します。
  • ステップ4 *-メンバー変数の追加ウィザードが表示されます。

メンバー変数の追加

このダイアログボックスでさまざまなオプションを選択できます。 チェックボックスの場合、変数タイプはCButtonです。 このダイアログボックスではデフォルトで選択されています。

同様に、コントロールIDもデフォルトで選択されています。カテゴリコンボボックスで[コントロール]を選択し、[変数名]編集ボックスにm_enableDisableCheckと入力して[完了]をクリックする必要があります。

  • ステップ5 *-同様に、次のスナップショットに示されている設定で編集コントロールのコントロール変数を追加します。

制御変数6

ダイアログクラスのヘッダーファイルを確認します。 新しい変数が追加されたことがわかります。

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 *-通知イベントを処理するコントロールを右クリックします。

イベントハンドラー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 *-[コントロールを有効にする]チェックボックスをオンにします。 これにより、編集コントロールが自動的に有効になります。

コントロール管理