CPropertySheetで[ヘルプ]や[適用]をなくす方法


CPropertySheetには標準で、[OK][キャンセル][適用][ヘルプ]
と言ったボタンがついてきます。
しかし、これらを消したい場合があると思います。
まぁ[OK][キャンセル]を消したい人は居ないと思いますので、
[適用][ヘルプ]
に限ってみましょう。

力ずくでこれらを消すには、CPropertySheetから派生した任意のクラスを作って、
そのクラスにOnInitDialog()をオーバーライドして、
その中で、IDOKとか、IDHELPとかのコントロールを取得して、
削除してしまえば消すことは可能です。
class CMyPSheet:public CPropertySheet
{
public:
 CMyPSheet();
 ~CMyPSheet();
 virtual BOOL OnInitDialog();
};
BOOL CMyPSheet::OnInitDialog()
{
 CPropertySheet::OnInitDialog();
 CWnd *p=GetDlgItem(IDHELP);
 p->EnableWindow(FALSE);
 return TRUE;
}

でも、これは、あんまりスマートではありません。
というか、この方法で強引にボタンを消すと、
なんか、[OK]や[キャンセル]の位置がとても間抜けになります。

そこで、MSDNを見てみると、
CPropertySheet::m_pshを操作すれば、
任意のプロパティーシートが作れるようです。
CPropertySheet::m_pshは、
PROPSHEETHEADER構造体で、
特に、CPropertySheet::m_psh::dwFlags
がプロパティーシートの状態を定義するためのものです。

そこで、
CPropertySheet PSheet;
PSheet.m_psh.dwFlags|=(PSH_NOAPPLYNOW);
//何らかの処理
PSheet.DoModal();

としてみると、はい、[適用]が消えました。

同様に、
CPropertySheet PSheet;
PSheet.m_psh.dwFlags&=~(PSH_HASHELP);
//何らかの処理
PSheet.DoModal();

で、[ヘルプ]が消えます。

がっ、[ヘルプ]に関しては、
MSDNには、上記コードで消えるとかいてあるのに、
消えない場合があります。

特に、アプリケーションウイザードで作っていると遭遇する現象です。
じつは、アプリケーションクラスでID_HELPの応答をしていると、
この現象が発生します。
なので、
BEGIN_MESSAGE_MAP(C****App, CWinApp)
//何かしらの記述
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

という行を見つけたら
BEGIN_MESSAGE_MAP(C****App, CWinApp)
//何かしらの記述
// ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

としてやりましょう。

これで、[ヘルプ]も消えたはずです。

余談ですが、
PSH_HASHELP
等の値は、
#define PSH_HASHELP 0xXXXXXXXX
というように、定義されているようです。
なので、使う際には、
(PSH_HASHELP)
というように、括弧を付けたほうが無難です。