コアサーバーV2プランご契約でドメイン更新費用が永久無料

- タブコントロールの使い方(2) -





前回初期化処理まで出来ているので今回は タブコントロールの1つ目のタブにエディットボックスを 表示するようにコーディングしてみます。

大まかな流れは以下になります。

1.新規にダイヤログを作成しリソースエディタで編集
2.作成したダイヤログのクラスを作成
3.メインのダイヤログクラスに作成した新しく作成したダイヤログクラスのメンバー変数を作成
4.タブコントロール機能のためのコードを追加


表示にはCreateとSetWindowPos関数を使用します。


□ MSDNよりCreateとSetWindowPosの引用 □

 BOOL Create(
  UINT nIDTemplate,
  CWnd* pParentWnd = NULL
 );

  ・nIDTemplateはダイアログ ボックス テンプレート リソースの ID 番号
  ・pParentWndはダイアログオブジェクトが所属するCWnd 型の親ウィンドウ オブジェクトへのポインタ
  ・戻り値はダイアログボックステンプレートリソース名を表す NULL 文字で終わる文字列


 BOOL SetWindowPos(
  const CWnd* pWndInsertAfter,
  int x,
  int y,
  int cx,
  int cy,
  UINT nFlags
 );

  ・pWndInsertAfterはCWnd へのポインタを指定
  ・xはウィンドウの新しい左辺の位置
  ・yはウィンドウの新しい上辺の位置
  ・cxはウィンドウの新しい幅
  ・cyはウィンドウの新しい高さ
  ・戻り値は正常終了した場合は 0 以外を返します



サンプルは前回のコードの続きからです.




≪ MFC ダイヤログベースでの作成サンプル ≫



 ■新規ダイヤログを作成しエディットボックスを追加する

      

      サンプルではダイアログのIDはIDD_DIALOG1とします
      スタイル → チャイルド
      境界線 → しない
      可視 → チェック





 ■作成したダイヤログのクラスを作成

      

      ClassWizardを呼び出し新規クラスを作成
      サンプルではクラス名をDlgClass01とします
      基本クラス → CDialog
      ダイアログID → IDD_DIALOG1





 ■ClassViewからメインダイヤログにメンバ変数を作成

      

      サンプルではクラス名をDlgClass01としています
      変数タイプ → DlgClass01
      変数名 → m_TabDlg01





 ■OnInitDialog()関数にソース追加
////////////////////////////////////
// CTest10Dlg メッセージ ハンドラ

BOOL CTest10Dlg::OnInitDialog()
{
CDialog::OnInitDialog();

// "バージョン情報..." メニュー項目をシステム メニューへ追加します。

// IDM_ABOUTBOX はコマンド メニューの範囲でなければなりません。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty()){
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// このダイアログ用のアイコンを設定します。フレームワークはアプリケーションのメイン
// ウィンドウがダイアログでない時は自動的に設定しません。
SetIcon(m_hIcon, TRUE); // 大きいアイコンを設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンを設定

// TODO: 特別な初期化を行う時はこの場所に追加してください。

//--------タブコントロール初期化コード(ここから)----------

//TC_ITEM構造体のTCIF_TEXTを作成
TC_ITEM tab01;

//pszTextを使用するのでTCIF_TEXTを設定
tab01.mask = TCIF_TEXT;

//タブに表示される文字列の設定
tab01.pszText = "タブ1";

//タブ番号と、TC_ITEM構造体のTCIF_TEXTをInsertItemの引数に設定
m_tab_cnt.InsertItem(0,&tab01);


//同じように2つ目のタブを作成
TC_ITEM tab02;
tab02.mask = TCIF_TEXT;
tab02.pszText = "タブ2";
m_tab_cnt.InsertItem(1,&tab02);

//★追加
m_TabDlg01.Create(IDD_DIALOG1, &m_tab_cnt);
m_TabDlg01.SetWindowPos(&wndTop, 10, 30, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);


//--------タブコントロール初期化コード(ここまで)----------

return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。
}





 ■ClassWizardよりメッセージ「TCN_SELCHANGING」「TCN_SELCHANG」を追加

      

      TCN_SELCHANGINGはタブが変更になる前に送られるメッセージ
      TCN_SELCHANはタブが変更になった後送られるメッセージ
      オブジェクトID → IDC_TAB1
      メッセージ → TCN_SELCHANGING
      メッセージ → TCN_SELCHANG






 ■追加した、「TCN_SELCHANGING」「TCN_SELCHANG」にコードを追加

TCN_SELCHANGING
void CTest10Dlg::OnSelchangingTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください

//GetCurSelからタブのID番号を取得
int Tab_num = m_tab_cnt.GetCurSel();

//タブIDをチェックし、0番目なら更新
if(Tab_num == 0){
m_TabDlg01.ShowWindow(SW_HIDE);
}

*pResult = 0;
}


TCN_SELCHANG
void CTest10Dlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください

//GetCurSelからタブのID番号を取得
int Tab_num = m_tab_cnt.GetCurSel();

//タブIDをチェックし、0なら表示
if(Tab_num == 0){
m_TabDlg01.SetWindowPos(&wndTop, 10, 10, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);
}

*pResult = 0;
}





 ■以上コンパイルすれば完成