0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

世界一短いMFCダイアログのタブコントロールサンプル

Last updated at Posted at 2022-04-27

※アカウント統合により過去記事再掲:元の投稿日 2016年04月01日

MFCアプリケーションを作る時にいつも思うのが、本当にありがた迷惑なんですよね、あれ。
ダイアログアプリケーション一つ作るにもソースが見辛いったらありゃしない。

で、ちょっとタブ切り替えをやりたいだけなのに、これが意外と面倒くさい。というか分かりづらいんですよね。

結局のところ、TCN_SELCHANGEをハンドリングして表示非表示を自分で切り替えるとかいう面倒くさーい、わかりづらーい考え方なんですよネ。

と、いう事で。

ヘッダファイルだけでダイアログアプリケーションを書いてみました。
で、タブ切り替えもやっときました。

こんな作り方したらクラスウィザードは使えなくなっちゃうんですけどね。でもまあメッセージハンドラくらい手打ちで追加しても意外と大したことなかったりするんですよね。

※前提として以下記事の"inlineMap.h"を使います。

SimpleDlg.hpp
#pragma once

#include "resource.h"
#include "inlineMap.h"

class CSimpleDlg : public CDialogEx
{
	INL_BEGIN_MESSAGE_MAP(CSimpleDlg, CDialogEx)
		ON_NOTIFY(TCN_SELCHANGE, IDC_TAB, &CSimpleDlg::OnTcnSelchangeTab)
	INL_END_MESSAGE_MAP()

public:
	CSimpleDlg(CWnd* pParent = NULL) : CDialogEx(CSimpleDlg::IDD, pParent) {
		m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	}

	enum { IDD = IDD_SIMPLEDLG_DIALOG };

protected:
	HICON m_hIcon;

	virtual BOOL OnInitDialog() {
		CDialogEx::OnInitDialog();

		SetIcon(m_hIcon, TRUE);
		SetIcon(m_hIcon, FALSE);

		// タブコントロールをなんかする
		tab.SubclassDlgItem(IDC_TAB, this);

		tab.InsertItem(0, _T("たろう"));
		tab.InsertItem(1, _T("じろう"));
		tab.InsertItem(3, _T("マイケル"));

		// タブに貼っつける奴らをなんか作ったりする
		dlg[0].Create(IDD_DIALOG1, &tab);
		dlg[1].Create(IDD_DIALOG2, &tab);
		dlg[2].Create(IDD_DIALOG3, &tab);

		// なんか場所の調整
		CRect rect;
		tab.GetWindowRect(rect);
		tab.AdjustRect(FALSE, rect);
		tab.ScreenToClient(rect);

		dlg[0].MoveWindow(rect);
		dlg[1].MoveWindow(rect);
		dlg[2].MoveWindow(rect);

		// 初回たろうを表示
		OnTcnSelchangeTab(NULL, NULL);

		return TRUE;
	}
	afx_msg void OnTcnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult) {
		auto cur = tab.GetCurSel();
		for (int i = 0; i < 3; i++) {
			dlg[i].ShowWindow(i == cur ? SW_SHOW : SW_HIDE);
		}
	}

	afx_msg HCURSOR OnQueryDragIcon() {
		return static_cast<HCURSOR>(m_hIcon);
	}

private:
	CTabCtrl tab;	// 親たぶ
	CDialog dlg[3];	// たぶの子供3枚
};

class CSimpleDlgApp : public CWinApp
{
public:
	virtual BOOL InitInstance() 
	{
		CWinApp::InitInstance();

		CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

		CSimpleDlg dlg;
		m_pMainWnd = &dlg;

		dlg.DoModal();

		return FALSE;
	}
} theApp;

ちょっとダイアログ一個作るのにソースファイルの数が多すぎて半ギレのあなた! そういうちょっぴり心の狭い、あなたと私のために87行で書いてみました。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?