子ウィンドウのサイズを変更するには?

解決


zzz  2005-12-27 19:56:34  No: 60095

C++でのプログラミングについて質問です。
高校新卒で未熟な為わかりにくいとは思いますがよろしくお願いします。

CPropertySheetで作成した親ウィンドウにCPropertyPageで作成した子ウィンドウをタブ形式で配置しました。
(同じものをあと3ページ配置する予定)
ユーザ側で親ウィンドウのサイズを変更した際、OnSizeでそれに伴って子ウィンドウのサイズも変更するようなプログラムを作りたいのですが、可能でしょうか?

参考までに、現在のプログラムです↓

{{{{{{{{プログラム}}}}}}}}
// シートにページを挿入
    m_pSheet = new CSfxEstSpecSheet;
    m_pPage1 = new CSfxEstSpecPage1;

    m_pSheet->AddPage(m_pPage1);

    if (!m_pSheet->Create(this,  DS_CONTEXTHELP | DS_SETFONT | WS_CHILD | WS_VISIBLE)) {
        DestroyWindow();
}

// コントロールの移動
void CSfxEstSpecDlg::OnSize(UINT nType, int cx, int cy)
{
    CRect  cR;

    GetClientRect(&cR);  // ビューサイズの取得
  
    if (cR.bottom == 0 || cR.right == 0)  return;  // ウィンドウが生成できていない

    if (GetDlgItem(IDC_BUTTON1) == NULL)     return;  // コントロールが生成できていない

    // コントロールの移動
    GetDlgItem(IDC_BUTTON1)->SetWindowPos (&CWnd::wndBottom,
  cR.Width100, cR.Height()-40, 80, 25, SWP_NOZORDER);

    //  ここで子ウィンドウをサイズ変更したい

}

{{{{{{{{ヘッダー}}}}}}}}
public:
    afx_msg void OnSize(UINT nType, int cx, int cy);
protected:
    CPropertySheet* m_pSheet;
    CPropertyPage* m_pPage1;


dairygoods  2005-12-27 20:34:51  No: 60096

CPropertySheet::GetPage() で各ページが得られます。

// 先頭ページをサイズ変更
GetPage(0)->SetWindowPos(NULL,0,0,100,100,SWP_NOMOVE|SWP_NOZORDER);


zzz  2005-12-27 20:57:58  No: 60097

dairygoods 様。

やってみました。
SetWindowPosで指定された位置・サイズでダイアログと同じ色の四角に塗り潰されたようになってしまい、子ウィンドウのサイズは変わらないのですが、何故でしょうか?

m_pSheet->GetPage(0)->SetWindowPos (&CWnd::wndBottom, 0, 0, 
    cR.Width()-50, cR.Width()-80, SWP_NOMOVE | SWP_NOZORDER);

を追加しました。


dairygoods  2005-12-27 23:04:14  No: 60098

SetWindowPos でサイズが変わるのは直接の子だけです。
(プロパティシートの子であるプロパティページは単なる灰色の四角です)
孫まで変えるには同じ処理を繰り返す必要があります。

つまり、各ページクラスにも OnSize() を追加し、
子供たちを適切に移動させる必要があります。

また、Spy++でウィンドウ階層を見てみると分かりますが、
プロパティシートの子は、
・タブ
・OK、キャンセル等のボタン
・ページ
がありますから、これらを皆移動しなければなりません。


zzz  2005-12-27 23:58:50  No: 60099

すみません。Spy++というものがわかりません。
コントロールは何も配置していませんが、タブ・ページはどうやって移動させれば良いのでしょうか?


dairygoods  2005-12-28 01:21:05  No: 60100

> すみません。Spy++というものがわかりません。

環境(使っているツール)が書いてないので詳しくは分かりませんが、
IDEのメニューかスタートメニューの中を探すとあると思います。
ウィンドウの階層構造を見るものです。

タブもページもボタンもみんなウィンドウですから、移動方法は同じです。

void タブシート::OnSize(...) {
  // ページ(タブの中身)を移動
  ...
  // タブを移動
  GetDlgItem(AFX_IDC_TAB_CONTROL)->SetWindowPos(...);
  // OKボタンを移動
  GetDlgItem(IDOK)->SetWindowPos(...);
  // 適用ボタンを移動
  GetDlgItem(ID_APPLY_NOW)->SetWindowPos(...);
  ...
}

void タブページ::OnSize(...) {
  // ページ内のボタンやエディットやラベルをみんな移動
  ...
}


zzz  2006-01-06 19:07:52  No: 60101

細かいご指導ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加