■MFC相談室 mfc14d.dll■
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/07/13(水) 05:28:44■MFC相談室 mfc13d.dll■
http://pc8.2ch.net/test/read.cgi/tech/1110179996/
■ MFC相談室 MFC12.dll■
http://pc5.2ch.net/test/read.cgi/tech/1096848771/
■MFC相談室 mfc11.dll■
http://pc5.2ch.net/test/read.cgi/tech/1088084875/
■ VisualC++(MFC限定)相談室 MFC10.dll■
http://pc5.2ch.net/test/read.cgi/tech/1074104008/
■ VisualC++(MFC限定)相談室 MFC9.dll■
http://pc5.2ch.net/test/read.cgi/tech/1062098350/
■ VisualC++(MFC限定)相談室 MFC8.dll■ (スレタイ壊れているけど前スレ)
http://pc5.2ch.net/test/read.cgi/tech/1056584836/
■ VisualC++(MFC限定)相談室 MFC7.dll■
http://pc5.2ch.net/test/read.cgi/tech/1047949606/l50
■ VisualC++(MFC限定)相談室 MFC6.dll■
http://pc5.2ch.net/test/read.cgi/tech/1039607377/
■ VisualC++(MFC限定)相談室 5■
http://pc3.2ch.net/tech/kako/1028/10285/1028553308.html
■ VisualC++(MFC限定)相談室 4■
http://pc3.2ch.net/tech/kako/1021/10216/1021620974.html
■ VisualC++(MFC限定)相談室 3■
http://pc.2ch.net/tech/kako/1014/10140/1014057520.html
■ VisualC++(MFC限定)相談室 2■
http://pc.2ch.net/tech/kako/1008/10080/1008031675.html
■ VisualC++(MFC限定)相談室 ■
http://pc.2ch.net/tech/kako/989/989902845.html
0446デフォルトの名無しさん
2005/09/01(木) 12:50:01じゃだめなの?
0447デフォルトの名無しさん
2005/09/01(木) 12:52:20ttp://www.microsoft.com/japan/msdn/library/ja/vclib/html/_crt_scanf_width_specification.asp
0448デフォルトの名無しさん
2005/09/01(木) 22:34:13CStringに十分なバッファを確保してからなら大丈夫そうだが
0449デフォルトの名無しさん
2005/09/01(木) 22:46:020450425
2005/09/01(木) 23:12:05現状、原因不明というのが頭痛の種。
ダイアログタイトルの方は、タイトルの形式が違うときに誤動作した模様。
#%*sで期待した空白が2バイト文字だったとさw
なので、sscanf()の戻り値で逃げるか2バイト空白に対応するかと言う落ちに。
>>446>>449
タイトルの一部を切り抜くのが目的だから、タイトル(foo)から文字列を一個読み飛ばしたりすうちを読み飛ばすから
それだけの長さは必要ないというロジック。従って、+1する必要はない。
>>448
CStringはconst char *へのcastオペレータを持ってますから。
つーか、なんか勘違いしていない?
結論。一部ヒントになった以外は情報収集にはなりませんでしたとさ。
協力感謝。
0451デフォルトの名無しさん
2005/09/01(木) 23:18:53const char *じゃなくてLPCTSTR(つまりconst TCHAR *)じゃないか?
0452デフォルトの名無しさん
2005/09/01(木) 23:20:17char* p = new char[...];
CString s = p; // GPF!
delete [] p;
ということ?原因不明も何も・・・
0453デフォルトの名無しさん
2005/09/02(金) 00:15:15原因解明協力してた人カワイソス
0454デフォルトの名無しさん
2005/09/02(金) 00:48:52だなw コンパイルオプションも書いてねーしどでもいいがな
0455デフォルトの名無しさん
2005/09/02(金) 01:36:200456デフォルトの名無しさん
2005/09/02(金) 02:00:16忍ばせておいたほうがいいのでしょうか?友達に聞いたら財布によっては跡がつくから
気をつけるべしと言われました。
環境はXP SP2、VC++6.0、DirectX SDK9.0 Summer2004です。
0457デフォルトの名無しさん
2005/09/02(金) 09:37:41スレ違い。
Win32APIスレへ。
0458デフォルトの名無しさん
2005/09/02(金) 12:09:58VC++7.1でnewで得たポインタの0チェックをしているソースがあるのですが、
ダイアログを生成している元の関数ではbad_allocを受け取るように書かれています。
MFCでは(あるいはVCでは)ただnewと書いた場合にはどっちになるのでしょう。
0を返すならbad_allocに落ちてこないと思うのですが・・・
0459デフォルトの名無しさん
2005/09/02(金) 12:41:59MFCならどっちも間違い。
CMemoryException*が投げられる。
0460デフォルトの名無しさん
2005/09/02(金) 12:46:34―――――――――――――‐┬┘
____.____ |
| | | |
| | ∧_∧ | |
| |( ・∀・)つ ミ |
| |/ ⊃ ノ | | CMemoryException*
 ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄ |
|
0462デフォルトの名無しさん
2005/09/03(土) 06:27:57やりたい事は一応できるのですが、解せないことについて御教示下され。
[できてる事]
呼出し元でダイアログをnewして ->Create(...)。
ダイアログをバツ(OnClose)で閉じ、PostNcDestroyでdelete thisし自殺
[わからない事]
呼出し元のメンバでダイアログのオブジェクト(実体)を保持し、.Create。
ダイアログをバツ(OnClose)で閉じる。この時、OnCloseをオーバーライド
して、CDialog::OnClose()の前にDestroyWindow()を呼んでおくとOK。
CDialog::OnClose()のみだと、再度ダイアログ開く時にDebug assertion failed。なぜ?
MSDNを見るとデフォルトのOnCloseがDestroyWindowを呼ぶとあるので、
(IDOKやIDCANCELでなく)バツで閉じる限りはオーバーライド + DestroyWindowの挿入は
不要かなと思ったのですが、なぜこの場合はあえて挿入する必要があるのでしょう?
それとも、挿入するとたまたまうまくいってるように見えてるだけなのでしょうか?
0463デフォルトの名無しさん
2005/09/03(土) 08:30:11createしたものをdestroyせずに再度createはできないってことでは。
0464デフォルトの名無しさん
2005/09/03(土) 08:47:110465デフォルトの名無しさん
2005/09/03(土) 09:42:56MSDNのCDialogの頁にOnCancelでDestroyWindowを呼べと書いてある
0466デフォルトの名無しさん
2005/09/03(土) 10:55:18[親側]
メンバ変数
CChildDlg *m_pChild=NULL;
子を呼ぶところ
if(m_pChild == NULL)
{
m_pChild = new CChildDlg;
m_pChild->Create(IDD_DIALOG);
}
[子側]
void CChildDlg::OnClose()
{
m_pChildDlg=NULL;
CDialog::OnClose();
}
void CChildDlg::PostNcDestroy()
{
// TODO : ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。
CDialog::PostNcDestroy();
}
0467デフォルトの名無しさん
2005/09/03(土) 10:56:35void CChildDlg::PostNcDestroy()
{
// TODO : ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。
delete this;
CDialog::PostNcDestroy();
}
とやってます。
エラーになることはないが、画面を起動するたびに領域が取られて、
アプリ終了時に一気に開放されるので、あまりいいやり方とは思っていないけど。
0468デフォルトの名無しさん
2005/09/03(土) 11:34:240469デフォルトの名無しさん
2005/09/04(日) 21:07:010470デフォルトの名無しさん
2005/09/05(月) 00:26:140471デフォルトの名無しさん
2005/09/05(月) 16:06:08tutorial で英和辞書(英々でもいいが)を引くヨロシ。
>どこにあるんですか?
ヘルプを「チュートリアル」で検索したりするとザクザク出てくるね。
0472462
2005/09/05(月) 20:38:21>>463
その通りだと思うのですが、MSDNにはデフォルトのOnCloseが
destroyするとあったので、むしろ自分では何もすべきではないのかな、と。。。
>>464
こちらにDestroyWindow()を記述する(CDialog::OnCancel()は削除)と
うまくいってるようです。確かにOnCloseから呼ばれておりました。
>>465
そちらを見たのですが、「親のいない独立ウィンドウの場合」という風に
読めませんか?まあ上記の通り、そうすると確かにうまくいくのですが。
>>466
ご丁寧にありがとうございます。web上のサンプル含め、new/deleteされる
方が多いみたいですね。私もこちらの方法だとうまくいくのですけれども。。。
0473デフォルトの名無しさん
2005/09/05(月) 21:23:24まあ意図する動作は実装できたのけど、MFCの設計の意図がよくわからんという
ことですね。DestroyWindow()をオーバーライドしてブレークポイント張って監視しても
OnClose()からはDestroyWindow()は呼ばれないことがわかります。MFCではよくある
ことですがMSDNの説明は怪しいですね。多分CDialog以外のCWndではそうだという
ことなのでしょう。結局はCWnd::Default()のようですし。
0474462=472
2005/09/06(火) 01:24:32>>473
> DestroyWindow()をオーバーライドしてブレークポイント張って監視
なるほど!まさにやりたかった操作です。OnCloseにブレークポイント
挿入してステップインでなんとかしようと思ったが、大量のアセンブラコード
に阻まれてあきらめてしまったのでした。確かにDestroyWindow()は呼ばれてないですね。
> MFCではよくある ことですがMSDNの説明は怪しいですね。
そうなんですか・・・肝に命じておきます。
お返事頂いた皆様ありがとうございました。ひとつ賢くなれました
0475デフォルトの名無しさん
2005/09/06(火) 13:37:46CFrameWndで作ったウィンドウのPreCreateWindowで
cs.style = WS_VISIBLE | WS_POPUP;
としていますが、くぼんだ境界線がでちゃいます。
cs.dwExStyle &= ~WS_EX_WINDOWEDGE;
としても消えてくれない…
消すことってできますか?
ちょうどVBのフォームでBorderStyleを0にしたようなウィンドウにしたいのです
環境はW2k、VC++6.0、MFCダイアログベースです、
よろしくおねがいします
0476デフォルトの名無しさん
2005/09/06(火) 16:11:25親ウィンドウがある時は親ウィンドウでDestroyWindowするかもしれない。
つーか、親に通知して親がDestroyWindowするようにした方が親の管理が簡単。
0477デフォルトの名無しさん
2005/09/06(火) 23:23:20CRect rect;
GetWindowRect(&rect);
と実行するとうまくいくのですが、
共通処理をするために、グローバル関数として別ファイルで同様に書くと
静的でないメンバ関数の呼び出しが正しくありません。
といわれます。
環境はWinXP、VC++2003、MDIアプリです。
識者の方、よろしくお願いします。
0478477
2005/09/06(火) 23:24:29APIと区別するためにCWndで名前解決は行ってあります。
0479デフォルトの名無しさん
2005/09/06(火) 23:26:45C/C++を勉強しなおせ。
0480デフォルトの名無しさん
2005/09/07(水) 00:23:44そのGetWindowRectはCWndのメンバなんだから、
よそから呼ぶはウィンドウを指定しないとだめだろ。
0481デフォルトの名無しさん
2005/09/07(水) 00:46:40ウィンドウを表示させる前に、表示させる予定の場所の座標をひろうことってどうやってやるのでしょうか?
表示させている状態であればGetWindowRectでひろえるのですが・・・
0482デフォルトの名無しさん
2005/09/07(水) 07:47:03ウィンドウを表示させる前ってCreateする前?
0483482
2005/09/07(水) 09:34:06もちろん、オブジェクトは生成してあります。
欲しい情報は幅と高さだけなので、それだけひろえれば十分です。
0484デフォルトの名無しさん
2005/09/07(水) 09:34:370485デフォルトの名無しさん
2005/09/07(水) 10:29:38「予定の場所の座標」は表示させようとするときにWindows側が決めるんじゃないだろうか。
「幅と高さ」はリソースから計算できそうだけど。
0486デフォルトの名無しさん
2005/09/07(水) 10:34:44Createする前じゃ、GetWindowRectで拾うのは無理だよ。
すべてのCWndのメンバ関数はCreateされた後じゃないと無効だからね。
Createしても
ShowWindowするまでは表示されないから、
その間でGetWindowRectでとる、というのではダメなわけ?
0487481
2005/09/07(水) 11:08:00>>485さんの通り、リソースから計算できれば解決なのですが・・・
やりたいことは、メニューバーからモードレスダイアログを表示、非表示の選択をできるようにしたいのです。
フォトショとかにありそうなやつの簡易版とでもいいますか。
そのまま何もしないと毎回位置がリセットされるので何とかしたいのです。
iniファイルを利用し、位置は記憶できますが、再表示の際その位置に表示するのにSetWindowPos関数を使っていますが、
この引数に幅と高さが必要なので、何かいい方法はないか、と思ってます。
0488デフォルトの名無しさん
2005/09/07(水) 11:25:40>表示するのにSetWindowPos関数を使っていますが、 この引数に幅と高さが必要なので
SWP_NOSIZE指定すりゃいいじゃん
0489481
2005/09/07(水) 11:50:34そうでした・・・完璧に忘れてましたorz
その部分は解決したのですが、今度はSetWindowPos自体が落ちます。
たぶん原因は>>486さんのいうようにCreateする前にセットしてることだと思うのですが・・・
かといってCreateした後だと一瞬(0, 0)に表示されてしまうので、これは避けたいです。
0490デフォルトの名無しさん
2005/09/07(水) 12:11:44非表示でCreateして、位置設定した後表示すりゃいいじゃない。
0491デフォルトの名無しさん
2005/09/07(水) 13:27:18OnInitDialogの中で位置を設定すれば、表示される前にその位置になるよ。
疑い深い人やOnInitDialogの中でやりたくない人は>>490。
0492481
2005/09/07(水) 16:41:22>>490さんの方法で成功しました。
続けて質問なのですが、この方法で作成すると、表示するたびにメンバ変数がクリアされてしまいます。
インスタンスの生成、消滅はビュークラスのコンストラクタ、デストラクタで行っているので、消去されいていることはないと思うのですが・・・
よろしくおねがいします。
0493デフォルトの名無しさん
2005/09/07(水) 16:47:060494デフォルトの名無しさん
2005/09/07(水) 17:15:210495デフォルトの名無しさん
2005/09/07(水) 17:59:13基本的なことではずかしいのですが・・・。
MFC を利用しています。
プロジェクト名を Hoge とします。
グローバル変数はどこでどのように定義すればいいでしょう?
というのも、CHogeApp が定義されている Hoge.h で定義したとしても、
Hoge.h を include している全てのヘッダファイルで定義されてしまい、リンクエラーになります。
extern 宣言をすると、逆に本宣言(?)がなくなり、リンク時に未解決エラーとなります。
Hoge.h のメンバとして用意し、
CHoge* pApp = (CHoge *)AfcGetApp();
pApp->〜
として呼び出すのが普通なのでしょうか。
もしくは、何か他に方法があるでしょうか。
よろしくお願いします。
0496デフォルトの名無しさん
2005/09/07(水) 18:05:33グローバル変数は関数と同じように.hファイルでexternをつけて宣言し、どこかのcppファイルで定義をする必要がある。
0497デフォルトの名無しさん
2005/09/07(水) 18:06:31お前のプロジェクト内にある「theApp」というグローバル変数がどうなってるか見てみろ
0499デフォルトの名無しさん
2005/09/08(木) 01:15:26そこでの変更をドキュメントクラスに保存したいのですが、どうやってドキュメントクラスを呼び出せばいいのでしょうか。
GetDocumentはもちろん使えないですよね。
なお、制作は.NET2003+MDI環境です。
とても初歩的な何かを忘れてるとは思うのですが思い出せません。
0500デフォルトの名無しさん
2005/09/08(木) 10:57:320501デフォルトの名無しさん
2005/09/08(木) 19:03:110502デフォルトの名無しさん
2005/09/08(木) 19:38:48// for example.
void cSomeDialog::OnCancel()
{
if (AfxMessageBox("閉じるかどうか", MB_ICONQUESTION | MB_YESNO) == IDYES) {
CDialog::OnCancel();
}
}
0503247
2005/09/08(木) 19:46:26画面が緑になる問題は、どうやら.netのバグではないか。という結論になりました。
アドバイスどおり、リブートしてからリビルドしたら直りました。
忘れた頃にまた緑になることもありますが、そのときはまたリブート、リビルドで対応してます。
またタイマで起動の1秒後にInvalidateRect(NULL)して、悪くても1秒後には解決するようにしてます。
近況報告でした!
0504デフォルトの名無しさん
2005/09/10(土) 15:32:100505デフォルトの名無しさん
2005/09/10(土) 15:43:08起動時の処理のタイミングで症状が出たり出なかったりするだけ。
0506503
2005/09/10(土) 19:52:06安易な責任転嫁は良くないですね。
じゃよければ理由を教えていただけるとありがたい。
0507名無しさん@そうだ選挙に行こう
2005/09/10(土) 20:09:04どんなダイアログかも分からんし。
0508デフォルトの名無しさん
2005/09/10(土) 20:12:11.NETのバグだと思うよ
0509名無しさん@そうだ選挙に行こう
2005/09/11(日) 10:31:44まあそうだと思うんですが、どこが悪いのかわからないので、
晒せないんですよ。OnInitDialogだけでもかなり長いし。
でも、「どう考えても」っていうぐらいだから多少の心当たりはあるのかなと思ったので。
>508
やっぱりそうですかね。
まあ1秒後には消せるので、これでいいかなとも思います。
いろいろありがとうございます。
0510名無しさん@そうだ選挙に行こう
2005/09/11(日) 10:38:300511名無しさん@そうだ選挙に行こう
2005/09/11(日) 11:56:560512名無しさん@そうだ選挙に行こう
2005/09/11(日) 12:38:03タイマ使って逃げるのは糞プログラム
0513名無しさん@そうだ選挙に行こう
2005/09/11(日) 17:52:410514名無しさん@そうだ選挙に行こう
2005/09/11(日) 18:28:260515名無しさん@そうだ選挙に行こう
2005/09/11(日) 18:46:560516名無しさん@そうだ選挙に行こう
2005/09/11(日) 19:02:08HTMLViewにしてプラグイン入れればほとんどの静止画、動画が再生可能
0517名無しさん@そうだ選挙に行こう
2005/09/11(日) 19:36:20プラグイン探しましたけど、いいのがなくて…
フリーのやつですかね?
0518名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:28:09MFCを使っていくにあたって、こうセオリーみたいなのってありますか?
プログラムによってはソースを書く場所がちがくても
同じ実行だったりするじゃないですか。
ようするに今わからないのは、どの動き方だったらどこに入れるって
いうのがいまいちわからないんです。
なので、もしそういうセオリーみたいなのをわかるサイトもしくは本でも
あれば、教えていただきたいです。
0519デフォルトの名無しさん
2005/09/12(月) 02:19:580520デフォルトの名無しさん
2005/09/12(月) 02:52:52見えるかもしれないが、MFCを使いこなせるようになって来たら
確かに心で感じるものだと実感出来るようになるだろう。
0521デフォルトの名無しさん
2005/09/12(月) 06:14:23でもMFCは基本的な作りが決まってるから
誰が作ってもだいたい同じような感じになってしまう。
でたらめに作るとビルドできないし動かないからね。
0522518
2005/09/12(月) 19:35:230526デフォルトの名無しさん
2005/09/12(月) 22:19:250527デフォルトの名無しさん
2005/09/13(火) 11:52:390528デフォルトの名無しさん
2005/09/13(火) 12:00:190529デフォルトの名無しさん
2005/09/13(火) 13:42:310530デフォルトの名無しさん
2005/09/13(火) 13:47:07void CPenDlg::DrawPen(void){
CPenp(PS_SOLID, 1, RGB(255,255,255));
CPen*oldp=dc.SelectObject(&p);
…
dc.SelectObject(oldp);
}
このoldpを保存して,最後にSelectObject(oldp)する操作は必要なのでしょうか?
このdcはこの関数終了後に破棄されるので,もとのペンに戻す必要がないように見えます
0531デフォルトの名無しさん
2005/09/13(火) 13:51:59リソースリークしてもいいのなら戻さなくていいよ。
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/devcons_9v3o.asp
>An application should always replace a new object with the original, default object after it has finished drawing with the new object.
0532デフォルトの名無しさん
2005/09/13(火) 14:42:29menu.LoadMenu(IDR_〜);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
このmenuをポップしたときに、ディセイブルにするにはどうしたら良いでつか?
0533デフォルトの名無しさん
2005/09/13(火) 14:50:48現在のグラフィック オブジェクトを使い終わったら、
古いグラフィック オブジェクトをデバイス コンテキストに選択し直して、状態を復元します。
フレームに割り当てられたグラフィック オブジェクトは、スコープからはずれたときに自動的に削除されます。
0534デフォルトの名無しさん
2005/09/13(火) 15:12:58WM_INITMENUPOPUP
0535デフォルトの名無しさん
2005/09/13(火) 15:15:37menuのアイテムをディセイブルにする側のコードはどうなるんでしょう?
0536デフォルトの名無しさん
2005/09/13(火) 15:18:40マニュアル持ってないのか?
CMenuのメンバ関数調べろ
0537デフォルトの名無しさん
2005/09/13(火) 15:52:070538デフォルトの名無しさん
2005/09/13(火) 16:03:510539デフォルトの名無しさん
2005/09/13(火) 16:18:41menu.EnableMenuItem(ID_MENU_〜, MF_GRAYED | MF_BYCOMMAND);
でできますた。
0540デフォルトの名無しさん
2005/09/16(金) 17:40:42求めたいんですが、複数行の文字列のサイズを求める方法が分かりません。
各行のサイズを自前で求めるしかなかですか?
0541デフォルトの名無しさん
2005/09/16(金) 17:44:170542カラス
2005/09/16(金) 18:04:490543デフォルトの名無しさん
2005/09/16(金) 18:38:59CRect rect( 0, 0 ,1024 ,0 );
pDC->DrawText("test\nテスト\nテスト", rect, DT_CALCRECT|DT_WORDBREAK );
rect.bottomに高さが
0544デフォルトの名無しさん
2005/09/16(金) 18:52:32それでサイズがわからんとはどういうこと?
0545デフォルトの名無しさん
2005/09/16(金) 18:57:53どうもありがとうございます。
DT_CALCRECTに見覚えがあるとに、すっかり忘れとりました。ボケてきたかな。
>>544
改行を含む文字列の場合、1行に繋がった横長のサイズが求まるとです。
■ このスレッドは過去ログ倉庫に格納されています