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;
CPropertySheet::GetPage() で各ページが得られます。
// 先頭ページをサイズ変更
GetPage(0)->SetWindowPos(NULL,0,0,100,100,SWP_NOMOVE|SWP_NOZORDER);
dairygoods 様。
やってみました。
SetWindowPosで指定された位置・サイズでダイアログと同じ色の四角に塗り潰されたようになってしまい、子ウィンドウのサイズは変わらないのですが、何故でしょうか?
m_pSheet->GetPage(0)->SetWindowPos (&CWnd::wndBottom, 0, 0,
cR.Width()-50, cR.Width()-80, SWP_NOMOVE | SWP_NOZORDER);
を追加しました。
SetWindowPos でサイズが変わるのは直接の子だけです。
(プロパティシートの子であるプロパティページは単なる灰色の四角です)
孫まで変えるには同じ処理を繰り返す必要があります。
つまり、各ページクラスにも OnSize() を追加し、
子供たちを適切に移動させる必要があります。
また、Spy++でウィンドウ階層を見てみると分かりますが、
プロパティシートの子は、
・タブ
・OK、キャンセル等のボタン
・ページ
がありますから、これらを皆移動しなければなりません。
すみません。Spy++というものがわかりません。
コントロールは何も配置していませんが、タブ・ページはどうやって移動させれば良いのでしょうか?
> すみません。Spy++というものがわかりません。
環境(使っているツール)が書いてないので詳しくは分かりませんが、
IDEのメニューかスタートメニューの中を探すとあると思います。
ウィンドウの階層構造を見るものです。
タブもページもボタンもみんなウィンドウですから、移動方法は同じです。
void タブシート::OnSize(...) {
// ページ(タブの中身)を移動
...
// タブを移動
GetDlgItem(AFX_IDC_TAB_CONTROL)->SetWindowPos(...);
// OKボタンを移動
GetDlgItem(IDOK)->SetWindowPos(...);
// 適用ボタンを移動
GetDlgItem(ID_APPLY_NOW)->SetWindowPos(...);
...
}
void タブページ::OnSize(...) {
// ページ内のボタンやエディットやラベルをみんな移動
...
}
細かいご指導ありがとうございました。
ツイート | ![]() |