- 1 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 18:37:47 ]
- Microsoft Foundation Classライブラリ専用スレです。
前スレ ■MFC相談室 mfc18d.dll■ pc11.2ch.net/test/read.cgi/tech/1185917008/
- 596 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 17:23:38 ]
- 子ダイアログで親クラスのヘッダをincludeしてもいいならそれもアリだがそこでしか使えなくなる
俺もやったことあるけど
- 597 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 21:07:31 ]
- モードレスダイアログなら、
一旦Createした後は、ShowとHideしかしないという作り方もある。 で、ダイアログ自体はポインタでなくメンバ変数としてそのまま持っておく、と。
- 598 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 21:08:33 ]
- って >>590 そのものだった。すまそ。
- 599 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 21:37:13 ]
- シングルトンならそれでいいな
- 600 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 01:28:13 ]
- >>599
はぁ?何言ってんの?
- 601 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 01:32:38 ]
- >>586
アプリケーションフレームワーク使ってないの?
- 602 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 01:38:21 ]
- >>589
delete thisってどういう挙動になるのかな?
- 603 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 13:47:14 ]
- delete this; // ハラキリ
- 604 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 17:42:17 ]
- delete this; // さようなら
なら実際に見たことがある。
- 605 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 20:03:19 ]
- >>600
きもw
- 606 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:05:35 ]
- 俺も >>599 が何を言ってるのか解らん。
親と子ダイアログ、どっちを指してるのかも不明だが、それが シングルトンであるかどうかが今の話にどう関係してくるってんだ。
- 607 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:44:49 ]
- > モーダレス上のボタンを押したときに親ウィンドウの変数や関数をいじりたいのですが。
ライブラリ化などして、後々まで利用するなら、親ウィンドウなり、 オーナーウィンドウに対して、ユーザー定義メッセージを投げるのが、 一番汎用性があるのでは? WPARAM,LPARAMで、操作したい内容(処理を特定するためのボタンのID等) を渡す。 DWORD値2個で足りなければ、他のメッセージと同様に、構造体 やクラスオブジェクトのポインタを渡す。 処理は、ユーザー定義メッセージを貰う親ウィンドウなり、オーナーウィン ドウ側にON_MESSAGE()のハンドラとして記述することになる。
- 608 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:08:54 ]
- >>595-596
いいかどうかは別にして、自分もやるし、何度もやったことある。 >>597-598 1回だけCreateして、Show/Hideで使い回す場合、2回目以降表示する際 には、モーダレスダイアログ側のOnInitDialog()が呼ばれないことを ちゃんと理解していれば、それで問題ないと思う。 ダイアログが、親ウィンドウが持つパラメータや状態を表示したり、変更 する機能を持つ場合、同じ実体をリサイクルしてもいいけど、親ウィン ドウ側にはダイアログのポインタをメンバに持たせて、表示時は、newした 後でダイアログのメンバ変数をセットしてCreateを呼び、非表示時は、 DestroyWindow()してdeleteしてしまうのが良いかと。
- 609 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:14:44 ]
- 要約して書くと、こんなかんじ?
ON_BN_CLICKED(IDC_BUTTONxx,OnShowHideDlg) CxxxxWnd::CxxxxWnd() { m_pDlg=NULL; } CxxxxWnd::~CxxxxWnd() /* virtual */ { if(m_pDlg) // 親が死ぬとき、子も道連れに死ぬ { m_pDlg->DestroyWindow(); // MFCならデストラクタで呼ばれるので省略可 delete m_pDlg; m_pDlg=NULL; // どうせ死ぬので省略可 } } CxxxxWnd::OnShowHideDlg() { if(!m_pDlg) // 非表示→表示 { m_pDlg=new CMyDlg; m_pDlg->m_numParam1=1; m_pDlg->m_strEditParam=_T("テスト"); m_pDlg->Create(this); // 表示時に毎回CMyDlg::OnInitDialog()が呼ばれる m_pDlg->ShowWindow(SW_SHOW); } else // 表示→非表示 { m_pDlg->DestroyWindow(); // MFCならデストラクタで呼ばれるので省略可 delete m_pDlg; m_pDlg=NULL; } }
- 610 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:21:05 ]
- CWnd::ShowWindow()で表示切替したほうが動作が軽いよ
前回開いてた状態で再表示されたほうが使い勝手も良さそう
- 611 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:20:56 ]
- まぁ、それも用途次第じゃないか
中身初期化しないならそれがベストだろし
- 612 名前:デフォルトの名無しさん [2008/11/21(金) 15:07:35 ]
- ダイアログベースのMFCアプリです。(VS2005)
親ダイアログにタブコントロールを付けて、タブに更に子ダイアログがくっついている形です。 ダイアログウィンドウでOnSizeが渡されるのが、OnInitDialogより後なのは仕様ですか? CWnd::OnInitDialogが呼び出されるよりも前にOnSizeが来てしまうので、 サイズを一緒に調整したい子ウィンドウ全てに対してGetSafeHwnd()関数でチェックしてから サイズを変更しているのですが、もうちょっと効率的な方法はないですか? それと、なぜかウィンドウでエンターを押すとShowWindow(SW_HIDE)が渡されるのか、 子ダイアログは消えてしまうし、親ダイアログではアプリ自体が終了してしまいます。 何か対処法はありますか?
- 613 名前:名無し募集中。。。 mailto:sage [2008/11/21(金) 15:09:41 ]
- > なぜかウィンドウでエンターを押すと
OnOKに飛んでいる
- 614 名前:デフォルトの名無しさん [2008/11/21(金) 15:25:15 ]
- >>613
OnOKって自分で呼ばなくても勝手に呼び出されちゃうんですか… てっきりIDOKボタンを押した(又はDefault Buttonに設定した上でエンターした)時だけだと思っていました。 これは自分でOnOKを空の関数にオーバーライドして、CDialog::OnOK呼ばないようにせざるを得ないと言うことですか?
- 615 名前:名無し募集中。。。 mailto:sage [2008/11/21(金) 16:40:38 ]
- > OnOKって自分で呼ばなくても勝手に
その通り ESCを押すとOnCancelが呼ばれるのも同じ仕組み
- 616 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:13:49 ]
- >>599
- 617 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:28:43 ]
- >>614
>>376
- 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関数だけで 削除は親に全部まかせるのがいい気がします
|

|