プロが教えるわが家の防犯対策術!

VC2005 MFC にてMDIアプリケーションを開発しています。

プロパティシートがメインとなるアプリケーションなのですが、追加するプロパティページの名前をファイルから読み取ってユーザーが自由に変えられるようにしたいと思っています。

標準ですと、プロパティシートにAddPage()にてプロパティページを追加するとシートのタブ部分にはプロパティページのキャプションが使われるようです。

キャプションを一切無視してファイルから取得した文字列をタブ部分に表示したいのですが、やり方がわかりません。

SetWindowText()をプロパティページの中で使ってもアプリケーションエラーが起こったり、全く変化がなかったりです。
CPropertySheet::SetTitle() はプロパティページ自信の名前を変えるものでしょうか。どうも違うようです。

GetMessageString()のような関数でオーバーライドできるかと探したのですが、ないようでした。

どなたかお知恵を拝借させてください。

A 回答 (4件)

 こんばんは。

御礼頂きました。

 モーダルプロパティーシートの方ですか。確かにタイミングが合わないですねえ・・・。
 CPropertyPageの派生クラスを作成して、OnInitDialog()をオーバーライドした所、GetTabControl()に間に合いました。
 因みにオーバーライドするのは、「Bのプロパティページ」(モーダルで開いている方)です。

/////////////////////////////////////////////////////////////////////////////
// CMyPage メッセージ ハンドラ

BOOL CMyPage::OnInitDialog()
{
BOOL bResult = CPropertyPage::OnInitDialog();

// TODO: この位置に固有のコードを追加してください

//親がプロパティーシート
CPropertySheet* pSheet = static_cast<CPropertySheet*>(this->GetParent());

//タブコントロールを取る
CTabCtrl* pTab= pSheet->GetTabControl();

//前回通り
TCITEM tabCtrlItem= {TCIF_TEXT};
tabCtrlItem.pszText= _TEXT("新しい名前");
tabCtrlItem.cchTextMax = ::_tcsclen(tabCtrlItem.pszText);

pTab->SetItem(pSheet->GetActiveIndex()/*チョッとココが怪しいかも*/, &tabCtrlItem);

return bResult;
}
    • good
    • 0
この回答へのお礼

試して頂いたようで、誠にありがとうございます。

教えて頂いた方法を試したところ、やはりGetTabControl()でNULLが返ってきます。

BのプロパティページのOnInitDialog()で記述でいいんですよね?

その場合お礼欄で書きました
3.プロパティシートBのOnInitDialogで行うとアプリケーションエラーにはなりませんが、GetTabControl()にてNULLが返ってきてしまいます。

と全く同じですので、同じ結果になってしまいます。

成功されたようですので、恐らく私の記述の場所が悪いのだと思います。

お礼日時:2009/03/11 11:49

MFC使っていないのでわかりませんが…



>プロパティページのキャプションの変更の仕方が分かりません。

CPropertySheet::AddPage()に引き渡すCPropertyPageオブジェクトkm_pspでPROPSHEETPAGE構造体が取得できます。

dwFlagsにPSP_USETITLEフラグを付与して、pszTitleに文字列のアドレスをセット。
その後でAddPage()すればよいのではないでしょうか?
# 各プロパティページのpszTitleの有効期間には注意が必要かも知れませんが。

Win32SDKとMFCのソースコード調べながら確認した方がいいかもしれません。
MFC内部でなんかやっていたりすることありますし。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

メンバ変数で持っていたのですね。
設定しましたが、おっしゃる通り有効期限か何かの問題で変更する事ができませんでした。
これで変更できれば簡単だったのですが。。。

お礼日時:2009/03/10 19:03

 こんばんは。



 タブの部分はタブコントロールなので、SetWindowText()等で操作するのではなく、タブコントロール特有の操作が必要なのではないでしょうか。
 以下参考程度で。

//取り敢えず、シートと1ページ開く
CPropertySheet* sheet = new CPropertySheet("プロパティテスト", this);
CPropertyPage* page = new CPropertyPage(IDD_TESTPAGE);
sheet->AddPage(page);
sheet->Create();
sheet->ShowWindow(SW_SHOW);

//http://msdn.microsoft.com/ja-jp/library/dftahdhz …
//プロパティシートからタブコントロールを取る
CTabCtrl* pTab = sheet->GetTabControl();

//http://msdn.microsoft.com/ja-jp/library/bb760554 …
//タブコントロールに情報を設定する為の構造体を初期化
TCITEM tabCtrlItem = {TCIF_TEXT};
tabCtrlItem.pszText= _TEXT("新しい名前");
tabCtrlItem.cchTextMax = ::_tcsclen(tabCtrlItem.pszText);

//http://msdn.microsoft.com/ja-jp/library/a68yats3 …
//タブコントロールに設定する
pTab->SetItem(0/*タブページの番号を入れる*/, &tabCtrlItem);
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

教えて頂いた方法で変更する事ができました!

しかし、
メインのプロパティシートAの中のプロパティページA-1から
更にプロパティシートBをDoModalで呼んでいます。

このBの中のプロパティページB-1などのタブ名称も変えたいのですが、同じ方法で行えませんでした。

具体的には
1.プロパティページA-1にてプロパティページBを宣言した後にDoModal前に同じ処理をするとGetTabControl()でアプリケーションエラー
2.プロパティシートBのコンストラクタでAddPage()の後に行っても1と同じ結果
3.プロパティシートBのOnInitDialogで行うとアプリケーションエラーにはなりませんが、GetTabControl()にてNULLが返ってきてしまいます。

他にも色々と試したのですが、理屈上メインのシートと同じ処理をポップアップのシートでも行っているのになぜできないのかが分かりません。

お礼日時:2009/03/10 19:01

>AddPage()にてプロパティページを追加するとシートのタブ部分にはプロパティページのキャプションが使われるようです。



だったら、プロパティページのキャプションをファイルから取得した文字列に書き換えてからAddPageすれば良いのでは?

やった事ないから出来るかどうか判らないけど。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。

プロパティページのキャプションの変更の仕方が分かりません。
上述しているように、プロパティページでSetWindowText()を行っても場所によってアプリエラーや何も変化がなかったりするのです。

お礼日時:2009/03/09 16:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!