
VC2005 MFC にてMDIアプリケーションを開発しています。
プロパティシートがメインとなるアプリケーションなのですが、追加するプロパティページの名前をファイルから読み取ってユーザーが自由に変えられるようにしたいと思っています。
標準ですと、プロパティシートにAddPage()にてプロパティページを追加するとシートのタブ部分にはプロパティページのキャプションが使われるようです。
キャプションを一切無視してファイルから取得した文字列をタブ部分に表示したいのですが、やり方がわかりません。
SetWindowText()をプロパティページの中で使ってもアプリケーションエラーが起こったり、全く変化がなかったりです。
CPropertySheet::SetTitle() はプロパティページ自信の名前を変えるものでしょうか。どうも違うようです。
GetMessageString()のような関数でオーバーライドできるかと探したのですが、ないようでした。
どなたかお知恵を拝借させてください。
No.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;
}
試して頂いたようで、誠にありがとうございます。
教えて頂いた方法を試したところ、やはりGetTabControl()でNULLが返ってきます。
BのプロパティページのOnInitDialog()で記述でいいんですよね?
その場合お礼欄で書きました
3.プロパティシートBのOnInitDialogで行うとアプリケーションエラーにはなりませんが、GetTabControl()にてNULLが返ってきてしまいます。
と全く同じですので、同じ結果になってしまいます。
成功されたようですので、恐らく私の記述の場所が悪いのだと思います。
No.3
- 回答日時:
MFC使っていないのでわかりませんが…
>プロパティページのキャプションの変更の仕方が分かりません。
CPropertySheet::AddPage()に引き渡すCPropertyPageオブジェクトkm_pspでPROPSHEETPAGE構造体が取得できます。
dwFlagsにPSP_USETITLEフラグを付与して、pszTitleに文字列のアドレスをセット。
その後でAddPage()すればよいのではないでしょうか?
# 各プロパティページのpszTitleの有効期間には注意が必要かも知れませんが。
Win32SDKとMFCのソースコード調べながら確認した方がいいかもしれません。
MFC内部でなんかやっていたりすることありますし。
ご回答ありがとうございます。
メンバ変数で持っていたのですね。
設定しましたが、おっしゃる通り有効期限か何かの問題で変更する事ができませんでした。
これで変更できれば簡単だったのですが。。。
No.2
- 回答日時:
こんばんは。
タブの部分はタブコントロールなので、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);
ご回答ありがとうございます。
教えて頂いた方法で変更する事ができました!
しかし、
メインのプロパティシートAの中のプロパティページA-1から
更にプロパティシートBをDoModalで呼んでいます。
このBの中のプロパティページB-1などのタブ名称も変えたいのですが、同じ方法で行えませんでした。
具体的には
1.プロパティページA-1にてプロパティページBを宣言した後にDoModal前に同じ処理をするとGetTabControl()でアプリケーションエラー
2.プロパティシートBのコンストラクタでAddPage()の後に行っても1と同じ結果
3.プロパティシートBのOnInitDialogで行うとアプリケーションエラーにはなりませんが、GetTabControl()にてNULLが返ってきてしまいます。
他にも色々と試したのですが、理屈上メインのシートと同じ処理をポップアップのシートでも行っているのになぜできないのかが分かりません。
No.1
- 回答日時:
>AddPage()にてプロパティページを追加するとシートのタブ部分にはプロパティページのキャプションが使われるようです。
だったら、プロパティページのキャプションをファイルから取得した文字列に書き換えてからAddPageすれば良いのでは?
やった事ないから出来るかどうか判らないけど。
アドバイスありがとうございます。
プロパティページのキャプションの変更の仕方が分かりません。
上述しているように、プロパティページでSetWindowText()を行っても場所によってアプリエラーや何も変化がなかったりするのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) EXCELでバーコードを作成すると白くなってコードが見えません 1 2022/04/04 14:24
- USBメモリー・SDカード・フラッシュメモリー プリンタのドライバーをUSB Flash Diskに保存したい。 4 2023/05/23 23:30
- ネットワーク 家庭内LANの2台のPC間で「ネットワーク資格情報の入力」で引っかかってフォルダが共有できない 1 2022/12/11 23:37
- Access(アクセス) capeofdragonと申します。 Access2016を使っております。 あるフォームがあり、テ 2 2022/09/09 13:18
- Excel(エクセル) エクセルのフッタやヘッダーについて 3 2023/02/04 09:45
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- その他(Microsoft Office) フォルダーのプロパティで表示されるファイル数とフォルダーに実際に存在するファイル数が一致しない 2 2022/07/27 13:16
- Excel(エクセル) エクセル バーコード作成で他のシートを参照するには? 2 2023/05/03 16:57
- その他(Microsoft Office) こんにちは。Windows10でaccess(拡張子accdb)を右クリックし、プロパティ→全般タブ 1 2023/02/03 19:14
- Visual Basic(VBA) Sheet1のA列にコードB列にメアド、Sheet2のB列にコード一覧とD列にメアド一覧があり、Sh 3 2022/10/19 11:57
このQ&Aを見た人はこんなQ&Aも見ています
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
MFCでハンドルを取得するには
C言語・C++・C#
-
-
4
MFC ポップアップメニューのチェック表示について
C言語・C++・C#
-
5
リストビューで選択行の背景を変える
C言語・C++・C#
-
6
エディットボックスの入力制限について
C言語・C++・C#
-
7
MFCでコンボボックスを選択不可状態にしたい
C言語・C++・C#
-
8
C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
C言語・C++・C#
-
9
MFCでbitmapを背景にしてstaticテキストを透過させる方法
C言語・C++・C#
-
10
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
11
CString から LPCTSTRの型に変換
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
表示する方法
-
再インストールの仕方。アクセ...
-
hScrollBarのバックカラーを変...
-
Winodws GUI アプリを
-
スピンボタンを右クリックして...
-
VC++6.0について
-
フォームでPDFを表示させた...
-
コードでスクロールバーを操作...
-
エクセル2003オプションの...
-
ウィンドウとコントロールのサ...
-
コンビ エアロバイク 75XLI...
-
Exploit-ByteVerifyに感染して...
-
EXCEL2000 リストボックスの返...
-
Windowsアプリケーションのコー...
-
EXCEL-VBA ユーザーフォームに...
-
チェックボックスフォームフィ...
-
VC + + 2013
-
エクセルのチェックボックスに...
-
VB6のPrintオブジェクトで学生...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
スピンボタンを右クリックして...
-
DateTimePickerでに年月までし...
-
ActiveXコントロールを.NETにイ...
-
フォームでPDFを表示させた...
-
コモンダイアログコントロール...
-
連続で印刷すると画像が更新さ...
-
VScrollBarの点滅を何とかしたい。
-
エクセル - リストボックスのマ...
-
CEdit の内容が変わった時にメ...
-
空のリストビューで1行おきに...
-
リストコントロール(MFC or API...
-
TabControlとToolBarの背景色変更
-
タブコントロール上のリストコ...
-
アイテムを点滅させる
-
EXCELVBA リストボックスで選択...
-
regsvr32でActiveX登録を行ったocx
-
Accessのタブコントロールを2...
-
VB6.0のデザイン時 コントロー...
おすすめ情報