この記事は2019年05月29日に投稿しました。
目次
リンク
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているMFCで画面を共用する方法についてです。
2. MFCで画面を共用する
MFCで画面を共用する方法ですが、今回はTabControlを利用して行います。
- CSampleADlg : TabControlを持ち、タブにより共用する画面(CCommonDlg)を表示します。
- CCommonDlg : タブにより表示される画面
タブに表示される画面のため、画面のプロパティでBorderはなし、Styleは子に設定します。 - CCommonADlg : タブにより表示される画面で、画面ごとの機能をカスタマイズします。
実装例では、ラベルとボタンをカスタマイズしています。
実装例
CommonDlg.h
#pragma once #include "afxwin.h" #include "resource.h" // CCommonDlg ダイアログ class CCommonDlg : public CDialogEx { DECLARE_DYNAMIC(CCommonDlg) public: CCommonDlg(CWnd* pParent = NULL); // 標準コンストラクター virtual ~CCommonDlg(); // ダイアログ データ enum { IDD = IDD_COMMONDLG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート DECLARE_MESSAGE_MAP() CStatic m_lbMsg; public: virtual afx_msg void OnBnClickedButton1(); };
CommonDlg.cpp
// CommonDlg.cpp : 実装ファイル // #include "stdafx.h" #include "MFCShareScreen.h" #include "CommonDlg.h" #include "afxdialogex.h" // CCommonDlg ダイアログ IMPLEMENT_DYNAMIC(CCommonDlg, CDialogEx) CCommonDlg::CCommonDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CCommonDlg::IDD, pParent) { } CCommonDlg::~CCommonDlg() { } void CCommonDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LB_MSG, m_lbMsg); } BEGIN_MESSAGE_MAP(CCommonDlg, CDialogEx) ON_BN_CLICKED(IDC_BUTTON1, &CCommonDlg::OnBnClickedButton1) END_MESSAGE_MAP() // CCommonDlg メッセージ ハンドラー void CCommonDlg::OnBnClickedButton1() { AfxMessageBox(_T("共通画面ボタン押下")); }
CommonADlg.h
#pragma once #include "CommonDlg.h" // CCommonADlg ダイアログ class CCommonADlg : public CCommonDlg { public: CCommonADlg(CWnd* pParent = NULL); // 標準コンストラクター virtual ~CCommonADlg(); virtual BOOL OnInitDialog(); public: afx_msg void OnBnClickedButton1(); };
CommonADlg.cpp
// CommonADlg.cpp : 実装ファイル // #include "stdafx.h" #include "MFCShareScreen.h" #include "CommonADlg.h" #include "afxdialogex.h" // CommonADlg ダイアログ //IMPLEMENT_DYNAMIC(CCommonADlg, CDialogEx) CCommonADlg::CCommonADlg(CWnd* pParent /*=NULL*/) : CCommonDlg(pParent) { } CCommonADlg::~CCommonADlg() { } // CommonADlg メッセージ ハンドラー BOOL CCommonADlg::OnInitDialog() { CCommonDlg::OnInitDialog(); m_lbMsg.SetWindowText(_T("画面A")); return TRUE; } // CCommonDlg メッセージ ハンドラー void CCommonADlg::OnBnClickedButton1() { AfxMessageBox(_T("画面Aボタン押下")); }
SampleADlg.h
#pragma once #include "afxcmn.h" #include "CommonADlg.h" // CSampleADlg ダイアログ class CSampleADlg : public CDialogEx { DECLARE_DYNAMIC(CSampleADlg) public: CSampleADlg(CWnd* pParent = NULL); // 標準コンストラクター virtual ~CSampleADlg(); // ダイアログ データ enum { IDD = IDD_SAMPLEADLG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート DECLARE_MESSAGE_MAP() public: virtual BOOL OnInitDialog(); private: CTabCtrl m_tabCtrl; CCommonDlg* m_pCommonDlg; };
SampleADlg.cpp
// SampleADlg.cpp : 実装ファイル // #include "stdafx.h" #include "MFCShareScreen.h" #include "SampleADlg.h" #include "afxdialogex.h" #include "CommonDlg.h" // CSampleADlg ダイアログ IMPLEMENT_DYNAMIC(CSampleADlg, CDialogEx) CSampleADlg::CSampleADlg(CWnd* pParent /*=NULL*/) : CDialogEx(CSampleADlg::IDD, pParent) , m_pCommonDlg(NULL) { } CSampleADlg::~CSampleADlg() { } void CSampleADlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_TAB1, m_tabCtrl); } BEGIN_MESSAGE_MAP(CSampleADlg, CDialogEx) END_MESSAGE_MAP() // CSampleADlg メッセージ ハンドラー BOOL CSampleADlg::OnInitDialog() { CDialogEx::OnInitDialog(); // タブを1つ追加します。 m_tabCtrl.InsertItem(0, _T("")); // タブの表示領域を取得します。 CRect rect; m_tabCtrl.GetClientRect(&rect); // タブに表示される画面を生成します。 m_pCommonDlg = new CCommonADlg(&m_tabCtrl); m_pCommonDlg->Create(CCommonDlg::IDD, &m_tabCtrl); // タブの表示領域に画面サイズを合わせます。 m_pCommonDlg->MoveWindow(&rect); // 先頭タブを表示します。 m_tabCtrl.SetCurSel(0); m_pCommonDlg->ShowWindow(SW_SHOW); return TRUE; }
3. おわりに
業務でほぼ同じ機能で一部動作が異なる画面を共用するため、その方法を検討しました。
他の人のアドバイスもあり、TabControlを利用して実現することにしました。
リンク
紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。
私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688