[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 03/01 12:35 / Filesize : 186 KB / Number-of Response : 746
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

■MFC相談室 mfc19d.dll■



1 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 18:37:47 ]
Microsoft Foundation Classライブラリ専用スレです。

前スレ
■MFC相談室 mfc18d.dll■
pc11.2ch.net/test/read.cgi/tech/1185917008/

618 名前:612 mailto:sage [2008/11/21(金) 17:48:04 ]
>>617
なるほど。よくわかりました。
っていうか、このスレのレスすらも確認しなくてスンマセン。

619 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:57:18 ]
>>612
ダイアログ内に子ダイアログを置くのであれば、
子ダイアログの「Control」をTrueにしておいたほうがよいですよ。
子ダイアログだけ消えるということも無くなるはず。

620 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 19:12:31 ]
612を見てなんでCPropertySheet&Pageを使わないのかと思ってしまったが言わない方がいいのか?

621 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 19:19:05 ]
うん。言ったら恥かくよ。

622 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 19:19:28 ]
と思ったらトップレベルウィンドウがダイアログなのか( ´ω`) ごめんよ

623 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 21:40:45 ]
CodeGuruかどっかのサンプルを参考に、トップレベルのダイアログに、
>>620-622
位置決め用にスタティックコントロールを置いて、そのスタティック
コントロールに重ねて、動的にプロパティシート(CPropertySheet)を
貼り付けて、そのシートに、さらにCPropertyPageをAddPage()する
というコードを実際に書いたことあるけど?


624 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 21:50:21 ]
>>612
> ダイアログウィンドウでOnSizeが渡されるのが、OnInitDialogより後
> なのは仕様ですか?

DoModal()を呼んだ場合、OnInitDialog()より前、OnCreate()の後に
OnSize()が呼ばれていると思うけど?

ダイアログリソースに貼り付けたコントロールではなくて、自分でコント
ロールを動的にCreate()しているのなら、コントロール作成より前には
呼ばれないでしょ。 そういうことではなくて?

625 名前:デフォルトの名無しさん [2008/11/21(金) 22:37:42 ]
>>624
あ、いや、ダイアログリソースで貼り付けて、DDXで関連づけたコントロールをOnSizeで調整しようとしているので、
DoDataExchangeで関連づけられる前にOnSizeが呼び出されるのが気にくわなかっただけでして…
(OnInitDialogはそれよりもあと)
あれ、UpdateDataを勝手に呼び出しちゃえば問題なかったですかね? もしかして。

626 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 03:20:48 ]
今日からVC++を使い始めたCプログラマです。

IPAddressクラスからIPv4アドレスをDWORD値で取り出したいのですが
どうすればいいのでしょう?

CString hostName = Host;
String ^strHost = gcnew String(hostName);
IPHostEntry^ ipInfo = Dns::GetHostEntry(strHost);
IPAddress^ ipAddr;
for each (ipAddr in ipInfo->AddressList)
{
 if (ipAddr->AddressFamily == System::Net::Sockets::AddressFamily::InterNetwork) break;
}
if (!ipAddr) /* この判定は超怪しい */
{
 /* とれなければLoopBackに強制 */
 dwSvAddr = 0x7F000001UL;
}
else
{
 /* dwSvaddr = *(DWORD *)ipAddr->getAddressBytes(); みたいなキャストがしたい */




627 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 08:53:01 ]
.NETスレで聞きなさい
たぶん.NETのデータ型をアンボクシングしてからキャストすればよさそうだが

628 名前:624 mailto:sage [2008/11/22(土) 09:32:53 ]
>>625
やりたいことがイマイチわからんのですが?

DoDataExchange()内のDDX_Control()で関連付けせずに、OnInitDialog()
内で、SubclassDlgItem()で動的に関連付け(サブクラス化)することも
できますが、コントロールの初期サイズはリソースで指定したサイズに
なるので、特定コントロールのみ例外扱い(リソース指定と異なるサイズ
にしたい)場合、そのコードはどこかに書く必要があると思います。

そもそも、OnSize()って、ダイアログのスタイルを「ダイアログ枠」で
なくて「サイズ変更枠」にすると、ダイアログをドラッグしてサイズ変更
したら、表示中はいつでも何回でも呼ばれる可能性がありますよ?

codeguru.comあたりの「CResizeDialog」を参考にしては?

629 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 19:11:26 ]
みんなMFCでアプリケーションハンガリアン使うとき、どんな感じにしてるの?

630 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:24:08 ]
>>628
DoDataExchangeよりも先にOnSizeが先に呼ばれてしまうから、
if (2回目以降のOnSizeだったら) {
  コントロールのサイズ変更;
}
のような判定が必要になるのが気にくわないということでは?

631 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 03:30:09 ]
>>630
本筋とそれる話で申し訳ない。
"2回目以降"でなくて、コントロールのhWndがIsWindow通るとかでいいんじゃね?

632 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 07:07:43 ]
まぁOnSizeはwin32のWM_SIZEのままで、ddxはmfcの後付なんだからしょうがない

633 名前:624 mailto:sage [2008/11/23(日) 11:35:19 ]
>>630
> DoDataExchangeよりも先にOnSizeが先に呼ばれてしまうから、

DoDataExchangeとの順番は関係なく、最小化のタイミング等でもWM_SIZEは
飛んでくるから、何らかの判定は必要だと思うけど?

codeguru.comの「CResizeDialog」だと、ダイアログにCRect型のメンバ変数
を追加して、コンストラクタでCRect::Empyt()しといて、一発目のOnSize
で、CRect::IsRectEmpty()がTRUEなら、現在のダイアログサイズを変数に
取り込み、FALSEなら、直前のOnSize()時に取り込んだダイアログサイズと、
新しいサイズの差を計算して、子コントロールのダイアログ内での移動や、
サイズ変更をやっていたかと。

OnCreate()⇔OnDestroy()のように、明らかに逆で呼ばれることはないメッ
セージを除いて、安易にフレームワークが呼び出す順番に依存するような
造りにはしない方がいいのでは?

アイコンやビットマップを貼り付けるスタティックコントロールとか、貼り
付けたイメージのサイズに合わせて、コントロールのみ単独でOnSize()が
呼び出されることもあるし。

634 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 12:28:51 ]
>>633
なんかかみ合ってないような。
一発目のOnSizeではDDXメンバがまだ設定されていないということですよ?
そのCResizeDialogというのは、派生用のダイアログクラスなんだろうから、
内部で子コントロールのDDXメンバを持ってるわけではないでしょう?

昔のソースを掘り返してみたら、
if (IsWindow(m_buttonOK)) {
  m_buttonOK.MoveWindow(〜);
}
と自分もIsWindowを使っていた。

635 名前:624 mailto:sage [2008/11/23(日) 12:36:46 ]
>>634


636 名前:624 mailto:sage [2008/11/23(日) 12:41:26 ]
間違ってENTER押してもうた。(w

>>634
> なんかかみ合ってないような。

そもそも、なんでサイズ変更に際して、DDX_Control()での関連付けが
必要なのか全く説明がないし、自分が設計するとしても、その必要性を
まったく感じないんですが?



637 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 20:05:24 ]
IsWindowか 俺はGetSafeHwnd派だ( ´ω`)

638 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 20:27:16 ]
::IsWindow()とCWnd::GetSafeHwnd()なら普通は後者を使うでしょ?

639 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 20:37:32 ]
HWNDキャスト派は異端ですか?

640 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 21:27:30 ]
それもCWndメンバだからいいんじゃね?
グローバルスコープなのを呼び出すなって話だろ

641 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 23:00:14 ]
CWnd::GetSafeHwnd()って、m_hWndを返すだけであって、
そのウィンドウが存在しているかどうかはわからないのでは?

642 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 23:02:48 ]
Create()が正常終了してないとm_hWndはNULL
CWndの実体ができる時点でウィンドウが作られてるわけじゃないぞ

643 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 23:12:18 ]
>>642
それはどこかで明記されてたっけ?
初期化していないポインタのようにゴミが入っている可能性は常に無い?

あとそれが大丈夫だとしても、>>634のようにDDXメンバの実体に対するものには
GetSafeHwnd()ではなくm_hWndで十分だと思うけど。

644 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 00:54:26 ]
SDKで組んだこと無いのかよ

645 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 01:32:23 ]
m_hWndの指すウィンドウが存在しないとか言い出したら、
そのハンドルが、実は他プロセスのウィンドウを指してしまっている状態すら、
考慮しないといけなくなるんじゃないか?

646 名前:名無し募集中。。。 mailto:sage [2008/11/24(月) 02:08:50 ]
俺はm_hWnd派だったんだけどGetSafeHwnd()の方が安全そうだから乗り換えるわ
でも、たぶんどっちでも良くて気分の問題



647 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 07:43:46 ]
>>643
> それはどこかで明記されてたっけ?
> 初期化していないポインタのようにゴミが入っている可能性は常に無い?

挙動はMFCのソース見れば判るだろ。 というより、C++やクラスの本質
を理解しているのかと?

その理屈なら、CFileクラスのm_hFileメンバ変数や、CGdiObjectクラス
(CPen,CBrush等の基底クラス)のm_hObjectメンバ変数の値も信用できん
とな?(w

> あとそれが大丈夫だとしても...

『大丈夫だとしても』ぢゃなく『大丈夫でなければ』、どんな場面であって
も(m_hWndの値を返す)GetSafeHwnd()も、m_hWndの直接参照も使えない。


648 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 07:44:54 ]
>>646
> たぶんどっちでも良くて気分の問題

んなことぁない。

直接参照する場合、thisポインタのチェックが入らないのに対して、Get
SafeHwnd()は、(CWndを指す)thisポインタが有効かどうかチェックした後
でthisポインタがNULLの時m_hWndの値を参照せずNULLを返し、thisポインタ
が有効な時のみメンバ変数m_hWndの値を返す。

クラスメンバとして実体が存在するオブジェクトに対して使う場合は、
>>643 氏の言うとおり。

問題はGetParent()などのようにCWndのポインタとしてNULLを返す可能性が
ある場合、戻り値をチェックせず、m_hWndを直接参照すると「0xXXXXXXXXが
無効なポインタを参照うんぬん」というエラーで落ちることになる。

自前のコードでチェックしてm_hWndを参照してもいいけど、どうせなら
そういう場合はGetSafeHwnd()を使った方がスマート。

同様に、CGdiObject::m_hObjectも、CGdiObject::GetSafeHandle()を
使った方がいい。

649 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 10:56:07 ]
CWndの関数はm_hWndに対してそのままAPIを呼ぶようなものが多いから、
自分もNULLチェックではなくAPIのIsWindowに渡してチェックすることが多いな。

650 名前:デフォルトの名無しさん [2008/11/24(月) 11:41:00 ]
もしかして、冷蔵庫内のランプが消えたかどうか、冷蔵庫のドアを何回も
開け閉めして確認しちゃう人?

IsWindow()呼んで戻り値をチェックした後で、APIを呼び出すまでの間に
ウィンドウが消滅しているかもしれないという心配はしないの?(w

651 名前:デフォルトの名無しさん [2008/11/24(月) 13:18:36 ]
お取り込み中すみませんが、質問です。
ドキュメントビューアーキテクチャのSDIプログラムを作っているのですが、
メニューのハンドラってxxxDocment.cppに作成するのが良いのでしょうか?
あと、設定データとかファイル入出力のデータの実態もxxxDocment.cppに
作成した方がよいのでしょうか?

652 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 14:40:44 ]
>>650
それは別問題では?
IsWindow()でチェックしようがm_hWnd!=NULLでチェックしようが、
その後APIを呼び出すまでの間にウィンドウが消滅しているかもしれないのは同じ。

>>651
「表示倍率を拡大」なんていうコマンドならビューやアプリケーションだろうし、
コマンドの内容に依りますよ。

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();






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<186KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef