VC2005 MFC MDIアプリケーションを開発しています。
プロパティシートがチャイルドウィンドウのアプリケーションなのですが、
追加するプロパティページの名前をファイルから読み取ってユーザーが自由に変えられる
ようにしたいと思っています。
通常のタブ名はViewクラスのCreate()の中で以下の記述で変えられました。
//プロパティシートからタブコントロールを取る
CTabCtrl* pTab = sheet->GetTabControl();
TCITEM tabCtrlItem = {TCIF_TEXT};
tabCtrlItem.pszText= NewName;
tabCtrlItem.cchTextMax = _tcsclen(tabCtrlItem.pszText);
pTab->SetItem(0, &tabCtrlItem);
しかし、プロパティシート1のタブの1つにDoModalにて別のプロパティシートを呼び出
しているものがあります。
その呼び出されるシートのOnInitDialogで同処理を行うと、GetTabControl()にてNULLが
返ってきてしまいます。
何が原因でしょうか?
いまいち理解に苦しみます(^^;)
もう少し分かりやすくお願いいたします。
簡単に言いますとMDIでプロパティシートベースのアプリケーションを作っています。
MDIで自動生成されるシートをAとします。
それとは別にダイアログにてポップアップ表示されるプロパティシートBがあります。
プロパティシートAはChildFrameなのでCreate内で上記コードを記述すればタブ名を変更
することができます。
プロパティシートBも同様にOnInitDialog内で上記コードを記載してみると、
GetTabControl()でNULLが返ってきて変更する事ができません。
DoModalにて呼び出しているプロパティシートBの方のタブ名が変えられずに困っている
状況です。
よろしくお願い致します。
やはり、分かりづらい(^^;)
こんな感じかな?
--------------------------------------------------------------------------
MFCアプリケーションウィザードにて、MDIのアプリケーションを作成しています。
MDIのチャイルドフレームにはプロパティシートが貼りついており、
プロパティシートのタブ名の変更はViewクラスのCreate()に以下のような記述を
することでできました。
~ (ソースコード略)
しかし、モーダルダイアログにプロパティシートが貼りつけた上で、
OnInitDialog()に同様の記述を行っても、プロパティシートのタブ名の変更がで
きませんでした。
調査してみると、GetTabControl()がNULLを返していました。
--------------------------------------------------------------------------
そうですね、伝わっていると思います。
いやぁ、良かったです。
プロパティシートはCPropertySheetというクラスですので、
モーダルダイアログに貼り付いているという表現は誤解を生みそうです。
CPropertySheetをDoModalで呼び出した時にタブ名の変更ができないのです。
何かご存知でしたらお願いします。
何が原因なのか検討が付かない状態でして。
どーも、PATIOです。
お名前が似ているので同じ人なんじゃないかと思いますが、
違いますか?
違うのであれば、以下は蛇足になりますので無視してください。
複数の掲示板に登録してしまうと全ての掲示板に対してフォローが必要になります。
また、どこかの掲示板で得られた情報は他の掲示板にも展開する必要が出てきます。
それを承知の上で展開まで面倒が見られるのであれば良いのですが、
そこまでする気が無いのであれば、同時に複数の掲示板で同じ内容を質問しない方が
良いです。印象が悪くなりますし、掲示板によってはマルチポストはご遠慮くださいと
明示してあるケースもありますから。
ちなみにらららさんの掲示板は「使用上の注意」に書いてある通りです。
返事が遅くなりました。
こちらで試してみましたが、ちゃんとタブ名は変わりましたよ。
CPropertySheetの派生クラスを作成し、その派生クラスにてOnInitDialog()を
実装したところ、うまくいきました。
FLさんも最低限のテストプログラムでまず、試してみることをおすすめします。
それで、うまくいったら徐々に肉付けしていく。
うまく動かなくなった瞬間にやったことが動かない原因です。
それから、マルチポストに関する私見ですが...
マルチポスト = ペケ
ではないと考えています。
最初に質問したところで、しばらく返事を待って、返事がなければ、
「別の場所で質問しましたが、なかなかRESがつきませんので...」
とかいうくだりを含めて質問すれば良いかと思います。
その後、どちらかでRESがついたら、両方ともに経過報告を忘れずに。
実際、私自身、そうやってマルチポストしたことがありますが、
なんらクレームはつかなかったです。
見た範囲では…OKWaveから流れてきているようで。
ソースがどう書かれているのかよく分からないので、検証していないです。
# もっとも、MFCはよく分からないのですが。
ちなみに、SDKでプロパティシートを使うとページに割り当てられたダイアログは
タブをクリックして切り替えるまでWM_INITDIALOGすら飛んでこなかったり。
# シートの最初のページは表示前に来ますが。
# spy++で見てもページ切り替えるまではウィンドウハンドルが無い。
そういわれてみれば、WM_INITDIALOG はプロパティシート自身とタブ内のダイアログ両
方に飛んできますね。
FLさんのはタブ内のダイアログの方っぽいですね。
私のはプロパティシート自身の方なので、話が違うかも(^^;)
FLさんはモーダルダイアログで考えています。
モードレスダイアログで考えなければいけないのでは?
試してないので詳細は分かりませんが.........
ダイアログ+プロバティーシートってのもあまり考えたことないですね。
bunさんのやってきたようなのものは、元よりマルチポストといわれないね。
マルチスレッドみたいに「同時に進行」してることが嫌われる理由の一つだから
まぁ、移動する際には、先に質問したほうをきちんと閉めてから
移動するほうが、よりよいとは思いますが・・・
マルチポストに関する部分に関してはあまり書くと嫌がられそうですが、
ちゃんと後のケアが出来るのであれば、そこまで悪い印象は無いと思います。
問題はケアを怠ったり、するつもりが無かったりする事かと。
ケアが出来るのであれば、そこまで言われないでしょう。
まあ、せめて片方を閉じるなりしてから他に書き込むのが筋かなとは
思います。その点では私もryoさんと同意見です。
後は、それぞれの掲示板のルールに則っていれば問題ないかと思います。
結局、マナーなんですよね。
形(マルチポスト)でなく、心(読んでくれる人に気遣う)が
あるかどうか。
マナーが悪い人がいるから、だんだん形まで縛りになって
しまう。さみしいことです。
私自身も気をつけたいと思います。
>bun さん
bunさんが何の問題もなく出来たという事でしたので、#if 0で消していた部分を復活させ
てもう一度やってみるとNULLが返らずに変更する事ができました。
その部分を消して、他の作業を他にやっていたのですが、タブ関係に関わる事は一切して
いないはずなのに不思議でなりません。
原因が分からないのが気持ち悪いですが、bunさんのおかげで再度チャレンジして変更す
る事ができました。
ありがとうございました!
>マルチポストについて
bunさんがフォローしてくれたように、こちらで中々レスが付かなかったので、他でも質
問させて頂きました。
確かに締めれば良かったという意見もあるでしょうが、もしかしたらbunさんからレスが
頂けるかな?と思ってこちらはしばらく待つ事にしました。
私の思うマルチポストは同時に沢山の掲示板に同じ内容を投げることです。
ですが、こちらでレスが付かなかった為にという経緯があったことをご理解下さい。
たしかに、あちらで最初に一筆書いた方が良かったですね。
分かり難いと指摘を受けていましたので、内容を簡潔に書く事で頭が一杯で忘れてしまい
ました。
この点については注意不足でした。
OKWaveについては私とは関係ありません。
そこを参考に行ったが同じ症状で出来なかったので、こちらで質問しました。
ほとんど抜粋しているのですが、私とは別人の方です。