1 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 18:37:47 ] Microsoft Foundation Classライブラリ専用スレです。 前スレ ■MFC相談室 mfc18d.dll■ pc11.2ch.net/test/read.cgi/tech/1185917008/
409 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 09:29:12 ] CListCtrl上にデータを表示し入ってくるデータで更新しているのですが、一定時間がたつと画面表示がおかしくなります。 フォントキャッシュが壊れた時のようにコンボボックスの右側の▽ボタンに6と表示されたり、画面全体(Windows含)が残像を残すようになったり。 データの受信を中止してもそのままで、またメモリ使用量を調べても特に増えてはいません。 InValidate関数等も試しましたが同じ現象が起こります。 最小化する、別の画面を最前面に表示する等で他の画面は正常に戻るのですが、再度リストを表示するとその瞬間に同じ症状が出ます。 どのような対策方法があるか教えていただけないでしょうか。
410 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 10:57:58 ] そうなんだ
411 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 12:02:52 ] どのような対策って、バグをつぶすしかねーだろ
412 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 13:12:05 ] >>409 の訳:「ソース出さないけど誰かデバッグして下さい」
413 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 13:46:39 ] よくあるケースみたいだから対策方法教えてくれと言ってるのかもしれんが、 普通無いケースだからなあ
414 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 15:23:51 ] 「入ってくるデータで更新」がちょっと気になるな。 別スレッドでなんかやってるとか、 逆にシングルスレッドで表示の更新が止まってるとか。
415 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 15:46:55 ] リソース食いつぶしてるようにも見えるなあ
416 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 17:24:26 ] MFCと関係ないだろ
417 名前:デフォルトの名無しさん [2008/09/10(水) 19:20:41 ] スタッティク領域に書かれたテキスト文字だけ拡大できる のか
418 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 19:23:34 ] ひとりごとです
419 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 21:56:10 ] >>409 メモリーじゃないとすればGDIオブジェクトの数確認してみ。 タスクマネージャで表示メニューいじれば確認できる。 ひとつのアプリで使用できるGDIオブジェには上限があり 開放し忘れ関数が何度も呼ばれると409のような状態になる。
420 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 09:59:09 ] >>419 タスクマネージャにそんな機能があるとは、知らなかった これは便利
421 名前:409 mailto:sage [2008/09/11(木) 11:12:54 ] ソースも出さず失礼しました。 単純なプログラムでも同じ状態になるので、何か単純な回避方法があるのではないかと思ったのです。 とりあえずGDIオブジェクトを調べてみようと思います。 ありがとうございました。
422 名前:名無し募集中。。。 mailto:sage [2008/09/11(木) 13:03:56 ] >>419 便利な事を教えてくれてありがとう
423 名前:デフォルトの名無しさん [2008/09/15(月) 23:52:27 ] 質問です。 現在VS2008でダイアログベースのプログラムを作成しています。 多重起動を禁止するため、以下の手順でウィンドウクラス名を変更しました。 1.ダイアログのClassNameをAAAAに変更 2.C***App::InitInstanceでClassNameをAAAAに設定 BOOL C***App::InitInstance(){ /* MFCによる処理 */ WNDCLASS wc; HINSTANCE hInst = ::AfxGetInstanceHandle(); if(!::GetClassInfo(hInst, CLASS_NAME, &wc)) { ASSERT(::GetClassInfo(hInst, "#32770", &wc)); wc.lpszClassName = CLASS_NAME; wc.hIcon = ::LoadIcon(hInst, MAKEINTRESOURCE(IDR_MAINFRAME)); ASSERT(::AfxRegisterClass(&wc)); } ASSERT(CWinApp::InitInstance()); /* 残りの処理 */ C***Dlg dlg; dlg.DoModal return FALSE; } Debug版ではDoModalでちゃんとウィンドウが表示されるのですが、Release版ではDoModalが-1を返し異常終了してしまいます。 Release版でやらなければいけない処理などがあるでしょうか? また、間違ってる処理などがあれば教えてください。
424 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:04:30 ] ASSERTがいかんのじゃね? 誤解してんじゃね? よくみてねーけどさ。
425 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:17:59 ] うん、俺もちゃんと見てないがInitInstance()なんてものをASSERTの中で呼んでることが怖い
426 名前:423 mailto:sage [2008/09/16(火) 00:55:56 ] >>424-425 ありがとうございます!解決しました! ASSERTを誤解してました。これからは変数値の評価だけに使うことにします。
427 名前:名無し募集中。。。 mailto:sage [2008/09/16(火) 00:57:28 ] 多重起動防止はCreateMutexを使うのが普通だぜ m_hMutex = ::CreateMutex( NULL, 0, "__HogeAppMutex__" ) ; if ( ::GetLastError() == ERROR_ALREADY_EXISTS ) { ::CloseHandle( m_hMutex ) ; m_hMutex = NULL ; return( FALSE ) ; }
428 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 13:22:56 ] >>426 Releaseビルド時にも式の評価だけはしてくれるVERIFYマクロがあるよ
429 名前:デフォルトの名無しさん [2008/09/16(火) 20:16:49 ] >>427 共有メモリでもいいかも知れない。 共有メモリに最初に起動したウィンドウの ハンドルを格納しておいて、 多重起動された時に最初に起動したウィンドウ を最前面に表示させるとか・・・
430 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:00:23 ] >>429 実はその方針では破綻する。
431 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 10:51:59 ] >>429 >最初に起動したウィンドウの >ハンドルを格納 する前に、二番目に起動したプロセスのウィンドウハンドルが 格納されてしまうかも知れないわけよ。
432 名前:423 mailto:sage [2008/09/17(水) 11:52:16 ] 返信遅くなってすいません。 >>427 これからはこれを多重起動の確認に使ってみようと思います。 ありがとうございます! >>428 こんなマクロもあったんですね。 これからはASSERTの代わりに使ってみます。
433 名前:名無し募集中。。。 mailto:sage [2008/09/17(水) 16:24:05 ] >>429 >多重起動された時に最初に起動したウィンドウ >を最前面に表示させるとか・・・ >>427 のreturn前にコレだな CString strWndTitle ; strWndTitle.LoadString( IDR_MAINFRAME ) ; ::SetForegroundWindow( ::FindWindow( NULL, (LPCTSTR)strWndTitle )) ;
434 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 14:03:32 ] MFCをマクラって略してんの俺だけ?
435 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 15:03:10 ] ファンデーションはどこに行ったんだ
436 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 15:26:38 ] どっかにふっとんだ。
437 名前:名無し募集中。。。 mailto:sage [2008/09/21(日) 15:46:46 ] ファウンデーションでしょ
438 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 16:36:40 ] はげしく、どっちでもいいw
439 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 16:57:36 ] どっちでもいいぐらいだからどっか行ったんじゃね?w マクラいいなw
440 名前:デフォルトの名無しさん [2008/09/21(日) 19:24:06 ] ダイアログコントロールの種類(ボタンかエディットかなど) を判別する関数とかありますか?
441 名前:名無し募集中。。。 mailto:sage [2008/09/21(日) 20:13:57 ] IsKindOfかなぁ
442 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 21:14:15 ] 関数は知らないけどapiならある
443 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 21:53:50 ] 質問です。 タスクトレイにアイコンを格納しようと思っているんですが、タスクトレイに表示されるアイコンが32ピクセルのアイコンになってしまいます。 タスクトレイに表示されるアイコンを16ピクセルのアイコンにするにはどうすればいいんでしょうか? //SetIcon(m_hIcon, TRUE); ← タスクバーのアイコンが16ピクセル、タスクトレイのアイコンが32ピクセルになる //SetIcon(m_hIcon, FALSE); ← タスクバーのアイコンが32ピクセル、タスクトレイのアイコンが32ピクセルになる m_iconData.cbSize = sizeof(NOTIFYICONDATA); m_iconData.uID = TRY_ID; m_iconData.hWnd = m_hWnd; m_iconData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; m_iconData.hIcon = m_hIcon; m_iconData.uCallbackMessage = TRY_MESSAGE; lstrcpy( m_iconData.szTip, "***" ); ::Shell_NotifyIcon( NIM_ADD, &m_iconData );
444 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 22:13:32 ] いまいちよく判らんけど、LoadImageで取り出す大きさを明示的に指定すれば良いんじゃね?
445 名前:443 mailto:sage [2008/09/30(火) 03:00:33 ] >444 LoadIconで2種類のサイズのアイコンを取得していると思っていたんですが、LoadImageで取得する必要があるのでしょうか? 今はこうやってアイコンを取得しています。 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
446 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:07:47 ] あまり関係ないかもしれないけどLoadIcon()って非推奨じゃなかったっけ
447 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 09:44:39 ] LoadIcon()は昔からある固定サイズの1種類しかとれないよ。
448 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:42:14 ] MFCのウィザードが吐き出すコードで SetIcon(m_hIcon, FALSE) ってあるけど、32x32のアイコンを16x16に縮小して表示するだけで、 16x16のアイコンを読み出して表示しているわけでは無かったりする。 DestoryIcon呼ぶの('A`)マンドクセ、ってのが理由だろうな。
449 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 22:44:16 ] LoadIcon非推奨ってことは16×16のビットマップで描画したほうがよかったりするんだろうか? アイコン使うメリットってなんだろ?
450 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 14:45:03 ] メンバのCArrayを戻り値として返したいんですけど CArray<〜*, 〜*>& GetData() { return( m_arrData ); } だと、コンパイル時にprivateにアクセスしています。みたいなメッセージが表示されます。 (他のクラスからアクセスしてる) どのように書くのが正しいのでしょうか…
451 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 14:49:35 ] 自己解決しました…
452 名前:443 [2008/10/03(金) 00:29:16 ] 返信が遅くなってすみません。 >446-449 ということは16x16と32x32のアイコンをそれぞれロードする必要があるということでしょうか? また、16,32,48ピクセルのアイコンをそれぞれ出力するにはどうすればいいんでしょうか?
453 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 07:56:31 ] 自分でLoadImage使うって書いてるじゃない
454 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 09:55:19 ] >m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); これと同じように、 m_hSmallIcon = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME),IMAGE_ICON,16,16,LR_DEFAULTCOLOR); とかやればよし。
455 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 13:28:01 ] >>440 GetClassName API
456 名前:デフォルトの名無しさん [2008/10/05(日) 12:31:57 ] age
457 名前:443 mailto:sage [2008/10/05(日) 14:32:49 ] >453-454 無事アイコンの使い分けが出来るようになりました。 ありがとうございました!
458 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 21:06:35 ] iniファイルをexeのところに作ろうとしてますがうまくいきません。なぜ。。。 App::InitInstance() { WCHAR dir[MAX_PATH]; ::GetModuleFileName(NULL, dir, MAX_PATH); wchar_t* pdest = wcsrchr(dir, _T('\\')); pdest[1] = '\0'; ::SetCurrentDirectory((LPCTSTR )dir); wcscat_s(dir, _T("XXX.ini")); free((void*)m_pszProfileName); m_pszProfileName = _tcsdup(dir); }
459 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 21:30:40 ] 何がうまく行ってないか不明だし、 そこまでできてたらデバッガで調べるだろ
460 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 21:42:49 ] CWinApp::SetRegistryKeyを後で呼び出していたら笑う。 デバッガでステップ実行すれば、正しいパスが渡せているかどうかは一発だな。
461 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 21:43:13 ] ところで、これはMFCになんか関係あるのか?
462 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 21:49:12 ] m_pszProfileName m_pszProfileName がMFC
463 名前:デフォルトの名無しさん [2008/10/11(土) 21:59:13 ] CStringって普通のStringじゃだめなのか?
464 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:04:39 ] CStringを使うのが普通
465 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:04:55 ] デバッガ上では dir にexeまでのパスが入っておりxxx.iniもセットされてますが 実際、ファイルは出来上がっていない。しかし、GetProfileStringでデータは取れるという状態
466 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:31:21 ] レジストリ使ってるわけじゃなくて?
467 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:52:14 ] 簡単に変更でききるようにiniついたかったんですが
468 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:56:44 ] >>466 コードに書いてるのは、GetProfileStringなのか? ぐぐり直したほうがいんじゃねーのか?
469 名前:468 mailto:sage [2008/10/11(土) 22:57:47 ] >>466 でなくて>>465 の間違い。 すまねぇ。
470 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 23:31:17 ] Win32APIの同名APIを呼んでいる可能性があるかも。 WriteProfileStringなんか引数が全く同じだし。
471 名前:463 mailto:sage [2008/10/11(土) 23:34:38 ] >>464 ありがとう><;まだ、MFCはじめたばかりなので、習ってCString使っていこうと思います><; ただ単に慣習的なもののような気がしますが。
472 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 23:58:42 ] >470 愛してる そのまま使うとレジストリ保存だった。 正しくはWritePrivateProfileString() で最後に保存先指定でいけた
473 名前:472 mailto:sage [2008/10/12(日) 00:36:16 ] >468 も愛してるよ〜
474 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 02:17:50 ] >>472 愛は要らんから、CWinApp側のメソッドを使ってやろうぜ。 MFCだと、普通はCWinApp派生クラスがtheAppとしてグローバルで宣言されているはず。
475 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 04:27:45 ] ダイアログの中のCStaticコントロール上のOnMouseMoveイベントを取得したいのだけど、どうすればいいのだろうか? だれか教えてください。
476 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 04:30:12 ] そのCStaticをクラス化して、その中で受け取るか ダイアログ側のクラスで、CStaticのハンドルを指定してOnMouseMoveを受け取ればいい どっちが綺麗かと言われると、ときと場合によるけど、前者の方がいいかな
477 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 05:43:56 ] たぶんコントロールがIDC_STATICのままなんだろ
478 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 12:12:43 ] なるほどIDC_STATICじゃ出来ないな 固有の名前をつけないと
479 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 08:06:30 ] >ダイアログ側のクラスで、CStaticのハンドルを指定してOnMouseMoveを受け取ればいい こちらの方法をもう少し詳しく教えてもらえないだろうか。 ON_WM_MOUSEMOVE() と void CFooDlg::OnMouseMove(UINT nFlags, CPoint point) のセットで間に合うモノなんだろうか? コントロールのIDはもちろんユニークなモノを付けている。
480 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 10:14:38 ] PreTranslateMessageかなぁ
481 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 11:24:09 ] 479です。 ごめんなさい。問題解決しました。 今までクリックを検出するためにnotifyをtrueにしていたため、OnMouseMoveでは コントロール領域のMouseMoveが取得できなかっただけでした。
482 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 20:11:56 ] ID_FILE_OPENなどが選択された際、 それがメニューからか、ツールバーからか、アクセラレータからか などをコマンドハンドラ内で調べられませんか? MFC内の隠し関数とかでも構わないのですけど。 コマンドハンドラまで来てしまったら絶対に区別できないですか?
483 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 21:09:11 ] 区別する必要があったら区別できるように作ればいい。
484 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 21:12:19 ] ID_FILE_OPEN_1とかID_FILE_OPEN_2とか作って、ラッパー経由とか?w
485 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 21:43:28 ] >>482 WM_COMMANDにそういうパラメータあったはずだから調べてみなさい。
486 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 21:01:29 ] >>483-485 CWnd::GetCurrentMessage()を使って WM_COMMANDの付加情報からコマンド発生元を取れました。 ありがとうございます。
487 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 17:54:12 ] CListCtrlレポート形式で たくさん表示させると重いです 何か回避方法はありますか?
488 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 17:57:51 ] 仮想リストビューとか
489 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 17:59:14 ] こういうやつね 仮想リストコントロール ttp://msdn.microsoft.com/ja-jp/library/ye4z8x58(VS.80).aspx
490 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 18:34:18 ] >>488-489 ありがとうございます。 心持ち軽くなったような気がするけどやっぱり重いです これって LVS_OWNERDATA で作成して 描画する文字列の部分を自分で割り当てるってことでいいんですよね。 仮想リストビュー www.hokuriku.ne.jp/ymyamada/mfc/VirtualList.htm ここも参考にしました。 やりかたまちがえてるのかな^^;
491 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 18:39:04 ] >>490 更新すべき場所だけ更新すればOK 普通のリストだと表示部分全てに更新がかかるから重いだけ。
492 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 23:49:31 ] ダイアログAに ラジオボタン1 ラジオボタン2 が設置されていて、この二つのラジオボタンがグループで、 2を押したら1のチェックが外れるとします(逆もあり)。 今、2を押して、1のチェックが外れました。 ダイアログAのWindowProcにはラジオボタン1のコントロールIDで何かしらのメッセージが 飛んでくるのでしょうか? ちなみに自分で試してみたところだとどうも飛んでこないようなのです。 ではラジオボタン1のチェックが外れた!というイベントをダイアログA上でキャッチすることはできないのでしょうか?
493 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 10:21:36 ] (コントロール変数).GetCheck(); で調べればよろし。 チェックのON/OFFを手動にすれば、チェックをつけなおす前に以前の状態を調べればチェックが外れたかどうか調べれる。
494 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 10:22:25 ] >>492 「ラジオボタン2が押された」→「ラジオボタン1のチェックが外れた」 でいいじゃん。
495 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 11:24:17 ] メッセージは飛んでるよ WindowProc使った方法は知らん
496 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 13:10:47 ] >>493 >>494 説明が足りませんでしたが事情によりチェックが外れた瞬間のイベント駆動の処理が必要なんです まだチェックオンの瞬間は、オンクリックで拾うことはできますが、 ラジオボタンの場合、他のボタンを押したときに勝手に外れるので、オンクリックでは拾えず また、SetCheck関数などで変更されたときもオンクリックでは拾えませんし悩んでます。 クリックから、関数から、などの入力方法に関わらず、とにかく「チェックが切り替わったとき」の イベントが欲しいのです… 例えばエディットボックスなら内容を変更されたときのイベントを取れるとおもうんですが、 考えてるのは「今変わった!」というのがわかる、そんなイメージです… >>495 どういったメッセージか、もしわかればヒントだけでも教えてください>< できるだけ自分で調べるつもりですので
497 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 13:16:17 ] オンクリック→正確にはBN_CLICKEDです
498 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 17:36:14 ] >>496 ttp://msdn.microsoft.com/en-us/library/cc678956.aspx
499 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 18:11:09 ] >>496 >ラジオボタンの場合、他のボタンを押したときに勝手に外れるので ラジオボタンのプロパティでそういう風に設定しているからだろ。 リソースでラジオボタンをダブルクリックしたときに作られる関数で、 SetCheckする前にチェックの状態が変わったかどうか自分で調べれば解決。
500 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 20:45:55 ] >>494 と似た考え方だが とりあえずそのグループのラジオボタンのイベントを一箇所で捕まえて 今回選択されたラジオボタンと前回で選択されたラジオボタンが異なっていたら、 「前回選択されたラジオボタンのチェックが外れた」 と考えればいいと思う。 なんとなく>>496 はWindowProcとか言ってるからMFCじゃない気もするが、 MFCならON_COMMAND_RANGE使って10行も必要ないから とりあえずダメ元で試してみたら?
501 名前:名無し募集中。。。 mailto:sage [2008/10/18(土) 23:14:23 ] 話それるけどON_COMMAND_RANGEで扱うために リソースIDを連続させるためにresource.hを編集しちゃう俺はヘタレですか?
502 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 03:21:49 ] いいんじゃない? ID指定するとき、=つけて数値指定できるけど、面倒だもんね。
503 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 22:43:58 ] ON_COMMAND_EXを使えば、IDを引数にとるハンドラを作れるから、 リソースIDが飛び飛びでも一つのハンドラにまとめられるけど、 こっちはあまり使われないのかな。
504 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 11:17:02 ] MFCを使う標準DLLを作成すると CWinAppを派生したアプリケーションクラスが用意されますが、 これはDLL内の単独のスレッドというわけではないのでしょうか? OnIdle()をオーバーライドしてもコールされないのですが。
505 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 18:20:07 ] んー、そのままだと自分のメッセージループは使わないからな。
506 名前:デフォルトの名無しさん [2008/10/21(火) 19:20:58 ] すみません。他で聞いても返事が無いのでここできかせてください。 VC6で本の通りにブラウザとかつくりました。VC6の生成するブラウザだから いまどきのWebページは開けないだろうと思っていたんですが、普通にうまくひらけました。Flushとかもです。 これは、VC6とはいえ、ブラウザエンジン?はいまどきのPCの最新のを(要するにIE7のを) 作成してくれるのでしょうか? よろしく教えてください。
507 名前:506 mailto:sage [2008/10/21(火) 19:34:59 ] 元のスレを今見たら、今日の夕方に返答がきてました。 解決したので、>>506 はスルーしてください。
508 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 02:18:54 ] SDIでグラフ描画するソフトを作ろうとしてるんですが ViewのOnDrawで縦軸横軸を引いて その上にグラフを描画する方法がわかりません。 どなたか、わかる人教えてください。
509 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 06:44:33 ] どこまでわかっててどこからわからないの?
510 名前:デフォルトの名無しさん [2008/10/23(木) 15:16:36 ] VC6で、_MBCSを使い、日本語と英語のプログラムを作っています。 一つのEXEで問題なく、 日本語Win上では、日本語のダイアログ、 英語Win上では、追加した英語のダイアログが表示されたのですが、 現在選択しているリソースが日本語か英語か知りたいのですが、 プログラム実行時、 英語日本語のリソース切り替え選択はどの値を見て読み替えてるのでしょうか? GetSystemDefaultLangID() 辺りは、コントロールパネルによって変化しているのは確認したのですが、 リソース読み替えとは関係ない様でした。 GetACP() , GetVersionEx()でも取得はできませんでした。 ご存知の方、ヒントだけでも御教授下さい。 よろしくお願いします。
511 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 15:32:35 ] GetSystemDefaultUILanguageとかGetUserDefaultUILanguageあたりかね? でも自分でFindResourceExする必要はある気がする。
512 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 15:44:51 ] って動的に切り替えるのが目的じゃないのか
513 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 16:21:45 ] ありがとうございます。 GetSystemDefaultUILanguage も調べていたのですが、これはVC7以降のAPIの様です。 多分ですが、 GetSystemDefaultLangIDと同様、コントロールパネルのロケールIDを返すのではないかと思います。 コントロールパネルからロケールIDは変更できるのですが、 実行時に使用されるリソースは変化ありませんでした。 現在の状態が知りたいだけですので、動的に読み替える必要は今のところありません。 どうしても・・・となれば、リソースに番号振って、プログラム中から判定するという方法もあるのですが、 Kernel32あたりで、どう判断しているのかが知れればと思った次第です。
514 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 16:26:19 ] winnls.h インクルードして使えないか?
515 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 16:29:43 ] そもそもAPIなのにVC7以降、とか関係ないでしょ。 インポートライブラリにもヘッダーにもないのなら作ればいいし。
516 名前:513 mailto:sage [2008/10/23(木) 18:13:02 ] >>515 karnel32.libに無いので、呼べないのかと思ってました。 karnel32.dll をLoadLibraryして呼び出すことができました。 結果、 ・日本語Win GetSystemDefaultUILanguage() = 1041 GetUserDefaultUILanguage() = 1041 ・英語Win (XP-Pro SPなし) GetSystemDefaultUILanguage() = 2011628553 GetUserDefaultUILanguage() = 1033 と、 コントロールパネルに影響されないGetSystemDefaultLangID()と同じ値が取得できました。 ただ、リソース読み替えに使われているのかは不明なのと、 英語Winで、GetSystemDefaultUILanguageが不思議な値を返してくるのですが、 とりあえずは目的を果たせそうです。 助かりました。ありがとうございました。
517 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 18:18:39 ] その不思議な値、16進で0x77E70409だね。 下16ビット、0x0409は10進で1033だから上と下で別々に意味もってるのかも。
518 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 19:16:01 ] GDI系のAPIの基本の話か?w
519 名前:513 mailto:sage [2008/10/23(木) 19:27:20 ] >>517 LANGIDFROMLCIDマクロを使ったところ、下位だけ抜けました。 言われるとおりのHEXで見るべきでした。 WINNT.H には、上位16bitは、Reserved、SortIDとコメントがありましたから、 Reservedは不明ですが、何か意味はありそうですね。
520 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 00:46:43 ] CMyDialog mydlg; if ( dlg.doModal() ){
521 名前:名無し募集中。。。 mailto:sage [2008/10/24(金) 13:39:41 ] DoModal()じゃねぇのか? 返り値はIDOKじゃないのか? そもそもmydlgじゃないdlgって何者?
522 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 16:49:40 ] CheckBoxの表示手法について教えて下さい。 通常はプロパティのCaptionで設定されている文字を表示させておいて 途中で文字の代わりにアイコンを表示させたいと思ってます。 最初からCheckBoxにアイコンを表示させる事はできてるのですが、途中で テキストからアイコンへの変更ができません。 途中から変える事は無理なのでしょうか? HINSTANCE hInst = AfxGetInstanceHandle(); HICON h_Icon1 = (HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_ICON1),IMAGE_ICON,128,128,LR_DEFAULTCOLOR); m_Check1.SetButtonStyle(m_Check1.GetButtonStyle() | BS_ICON); m_Check1.SetIcon(h_Icon1);
523 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 17:48:42 ] ボタンスタイルは | でつなげても意味ないぞ。 m_Check1.SetButtonStyle(BS_ICON); でもウィンドウサイズも変えないとアイコンの大きさにはならないかもな。
524 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 17:53:27 ] つーか、チェックボックスでかつアイコンというのが無いのか
525 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 19:36:32 ] ボタンみたいに動くものじゃないんだから 絵や文字と一体化してる必要ないし、 隣に自分で絵や文字書いても何の問題もない。
526 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 19:42:59 ] そんなにチェックボックスにアイコン使いたいなら擬似的に実現したクラス作ればいいじゃん
527 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 18:07:01 ] 子ウィンドウとしてダイアログを利用しているのですが、 起動時、非表示にしたいのです。 CDialog dlg; dlg.Create( IDD , this ); dlg.ShowWindow( SW_HIDE ); とやっているのですが、 一瞬表示されるのです。 OnInitdialogで ShowWindow( SW_HIDE ); と記入しても。 回避できませんでした。 他に方法はありますか?
528 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 18:26:03 ] 子ウィンドウってメインじゃないってこと? ダイアログエディタでVisibleの初期値をfalseにしてもだめかな?
529 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 18:35:43 ] >>528 いけました ありがとうございます><
530 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:08:11 ] MFC 9.0って、どこでダウンロードできますか?
531 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:48:43 ] できません。 standard以上を買ってください。
532 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 20:08:26 ] >>531 ありがとうございました。 しつこい質問で申し訳ないですが、今少し困っていることがあります。 当方 Visual C++ Express 2008 OS XP SP2 を使用していて、C++によってSQL Serverへの接続を試みています。 しかし、CDatabase db; のところで躓いてしまっています。 よく調べたところ、#include "afxdb.h" を使用する必要など があるようで、更に調べたところ、MFCが関係していると知りました。 そこで、このスレの本質に従う質問をしたいと思います。 MFC9.0が使用できないことは分かりました。 MFCのシリーズで無料で(違法ではなく、公式な方法で)使用が可能な 方法はありませんか? また、MFCがない場合 #include "afxdb.h" や CDatabase db; などは、自分で1から記述しなければならないのでしょうか? (初心者のため、バカなことかもしれませんが、ライブラリ にはないため、自分で定義しなくてはならないのでしょうか?) 長文の上、稚拙な文になってしまいましたが、躓いてしまっている ので、ご助力を加えて下されば幸いです。 よろしくお願いします。
533 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 20:25:42 ] CDatabaseを使用しないでDBにアクセスしなきゃなんないよ。 CDatabaseは C++ からODBCを介してSQL-Serverにアクセスするもので、 CDatabaseはMFCのクラスで、あなたは利用できないから、 ほかの手段を探すことになる。 ODBCの代わりにOLE-DBを使うこともできるし、 今からDBの勉強はじめるならこちらをお勧めする人が多いと思う。 "C++ OLE-DB SQL-SERVER アクセス"あたりのキーワードでぐぐればいいんじゃないかな。 というわけで、さようなら。
534 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 20:36:51 ] >>533 ご教授ありがとうございました。 貴重なお時間を割いていただき、申し訳ございませんでした。
535 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 02:30:04 ] 質問しつれいします。 vc 2005 MFCを使ってGETやPOSTでデータを送信するプログラムを作成しようと思います。 勉強になるサイトなどありませんか? 検索のヒントでもいいので宜しくお願いしまっす
536 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 05:29:15 ] つWinInet
537 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:18:14 ] >>535 WebProg板
538 名前:535 mailto:sage [2008/11/02(日) 18:19:43 ] >>536 ありがとうございます そのキーワードを頼りに自分なりに調べてやってみます >>537 すいません板違いでしたかー
539 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:22:36 ] 検索のヒントを提示しただけ。鼬害かどうかは白根。
540 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:04:18 ] MFCのクラスを使うんなら、使えそうなクラスぐらいすぐ見つかると思うが MFCのクラスを使わずにやるんならスレ違い
541 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:16:10 ] >>540 いやぁMFCのクラスを使いたいのですが・・・ んー検討つかないんです 検索ワードだけでもヒントをぉぉぉぉぉ・・・orz
542 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:31:30 ] msdn.microsoft.com/ja-jp/library/173ckzza.aspx MFC ライブラリ リファレンス インターネット クライアント アプリケーションの作成用の MFC クラス 更新 : 2007 年 11 月 MFC には、インターネット クライアント アプリケーションを作成するための以下のクラスとグローバル関数があります。
543 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:44:46 ] >>542 ありがとうございます!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
544 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:44:58 ] とりあえず、この辺一通り眺めといた方がいいかもね。 MFC > 階層図 msdn.microsoft.com/ja-jp/library/ws8s10w4.aspx
545 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 02:18:47 ] >>544 本当にありがとうございます・・・ 階層図・・・目から鱗です・・・
546 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 10:30:14 ] xp sp2 VS2005 CString GetString(void) { CString strTemp; strTemp = "1234"; return strTemp; } void Main(void) { CString strHoge; CString strValue; strValue = GetString(); strHoge.Format("%08s", (LPCTSTR)strValue); strValue = GetString(); strHoge.Format("%s%08s", (LPCTSTR)strHoge, (LPCTSTR)strValue); // 以下略 } という感じの処理をするとFormatで落ちてしまうのですが、 何故なのでしょうか? あと CString でイメージ検索するとエr
547 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 10:51:26 ] >>546 CStringT::Format -------- 文字列オブジェクト自体をパラメータとして Format に渡すと、呼び出しは失敗します。たとえば、次のコードの結果は保証されません。 CAtlString str = "Some Data"; str.Format("%s%d", str, 123); --------
548 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 11:08:54 ] >>547 その下に ---------- オプションの引数として文字列を渡すときは、LPCTSTR に明示的にキャストしてください。 書式は、printf 関数の書式引数と同じ機能を持っています。(書式や引数の説明は、 『ランタイム ライブラリ リファレンス』の「printf」を参照してください)。 書き込まれる文字列の終わりには NULL 文字が追加されます。 ---------- とあったのですが、これはそもそも>>546 の中でいう strValue のことであって、 自身を引数に指定するのはキャストしようが何しようがダメってことなんですよね?
549 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 11:36:26 ] >>548 ttp://msdn.microsoft.com/ja-jp/library/18he3sk6(VS.80).aspx のほうには書いてないけど、 その説明は「キャストすれば自分自身を渡せるよ」ということでは無いと思う。 CStringTに書いてないということは昔はそういう制限でもあったのか、 それとも「CString::operator intなどを追加するかもしれないから、 LPCTSTRも明示的にキャストして渡しておけ」という意味じゃないだろうか。
550 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 12:52:46 ] const char*へのキャストは、operatorで内部のバッファ返してるだけ。 Format中に元のバッファが変わったら長さがかわるからバッファ足りなくなる。
551 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 14:19:28 ] >>547 >>549 >>550 なるほど、ありがとうございました。 ちなみに>>548 の文は ttp://msdn.microsoft.com/ja-jp/library/18he3sk6(VS.80).aspx では無くなっちゃってるみたいですが、 VC6付属のMSDNに書かれていた文章です。
552 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 20:41:35 ] C#やった後にこれやると、 GUI画面作成、メッセージ処理、メモリ管理、例外処理とか泣けてくるな… まあでも刺激はあるからいいか…
553 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 13:07:49 ] 質問いいかな? 以下のようなプログラムでスレッド起動してスレッド終了を見ようとしているんだが、 WaitForSingleObject関数で毎回タイムアウト発生…理由分かる人いる? void CMainClass::Start() { g_pThread = AfxBeginThread(Test, GetSafeHwnd(), THREAD_PRIORITY_NORMAL); g_pThread->m_bAutoDelete = FALSE; } UINT Test(LPVOID pParam) { while(!g_Flg){ // ここで処理 // } return 0; } void CMainClass::Stop() { g_Flg = TRUE; ULONG ret = WaitForSingleObject(g_pThread[0]->m_hThread, 10000); delete g_pThread; }
554 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 13:09:15 ] ULONG ret = WaitForSingleObject(g_pThread->m_hThread, 10000); の間違い。配列はなしね。 なお「g_」をつけているのはグローバル変数
555 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 14:12:14 ] Test関数でちゃんと動いてる? サスペンド中だったりしない?
556 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 14:38:07 ] >>555 いま調べているんだけど、タイムアウトの10000ms以内には 絶対に終わるはずなんだけどなー。 でもそれが疑わしいか… 回答してくれてありがとん。
557 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 14:46:42 ] とりあえず>>553 のまんま動かしてみたけど、WAIT_OBJECT_0でした。 原因はそこ以外にある?
558 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 14:57:53 ] >>557 自分でもやってみたら確かに動いたんだよね。 Test()の処理部分に原因がありそうなのは間違いない。 (ここで10秒かかるってのは考えにくかったからここで質問させてもらったけど) お騒がせさせてすまんかった。 >>557 もありがとん
559 名前:名無し募集中。。。 mailto:sage [2008/11/13(木) 15:24:33 ] threadのreturn 0にブレイクポイントを置いてみるとか
560 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 16:11:23 ] >>553-554 だが、新たな発見。 Test()の処理部分に処理回数をカウントアップして、 Editボックスに毎回その値を表示する処理として SetWindowTextを使っているんだけど、 Stop関数をコールした後、どうもそこで固まるらしい。 (SetWindowTextをコメント化したら問題がでなくなった) …意味分からん。なんで最後の1回のSetWindowTextで固まる!?
561 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 16:17:20 ] 具体的には ULONG num; //処理回数 CString str; str.Format("%d", num); EditBox->SetWindowText(str); とこんな感じ。 もちろん、メインウィンドウのハンドルはもらってきて、 使っている(その部分は省略しているけど)
562 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 16:50:11 ] そりゃあそのSetWindowTextで呼んでるスレッドはもうWaitForしてるからだろ。
563 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 16:53:40 ] SetWindowTextはSendMessageを呼んでる。 メインスレッドのメッセージループでそれを受け取らない以上、SetWindowTextからは返ってこないよ。
564 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 17:00:11 ] あ、そういうことか!言われてみれば激しく納得w >>562-563 ありがとん
565 名前:デフォルトの名無しさん [2008/11/14(金) 06:39:27 ] SDKを使わないでMFCアプリケーション作る方法を解説してるサイトはないでしょうか?
566 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 06:41:17 ] SDKじゃんくてIDEでした
567 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 08:09:46 ] リソースエディタとコマンドラインからコンパイラを動かすってことかな?
568 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 08:39:36 ] >>567 そうです。 ウィザードの吐き出すコードの解説と、リソースエディタの使い方が解説してあるサイトや本なんかが あればいいなあ、と。
569 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 08:56:25 ] というかMFC詳しい人ってAFX*.Hに宣言されてるクラスを全部覚えてるのか・・・ ウィザードの吐き出すコードの前に、ここを熟読して出直してきます
570 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 23:08:06 ] >>569 覚えてないよ。ただ、よく使うクラスは限られるし、自分で使い勝手の よいMFC派生クラスのライブラリを用意してあるので、それをプロジェ クトに読み込んで使うことの方が多いな。 慣れてくると、ウィザードがどんなコードを吐き出すか判るので、既存の テキトーなクラスの.cpp/.hをコピー&リネーム&文字列置換して、新しい クラスの雛型にして、あとは全部手で書いている。 VC++ 6.0は、クラスウィザードがコード挿入位置を知るために使う特別な 書式のコメントがあるけど、これもクラスウィザードがコード生成したのと 同じように書いている。 その後、一度.clwファイルを消してからクラス ウィザードを起動して.clwを再構築させれば、手で書いたクラスもちゃんと クラスウィザードで認識させられる。
571 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 12:42:17 ] >>561 こういうの見るとSetDlgItemInt使えといいたくなる。
572 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 14:36:25 ] VS2008SP1のFeature Packで機能増えたけど、 新機能使うとレジストリでなくてiniファイルに保存・読み込みできないのだが(´ω`)・・トホー
573 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 15:56:10 ] >>571 素人さんですかw
574 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 17:45:43 ] >>573 玄人がSetDlgItemInt使わない理由とかあるの?
575 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 19:25:39 ] ダイアログを操作したいわけじゃないのに ダイアログに委託しているところ
576 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 23:01:11 ] 素人・玄人の話ではなくて、 今回の場合、ワーカースレッド側からだとSetDlgItemIntを使いようが無いってだけだな。 コントロール変数とかで持っていても、値をテキストとして設定したい時は、 地味に便利なメソッドだったりする。
577 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 01:34:50 ] また変なのがわいてきたな ひっこんでろタコ
578 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 01:59:29 ] >>576 素人さんですかw
579 名前:576 mailto:sage [2008/11/16(日) 14:52:37 ] >>577 タコでさ〜せんwwww >>578 素人さんですかの人、こんにちはだお
580 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 02:50:44 ] CWnd::SetWindowText()も、CWnd::SetDlgItemText()も、CWnd::SetDlg ItemInt()も、単純にAPIのラッパだし、ワーカスレッドからでもなんら 問題なく呼べるだろ。 ダイアログのポインタが嫌なら、ハンドルとAPI直接呼び出し使え。 ::SetDlgItemText(this->m_hWnd,IDC_EDIT1,...); ::SetDlgItemInt(this->m_hWnd,IDC_EDIT1,...);
581 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 22:09:37 ] MFCスレでAPI直接呼び出し薦める奴って何なの?
582 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 22:22:44 ] と言われても、割と普通の事だしなあ。 というか、おまいら今回の話はUIスレッドがスレッド終了待機に入った所為で、 UIスレッドへのSendMessageがデッドロックした、っていう事完全に忘れてるだろ。
583 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:00:19 ] というより、スレッドとか、ハンドルがクラスで継承されていかないところでは、 Win32APIを直接叩く以外無いよな。 脱線すまん
584 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:09:04 ] 隠ぺいしている部分は出来るだけ利用するな でもGDIだけはベタ書きしてしまう俺 それ自体をクラス化するんだけどな
585 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 21:59:29 ] >>583 MSDNにはHANDLE渡して該当するFromHandleを呼び出す、とあるから オブジェクトは渡せないけどMFCで行けるんじゃない? 個人的にはしないけどね。
586 名前:名無し募集中。。。 mailto:sage [2008/11/18(火) 22:07:02 ] 都合のいい時だけMFCを使うってスタンスなのでWin32APiは普通に呼ぶ
587 名前:デフォルトの名無しさん [2008/11/19(水) 13:37:26 ] モーダレスダイアログでボタンを押すと m_cdlg = new CDlg(this); m_cdlg->ShowWindow(SW_SHOW); みたいな感じで表示するとボタンを押せばいくつでもダイアログが出てしまいます。 1つしか出さないにはどうしたらいいでしょうか? あと、親クラスの関数でモーダレスダイアログを扱うことはできますか? XP+VC.netです。
588 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 13:53:44 ] >>587 その2行を通るたびに new で作ってんだから、そりゃいくつでも出るでしょう。 そのボタン貼ったウィンドウの初期化部分で一回だけ作って、 ボタン押したときに ShowWindow すればいいんじゃね? >親クラスの関数でモーダレスダイアログを扱うことはできますか? ちょっと意味が解らんかった。
589 名前:デフォルトの名無しさん [2008/11/19(水) 14:10:21 ] delete thisをモーダレス内でしているので、親ウィンドウではモーダレスの終了を検知出来ないですよね? モーダレスが終了した後なら、もう一度ボタンを押したときはモーダレスを表示したいのですが・・・。 モーダレス上のボタンを押したときに親ウィンドウの変数や関数をいじりたいのですが。
590 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 14:18:24 ] クラスメンバ private: CUnkoDlg m_dlg; Initidialog m_dlg.Create( CUnkoDlg::IDD , this ) OnButton m_dlg.ShowWindow( SW_SHOW )
591 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 14:29:49 ] モーダレスではなくモードレスですよ。
592 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 14:30:44 ] モーダルに対してなのか、モーダレスと言う人は非常に多い
593 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:14:06 ] 青信号に対してなのか、赤信号で渡る人は非常に多い
594 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:40:22 ] >>589 自分でWM_NOTIFYして親に通知して、実処理は通知先で
595 名前:名無し募集中。。。 mailto:sage [2008/11/19(水) 17:12:27 ] >>589 モードレスダイアログに親のthisを渡してpublicな操作をしてもらう事はたまにやる 終了時には 『m_cdlg = new CDlg(this); 』のm_cdlgもNULLにして終わらせる たぶんあんまり行儀が良くないと思う
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関数だけで 削除は親に全部まかせるのがいい気がします
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は持ってるが