> 同じ場所にボタンをクリエイトしてもなぜ場所が大きくずれるのか、全く分かりません。
単純に、この処理を行った段階(WM_INITDIALOG)では IDOK ボタンはまだ適切な位置に
配置されていなかった。という可能性は無いかな。
プロパティシートのメッセージに PSM_RECALCPAGESIZES てのがあるんだけど、恐らくこ
のメッセージが処理されないと IDOK ボタン等は適切な位置に配置されないと思われ。
> WS_CHILD
CWnd::Create() って↓な感じで実装されてるみたいだから、今回は運良く?大丈夫かも。
BOOL CWnd::Create(..., DWORD dwStyle, ...) {
return CreateEx(..., dwStyle | WS_CHILD, ...);
}
何とか解決しましたので、報告させて頂きます。
その前に、ご指摘頂いていたWS_CHILDについては、念のため付加させて頂きました。
BOOL CMySheet::OnInitDialog()
{
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
BOOL ret = CPropertySheet::OnInitDialog();
CRect rectOK, rectCANCEL, rectSEND;
GetDlgItem( IDOK )->ShowWindow( SW_HIDE );
GetDlgItem( IDCANCEL )->ShowWindow( SW_HIDE );
m_font= new CFont();
m_font->CreatePointFont(100,FONT_NAME);
// IDOKの場所を取得
GetDlgItem( IDOK )->GetWindowRect(rectOK);
ScreenToClient(rectOK);
// IDCANCELの場所を取得
GetDlgItem( IDCANCEL )->GetWindowRect(rectCANCEL);
ScreenToClient(rectCANCEL);
// 追加ボタンの場所を計算
int dx = rectCANCEL.left - rectOK.left;
rectSEND = rectOK;
rectSEND.left -= dx;
rectSEND.right -= dx;
m_Bsend = new CButton();
m_Bsend->Create(GET_STR(EV_TXT_MAIN_SET_BTN01), WS_VISIBLE | WS_TABSTOP |
WS_CHILD, rectSEND, this, IDC_BSEND );
m_Bsend->SetFont(m_font);
m_Bsave = new CButton();
m_Bsave->Create(GET_STR(EV_TXT_MAIN_SET_BTN02), WS_VISIBLE | WS_TABSTOP |
WS_CHILD, rectOK, this, IDC_BSAVE );
m_Bsave->SetFont(m_font);
m_Bclose = new CButton();
m_Bclose->Create(GET_STR(EV_TXT_MAIN_SET_BTN03), BS_DEFPUSHBUTTON | WS_VISIBLE
| WS_TABSTOP | WS_CHILD, rectCANCEL, this, IDC_BCLOSE );
m_Bclose->SetFont(m_font);
return ret;
}
このような形で3つのボタンの描画に成功しました。
一番の要因は最初に
CPropertySheet::OnInitDialog();
を呼ばなければいけなかった点です。
この中でサイズを決定しているのだと思います。
今までは最後に
return CPropertySheet::OnInitDialog();
となっていました。
この方法でしたらOSによる違いも受けませんでした。
皆さんのアドバイスを複合して解決する事ができました。
とても感謝しております。
誠にありがとうございました。