プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

MFCで画面を共用する。

この記事は2019年05月29日に投稿しました。

f:id:paveway:20190914064630j:plain

目次

  1. はじめに
  2. MFCで画面を共用する
  3. おわりに

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

目次へ