1 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 18:37:47 ] Microsoft Foundation Classライブラリ専用スレです。 前スレ ■MFC相談室 mfc18d.dll■ pc11.2ch.net/test/read.cgi/tech/1185917008/
653 名前:デフォルトの名無しさん [2008/11/24(月) 16:47:20 ] 質問です、ダイアログのタイトルとかを表示している部分の 高さなどを知る方法ってあるのでしょうか? ┌──────────────┐ │たいとる .│←この高さが知りたい ├──────────────┤
654 名前:デフォルトの名無しさん [2008/11/24(月) 16:52:38 ] >>653 ::GetSystemMetrics(SM_CYCAPTION); でいけると思うが、未確認。
655 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 17:25:35 ] 既存ソフトのバージョンアップ開発で、そういうの生値でやっててキレそうになったことあるわ 上にもあるようにGetSystemMetrics()でOK というか、GetSystemMetrics()からとれるやつは全部こっからとらないと、ちょっとしたWindowsのデザイン設定の違いでカオスになるからな
656 名前:名無し募集中。。。 mailto:sage [2008/11/24(月) 17:57:06 ] >>651 データにまつわる事ならDoc 見せ方(表示)にまつわる事ならView アプリ全体(データ全体)にまつわる事ならMainFrame
657 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 03:57:20 ] 本当にMainFrameなの?
658 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 09:02:09 ] 自分は、アプリケーション全体や、全てのドキュメントに共通の設定は、 CWinApp派生クラスのメンバに登録しているなぁ。 一応、データ本体は、 protectedで、設定をGet/Setするヘルパ関数を用意している。 あと、メッセージハンドラはともかく、ドキュメントの表示方法(例えば 色やスタイルなどの見せ方)に関する設定値は、ViewではなくDocクラスに 持たせているなぁ。 これらの一部をViewに持たせると、ファイルに保存する際にViewクラスに アクセスしなければならないし、Viewが生成されてドキュメントに関連 付けされる前に、ファイルから初期値を読み込む時等に実装に困る。 CListViewクラスのLVS_REPORT等、ウィンドウが存在する時は、実質的に Viewもウィンドウ属性という形でそうしたデータを持っているけど、最初 にCreate()する際に、どの初期値でスタイルを指定するという場合に困る。
659 名前:名無し募集中。。。 mailto:sage [2008/11/25(火) 13:46:17 ] ドキュメントに保存するパラメータなら見せ方や色にしてもDocが持つべきだろうけど たとえば表示倍率とかViewごとに変化する(保存する必要のない)データはViewが持って良いだろう アプリ全体(複数のデータ)は、Appが持つのも良いと思う。 でもCWnd派生のMainFrameだとSetTimerとかPostMessageが使えるから シーケンシャルな処理が入った時に便利なんで、MainFrameを使ってる でも>>651 の質問ってSDIだよな。1つのDocにViewが複数あるわけじゃないから神経質にならなくてもいいな
660 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 16:05:52 ] >>659 SDIはドキュメントが1つであって、ビューが1つではないですよ。 実際、エクスプローラスタイルで作成されたSDIはビューが2つあるし、 標準のスタイルでも任意にビューを増やせる。
661 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:06:39 ] Doc と View が 1:1 なら、分ける意味も薄いしな。
662 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:36:10 ] Viewが分割サポートする場合は1:1でもDocは必要だぜ
663 名前:名無し募集中。。。 mailto:sage [2008/11/25(火) 18:54:48 ] そっかSDIはDocが1つなだけでViewは1つとは限らないか
664 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:27:45 ] SDIの単純なエディタでも、CSplitterWndでViewを分割して、離れた場所の テキストを表示したりできるからね。
665 名前:デフォルトの名無しさん [2008/11/26(水) 17:34:11 ] C**Doc::Serializeを使っているのですが、ファイルの保存や開くときのファイル形式を する方法はありますか?
666 名前:デフォルトの名無しさん [2008/11/26(水) 17:35:42 ] 訂正>> C**Doc::Serializeを使っているのですが、ファイルの保存や開くときのファイル形式を 指定する方法はありますか?
667 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 17:52:53 ] 自分でSerializeを書けばいい
668 名前:名無し募集中。。。 mailto:sage [2008/11/26(水) 18:10:15 ] 拡張子という意味ならリソースのString Tableで"IDR_アプリ名TYPE"の定義で指定 \nで区切られた何番目がどんな意味かはヘルプ参照 "IDR_アプリ名TYPE"は、InitInstance()の中でnewするCMultiDocTemplate()の第1パラメータ
669 名前:デフォルトの名無しさん [2008/11/26(水) 18:32:50 ] 助かりました!!
670 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 23:18:28 ] Win7では2D描画はDirect2Dがメインになるって聞いたが、旧Windowsをサポートするなら結局GDIの方がいいのかな
671 名前:651 [2008/11/26(水) 23:35:46 ] 皆さんお返事ありがとうございます。651です。 SDIといってもCFormViewをベースに、複数のダイアログを切り替えて表示するような プログラムを作っています。データの所在がそれぞれのダイアログに散らばってしまうと 管理が面倒なので今はDocumentクラスにすべて実体を持たせ、メニューのハンドラも そこにおいています。 みなさんの説明を要約すると基本的なセオリーとしては、 ・GUI等の画面表示に関係するデータ、ハンドラ: View(ダイアログ)に持たせる ・ファイル入出力に関するデータ、ハンドラ: Docに持たせる ・アプリ全体に関する設定: CWinAppとかMainFrameに持たせる と言ったところでしょうか。 データの中にはコンストラクタでデータ設定したりオブジェクト生成したりしていて その順番が問題になる事もありますので、その辺も考慮して決めたいと思います。
672 名前:デフォルトの名無しさん [2008/11/27(木) 01:01:54 ] ボタンは、BM_SETSTATE で凹ませることができますが、 スピンコントロールの上ボタンや下ボタンを凹ませるには、 どのようなメッセージを送れば良いのでしょうか?
673 名前:名無し募集中。。。 mailto:sage [2008/11/27(木) 01:15:56 ] >>670 > Win7では2D描画はDirect2Dがメインになるって聞いたが VistaではGDI ハードウェアアクセラレーションが効かなかったが Windows7では有効になる d.hatena.ne.jp/NyaRuRu/20081126/p1
674 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 01:36:16 ] テクスチャサイズ8K×8Kって結構厳しいな。 家の7600GSじゃ4K×4Kが最大だから対応できないのか。
675 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 04:56:15 ] 今更MFCの勉強したいんですがどの本読めばいいですか? ずーっと昔に買ってそのまま放置しておいたプログラミングVisualC++.NET基礎編があるのですが やっぱり新しい本を購入してやったほうがいいですか?
676 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 07:23:12 ] ソースコード読むのが一番遠回りで一番近道な気がしてきた 適当になんか作りたいだけならサンプル眺めてるだけでいいし
677 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 12:00:03 ] >>675 基本VS6時代の本でおK というかあの頃の本が一番詳しく書いてある VSが.NETになってからだとVC本がしょっぱい現実
678 名前:名無し募集中。。。 mailto:sage [2008/11/27(木) 13:07:56 ] MFCの勉強なら「Scribble サンプル : MDI 描画アプリケーション」 のチュートリアルを一通りやるといいよ VC6の時はSTEP1〜7までていねいに解説してあった
679 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 22:41:01 ] それMFCの最初のテーマとしては最悪だよ 何人がそれであきらめてやめたことか 悪いことは言わん 最初は、ダイアログアプリからやるべし
680 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 22:54:16 ] 慣れてくれば、あのサンプルの意図するところも解るのだけどね。 最初にあれに手を出すと、確実に拒絶反応起こすこと請け合い。 ダイアログアプリ以外だと、Document-Viewを切ったSDIとかも練習には良いな。
681 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 23:04:43 ] とりあえずダイアログを使いこなせないとSDIは厳しいだろ SDIやるなら、適当にGDIの勉強とか、Doc-View-Frameとかの関係を理解するとか・・・良いサンプルないかな
682 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 02:55:52 ] MFCサンプル ttp://msdn.microsoft.com/ja-jp/library/482ck6x8.aspx ttp://www.microsoft.com/downloads/details.aspx?FamilyId=01AE159F-08CD-495B-8BF4-A48CC395AD7B&displaylang=ja
683 名前:名無し募集中。。。 mailto:sage [2008/11/28(金) 12:58:34 ] 薦めておいて何だが、そういえばScribbleは途中で投げ出した記憶があるな でもリソースエディタの使い方とかVSの操作は役に立ったような・・・
684 名前:デフォルトの名無しさん [2008/11/28(金) 19:39:24 ] ダイアログベースのアプリからモードレスウィンドウを表示しているのですが ウィンドウを破棄する時に警告がでてしまいます 警告の内容はデストロイウィンドウが呼ばれてないといった内容で ダイアログを破棄するときに実際にデストロイウィンドウを呼んでみると 例外エラーが発生してアプリケーションが落ちてしまいます
685 名前:デフォルトの名無しさん [2008/11/28(金) 19:40:28 ] 質問はどうしたらうまくいくのでしょうか?ということです
686 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 23:46:39 ] CWnd::DestroyWindow()のかわりにCWnd::PostMessage()を使ってみては?
687 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 01:26:55 ] モードレスウィンドウのインスタンス生成やデータの持たせ方等で方法は 一つではないが、留意しなければいけないのは、モードレスウィンドウの 表示/非表示の繰り返しでメモリリークしないことと、「閉じる」操作など で親ウィンドウが消滅した際に、モードレスウィンドウが開かれていれば 終了前に閉じれること。 ダイアログベースでメインウィンドウをモードレスに変更したのか、別に モーダレスウィンドウを開くのか不明だが、後者と仮定しての一例...。 モードレスウィンドウ(Exp:CMyModalessDlg)を、ベースダイアログ(Exp: CMyMainDlg)のメンバ変数(Exp:m_wndModalessDlg)にする。 App終了時にモーダレスを自動で閉じるため、CMyMainDlg::OnDestroy()に、 if(m_wndModalessDlg.m_hWnd) m_wndModalessDlg.DestroyWindow(); を追加。 モーダレスの表示/非表示のハンドラは... void CMyMainDlg::OnShowHideModaless() /* afx_msg */ { if(m_wndModalessDlg.m_hWnd==NULL) m_wndModalessDlg.Create(this); m_wndModalessDlg.ShowWindow(m_wndModalessDlg.IsWindowVisible() ? SW_HIDE:SW_SHOW); } モードレスウィンドウのインスタンスをnewで生成していないので、 CMyModalessDlg::PostNcDestroy()で「delete this」やっていたら 削除。 >>587- あたりも参照のこと。
688 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 01:32:49 ] ていうか、CDialogを上手く隠ぺいしたら、モーダレスダイアログの抽象クラスくらい作れそうな気がするな IDDあたりも工夫して・・・
689 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 01:52:05 ] 抽象クラスって意味判って言ってるのか?
690 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 01:57:20 ] 何もおかしくないと思うぞ CDialogのような使い方は出来ないと思うけど
691 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 02:40:06 ] >>686-687 レスありがとうございます このサイトのコードを参考にしていたのですがこれがなんかまずかったみたいです athomejp.com/goldfish/mfc/dialog/modeless.asp CWaitDlg *pWait = new CWaitDlg(); pWait->Create(this); //処理 pWait->DestroyWindow(); delete pWait; で普通に消せました ご迷惑おかけしました
692 名前:デフォルトの名無しさん [2008/11/29(土) 03:03:13 ] Viewの中でCEditをcreateで生成して用いているのでPreTranslateMessageで キー入力を認識しているのですが、ctrl+Cなどコピペや複合の入力を検知する方法はありますでしょうか。 XP+VC2005です。
693 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 03:11:57 ] >>691 なんでnew使うの? { CWaitDlg wait; wait.Create(this); // 処理 wait.DestroyWindow(); } でいいと思うのだけど。 破棄のタイミングに拘らなければブロック化({})すら要らない。
694 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 03:32:55 ] >>693 あんまり意味ないです 貼り付けたサンプルがたまたまそうだったからという理由だけですw
695 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 03:43:50 ] >>691 CTestDlg::PostNcDestroy()にdelete this;って記述されてるので例外が発生したんじゃないの? >>692 リソースに記述してCOMMAND_UIあたりで処理するのではなかったっけ?
696 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 04:13:03 ] >>695 >CTestDlg::PostNcDestroy()にdelete this;って記述されてるので例外が発生したんじゃないの? いや、なんかよくわかりませんでした とりあえず、モードレス側に書く処理はCreate関数だけで 削除は親に全部まかせるのがいい気がします
697 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 17:15:04 ] >>693 >>694 モードレスの場合はダイアログの作成と破棄のタイミングが違うのでメンバに抱えてnewを使う
698 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 18:14:42 ] >>697 モードレスとモーダルを同じダイアログで使いまわす状況なんてないんじゃね?
699 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 18:30:38 ] 何れにしても、わざわざnew/deleteして使わなくてもいいだろ。 ダイアログが閉じられたからといって、 クラスのインスタンスを即座に破棄しなければならない理由は無い。 別々の派生クラスを時と場合に応じて使い分ける、とかいうなら話は解るけど。
700 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 20:37:50 ] >>699 じゃあモードレスの場合にダイアログが作成されてるか破棄されてるかはどうやって判別すんの?
701 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:03:49 ] 画面に線だけを書きたいときは領域を塗りつぶしてから書いたほうがいいですか?それともなんかコントロールを置いてそれに書いたほうがいいですか?
702 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:08:11 ] 領域を塗りつぶしてから書いたほうがいい
703 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:17:29 ] >>700 用語が曖昧だからなんとも言えないけれど、モードレスダイアログが実際に表示されているのかされていないのか、 そのダイアログ自身以外に一体全体誰が気にしなければいけないというの? そのダイアログのインスタンスを持っている側にとっては、出ていて欲しいときに出せと要求するだけで充分でしょ。
704 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:17:48 ] 塗りつぶして線を引いた、領域と同じサイズの絵を描画した方がいい
705 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:18:19 ] >>701 用途と状況と目的によりけりかと。
706 名前:!699 mailto:sage [2008/11/29(土) 21:22:14 ] >>700 質問元のモードレスダイアログは、処理中ダイアログみたいだから、 判別する必要ねえんじゃね? ユーザーによるオペレーションで表示/非表示するようなやつの場合、 俺は(複数表示する必要なかったので)シングルトン的なものにして対応したんで、 作成されている/いないを判別するは必要なかった。
707 名前:706 mailto:sage [2008/11/29(土) 21:24:28 ] リロードせずにレスした。 反省した。 次はリロードする。
708 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:06:13 ] >>706 処理中ダイアログって考えはなかったわ でも1ハンドラ内に>>691 の記述でモードレス中ダイアログを表示できたっけ?
709 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:07:10 ] >>703 表示/非表示じゃなくダイアログの作成/破棄な CDialog::Create()とCWnd::DestroyWindow() インスタンスの生成/破棄(new/delete)とも別だよ
710 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:20:51 ] >>708 PeekMessageでもはさむんじゃね?
711 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:48:54 ] >>709 事情は変わらんだろ。ダイアログ自身が管理していれば、利用者はそれを意識する必要はない。
712 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:52:27 ] 俺はそもそも モードレスとモーダルをいっしょのクラスで分岐させる無意味な汎用性と Createされてる状況でCreate関数を再び呼ぶ必要を考慮してるクラスの仕様のが 気持ち悪くていまの話題についていけないけどね
713 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:56:54 ] いっそのこと新しいC++向けのMS製フレームワークを提供してほしいわ .NETは相性悪すぎる せっかくDirect2DとDirectWriteもC++向けに提供するんだし、アプリケーションハンガリアンでエレガントなクラス群を是非
714 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:01:17 ] >>711 モードレスダイアログのサンプル書いてみてよ
715 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:03:47 ] >>714 CWaitDlg wait; wait.Create(this); // 処理 wait.DestroyWindow();
716 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:14:20 ] >>715 処理中ダイアログじゃなくてOKボタン押すまで表示されてるモードレスダイアログのサンプル書いてみてよ
717 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:15:52 ] >>716 意味がわかんない
718 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:18:19 ] >>716 CWaitDlg wait; wait.Create(this); while(1){ PeekMessage GetMessage TranslateMessage DispatchMessage if(ボタンが押されたら)break; //処理 } wait.DestroyWindow();
719 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:32:06 ] >>718 モードレスのサンプルになってないよ その用途ならモーダル使うのが普通じゃん
720 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:36:43 ] >>719 プログレスバーが表示できるじゃん 質問元が思いっきりそういう意図じゃん 普通だったらモードレスなんてつかわねぇよ 正直いってバグりやすいもん 大部分がこんな感じで済むんだよ
721 名前:706 mailto:sage [2008/11/29(土) 23:49:45 ] >>708 1ハンドラでの処理は考えてなかった。 てか忘れてた。 new/deleteの話いらないって話なんだから、1ハンドラだね。 そういうわけで、>>706 はなかったことに。 (>>710 の通りやればできそうだけど、確認したくないという事情によります) まったく持ってごめん。 反省した。 次は、、次も、、とり頭だからやってしまうかもしれん。
722 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:58:54 ] >>718 を>>711 のようにするにはどうすればいいの?
723 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:00:13 ] >>722 何がやりたいのか具体的にいいたまへ
724 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:13:23 ] >>716 どっかのクラス { CWaitDlg m_wait; }; どっかのクラス::モーダレス表示するハンドラ() { wait.Create(AfxGetMainWnd()); } これで、親クラスが消滅するかダイアログの「×」ボタン「OK」または 「Cancel」ボタンがクリックされるまで表示されたままになる。 >>719 モードレスだが? >>722 スレッドを起こせばいい。
725 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:15:04 ] >>724 > wait.Create(AfxGetMainWnd()); ... 誤 m_wait.Create(AfxGetMainWnd()); ... 正
726 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:30:19 ] >>723 ダイアログ自身が管理する形で書かれていないので CWaitDlgが管理するようにしたいんだけど
727 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:38:36 ] >>724 m_wait.Create(AfxGetMainWnd());が2回呼ばれたらマズくない? m_wait.DestroyWindow();は必要ないの?
728 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:39:43 ] >>726 何を管理する?ちゃんと日本語で書けよバカSEよ。それとも低級な魔法 使い気取りか?
729 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:51:56 ] >>727 > m_wait.Create(AfxGetMainWnd());が2回呼ばれたらマズくない? 概念の説明だけでなく、エラー処理まで手取り足取り見なきゃならん のか? if(m_wait.m_hWnd=NULL) m_wait.Create(AfxGetMainWnd()); とでもしておけばいい。 > m_wait.DestroyWindow();は必要ないの? MFCの場合、明示的に呼ばなくても、m_waitのデストラクタ内で DestroyWindow()が呼び出される仕様。 CFile::Close()等も同様。
730 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 01:12:45 ] >>729 呼ばれなくね? とりあえず俺の環境では Warning: calling DestroyWindow in CDialog::~CDialog -- OnDestroy or PostNcDestroy in derived class will not be called. って警告がでちゃうよ
731 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 01:27:56 ] だよね。質問元の>>684 にもそう書いてあるし
732 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 02:18:51 ] >>730-731 MFCのソースも読めないし、トレースの仕方も知らんと恥を晒している ようだな。 まさに宝の持ち腐れ。 豚に真珠ってヤツだ。 その警告メッセージは、MFC(デバッグ版ライブラリ)が出している。 CDialog::~CDialog() { if (m_hWnd != NULL) { TRACE0("Warning: calling DestroyWindow in CDialog::~CDialog --\n"); TRACE0("\tOnDestroy or PostNcDestroy in derived class will not be called.\n"); DestroyWindow(); // ← ここで呼んでるだろうが、ボケ!!! } } ついでに、英語も理解できないおまえらに、低学歴の漏れが警告メッ セージの意味を解説してやると、 『テメェが忘れてるから、デストラクタ内(CDialog::~CDialog())で ケツ拭きでDestroyWindow()呼んでやるが、今からじゃ手遅れで派生 クラスのOnDestroy()やPostNcDestroy()は呼ばれねぇけど、間違っても Windowsのバグとか、ゲイツ様のせいにすんじゃねぇぞ、ゴルァ!』 ってこった。
733 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 02:49:47 ] そんなことは、皆了解済みの上で話していると思うのだがどうか。 わざわざトレース文が入っているようなお情け処理を、 正式な仕様として扱う勇気は俺には無いな。
734 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 05:34:25 ] >>688 >>716 今までの話を整理したらこうなった void CPropertyDialogSampleView::OnEditProperty() { m_propertyDlg.Show(); } CModelessDialogBase::~CModelessDialogBase() { if (CWnd::GetSafeHwnd() != NULL) CWnd::DestroyWindow(); } void CModelessDialogBase::Show(CWnd* pParentWnd = NULL) { if (CWnd::GetSafeHwnd() == NULL) CDialog::Create(GetTemplateID(), pParentWnd); CWnd::ShowWindow(SW_SHOW); CWnd::BringWindowToTop(); } void CModelessDialogBase::OnOK() { CWnd::ShowWindow(SW_HIDE); } void CModelessDialogBase::OnCancel() { CWnd::ShowWindow(SW_HIDE); }
735 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 07:02:30 ] >>733 でもそこなんでトレースいれるんだろうね 少なくとも俺の感覚としちゃそこでDestroyWindowを呼ぶのは当然の処理で 警告なんて出す意味がわからないんだけど
736 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 07:11:07 ] CreateとDestroyWindowが対だからじゃね? コンストラクタでCreateしないからデストラクタでもDestroyWindowしない方針
737 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 08:00:16 ] >>736 しろよな しない方針にすることでなにかいいことあるのか?って感じ Create関数のヘルプにもそんなこと書いてねーし DestroyWindow関数のヘルプには MFC側で呼んだり呼ばなかったりするからユーザー側でうまくやれよマジで とかかなりむかつく仕様だしで作った奴マジ嫌な感じだな
738 名前:732 mailto:sage [2008/11/30(日) 10:06:48 ] >>733 > そんなことは、皆了解済みの上で話していると思うのだがどうか。 理解したり、(実際に呼ばれていることを)知っていたら『呼ばれなくね?』 なんて発言は、マヂでありえなくね。(w C++の基本を理解し、警告メッセージの意味を正しく理解していれば、 > わざわざトレース文が入っているようなお情け処理を、 > 正式な仕様として扱う勇気は俺には無いな。 なんて発言も出てこないハズ。
739 名前:732 mailto:sage [2008/11/30(日) 10:08:09 ] >>735 CDialogクラスのデストラクタで呼び出しているので、(この時点では 派生クラスのメッセージマップや仮想関数テーブルを参照できない、 もしくは存在自体を知りえないため)派生クラスのOnDestroy()やPost NcDestroy()は呼ばれないだけ。 当然ながら、CDialog::OnDestroy() やCDialog::PostNcDestroy()の呼び出しは行われる。 派生クラスのOnDestroy()やPostNcDestroy()で独自の実装(例:閉じた 時のウィンドウサイズを取得してレジストリやINIファイルに保存する 等)を呼び出していなければ、デストラクタに処理を任せてもなんら 問題ない。 だからこそ「Error:」じゃなく、あくまで「Warning:」ってなってる。 CFileクラスのデストラクタや、CGdiObjectクラス(CPen,CBrush等の基本 クラス)のデストラクタでも同様のことをやっているけど、これらはメッセ ージループを廻す必要がないので、TRACE記述はない。
740 名前:732 mailto:sage [2008/11/30(日) 10:13:43 ] >>736-737 こういう文句を言う連中は、MFCはおろかC++の基本的な仕様(派生クラスと 基本クラスのコンストラクタ/デストラクタが呼び出される順序や、仮想 関数など)さえロクに理解していないんだろうナァ。 方針なんて関係ない。強いて言えばデザインパターンってやつか? コンストラクタでデフォルト値を代入してメンバ変数の初期化忘れを防ぐ とか、デストラクタでメモリやハンドルの解放忘れを防ぐというのは、 基本中の基本。 インスタンスの消滅で確実にウィンドウを破棄し、なおかつ派生クラス のOnDestroy()やPostNcDestroy()も呼び出されるようにしたければ、MFC 内部の実装に関係なく、派生クラスのオブジェクトが消滅するタイミング でDestroyWindow()を呼び出せばいいだけ。 すなわち、自分が作るCDialog派生クラスで、デストラクタ関数を定義し、 m_hWndが有効ならDestroyWindow()を呼び出してやればいい。 class CMyDialog : public CDialog { virtual ~CMyDialog(); }; CMyDialog::~CMyDialog() { if(m_hWnd!=NULL) DestroyWindow(); } ただそれだけのことだ。
741 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 10:14:42 ] >>738 俺とそいつは別人だ ちなみに「よばれてなくね?」は俺 >>739 警告の必要なくね?
742 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 10:18:33 ] >>740 でもヘルプでだってどういうときに DestroyWindowを呼ばなきゃいけないのか書いてないわけだし 当然MFCの中身の都合なんてこっちはしったこっちゃないわけで もし、自分でこういうもんを作るとしたら解放はフレームワークのほうで自動でやってほしいかな?
743 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 11:15:41 ] >>740 のコードがまずいというのもわかりにくいしな
744 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:54:00 ] 何この流れ どうせお互いまったく譲り合わないんだから、これ以上書いても無駄だよ
745 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 18:51:38 ] Win7ってペイントとかワードパッドにリボン採用してるよな 今後作るソフトはリボンで作った方が惹きやすいのだろうか・・・2008SP1は持ってるが