プロパティシートを使ったPSH_WIZARD97スタイルのWizardが正しく表示されない

解決


ココ  2009-03-02 21:39:34  No: 69772  IP: [192.*.*.*]

お世話になります。
VC2005+MFC8.0 WinXPで開発をしております。
CPropertySheetとCPropertyPageクラスを使用し、
Wizard 97スタイルのウィザードを出そうとしていますが、
ヘッダー部分が白くなるはずが、灰色になってしまいます。
プロパティシート1クラス、プロパティページ1クラスの
構成です。

詳細は、以下のようになります。
[ダイアログリソース(プロパティページ用)]
Style:子
System Menu:False
Caption:タイトル

[コード]
<プロパティページ>
CWizPage1::CWizPage1() : CPropertyPage(CWizPage1::IDD) // IDD=ダイアログのリソースID
{
  m_psp.dwFlags |= PSP_DEFAULT | PSP_USEHEADERTITLE;
  m_psp.pszHeaderTitle = _T("Title");
}

<プロパティシート>
CWizard1::CWizard1(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) : CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
  SetWizardMode();

  AddPage(&m_Page1);    // Page1はこのクラスのメンバです

  m_psh.dwFlags   |= PSH_WIZARD97 | PSH_HEADER;
  m_psh.hInstance  = AfxGetInstanceHandle();
}

<使用箇所(CXXXApp::InitInstance)>
CWizard1 wizard(_T("Wizard1"), m_pMainWnd, 0);
wizard.DoModal();

以上、どなたかご教授頂けないでしょうか。
--

編集 削除
ココ  2009-03-02 21:42:46  No: 69773  IP: [192.*.*.*]

(つづき)
ちなみに、stdafx.h内の_WIN32_IE は 0x0500(IE5以上)に定義
してあります。

宜しくお願いいたします。
--

編集 削除
ココ  2009-03-04 11:19:06  No: 69774  IP: [192.*.*.*]

自己レスです。
調査と試行錯誤の上、以下のコードにたどりつきました。

[ダイアログリソース(プロパティページ用)]
Style:子
System Menu:False
Caption:なし
Title Bar:False(ページ毎にウインドウタイトルを変えたい場合はTrue、Captionを入力)

[コード]
<プロパティページ>
CWizPage1::CWizPage1() : CPropertyPage(CWizPage1::IDD) // IDD=ダイアログのリソースID
{
  m_psp.dwFlags       |= PSP_USEHEADERTITLE /*| PSP_HIDEHEADER*/;
  m_psp.pszHeaderTitle = _T("Header Title");
}

<プロパティシート>
CWizard1::CWizard1(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) : CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
  SetWizardMode();

  AddPage(&m_Page1);  // Page1はこのクラスのCWizPage1型のメンバです

  m_psh.dwFlags        |= PSH_WIZARD97 | PSH_HEADER /*| PSH_WATERMARK*/;
//  m_psh.pszbmWatermark  = MAKEINTRESOURCE(IDB_WIZARD_WATERMARK);
  m_psh.pszbmHeader     = MAKEINTRESOURCE(IDB_WIZARD_HEADER_ICON);
  m_psh.hInstance       = AfxGetInstanceHandle();

  m_strTitle = BtxLoadString(IDS_MSG_WIZARD_TITLE);  // OnInitDialog中でSetWindowTextする
}

今回の間違いは、PSP_USEHEADERTITLEでヘッダー表示の指定を指定をした際に、
一緒にアイコンリソースを指定していなかったことでした。ヘッダーと透かしをフル
セットで指定し、ヘッダーを隠したいときはPSP_HIDEHEADRを指定するとよいようです。

以下に、他にわかったことをコメントします。

・上のコード中のコメントをはずせば、左端に縦長のペインが表示され、その背景
  (=Watermark:透かし)が、pszbmWatermarkで指定したビットマップで埋められます。
・今回はページ毎にウインドウタイトルを変えたくなかったので、ダイアログ
  のキャプションを非表示としました。(ダイアログのキャプションを表示すれば、
  それが各ページ毎にウインドウのキャプションに表示されます)。ところが、
  プロパティシート側ではキャプションを設定してもどうしても表示されず、やむを
  えずOnInitDialog中でSetWindowTextすることで対処しました。
・ヘッダー左端に表示される、pszbmHeaderで指定されるアイコンは、49x49ピクセル
  でした。

以上
--

編集 削除