トップページ⇒tech
1001コメント335KB

■MFC相談室 mfc17d.dll■

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/21(火) 10:38:31
Microsoft Foundation Classライブラリ専用スレです。

前スレ
■MFC相談室 mfc16d.dll■
http://pc8.2ch.net/test/read.cgi/tech/1146117893/
0334デフォルトの名無しさん2007/01/16(火) 05:27:51
>>332
情報少なすぎでどうespしろと?
0335デフォルトの名無しさん2007/01/16(火) 05:36:21
>>333
自分でエディタとか作ったことない?
0336デフォルトの名無しさん2007/01/16(火) 08:03:52
>>332
プロファイルで
0337デフォルトの名無しさん2007/01/16(火) 09:03:52
ある場所から突然malloc(255)がNULLになります。直前のmallocは必ず成功で、場所は一定
HEAP、スタックを2000000(2M)や20000000(20M)で試しましたが、タイミングや場所は変わらないようです
お手上げです。解決策をお知りの方おりませんか?
0338デフォルトの名無しさん2007/01/16(火) 09:15:52
直前のmallocまでのすべての戻り値をここにさらしてごらん
0339デフォルトの名無しさん2007/01/16(火) 09:42:17
直前のmallocの戻り値でいいですか?

malloc(255);//必ず成功。 戻り値:0x00b72e68
WideCharToMultiByte
MultiByteToWideChar
malloc(255);//必ず失敗

こんな感じです
0340デフォルトの名無しさん2007/01/16(火) 09:59:04
ヒープ壊してんじゃねえの
0341デフォルトの名無しさん2007/01/16(火) 10:05:25
解決しました!
MultiByteToWideCharを2度使いmallocのサイズを指定していたのですが、wchar単位でNULLが含まれていないため少なくなっていました
成功するほうをmalloc((len+1)*sizeof(wchar_t));で動きました。
ありがとうございました。
0342デフォルトの名無しさん2007/01/16(火) 12:49:33
CStringWじゃ駄目なのか?
0343デフォルトの名無しさん2007/01/16(火) 17:35:59
>>332です。

>>336
ありがとうございます。
プロファイルで調べたところOnIdle()のreturnが原因だったようです。

そのreturnのことで質問なのですが、
OnIdle内でのレンダリングによってCGアニメーションを表示するプログラムを書いているのですが、
return TRUE;だと前述のようにCPU使用率が高くなるのですが、
アニメーションは正常に表示されます。
return CWinApp::OnIdle(lCount);だとCPU使用率の問題は解消されるのですが
OnIdle()が呼ばれる間隔が長くなるためか、アニメーションが滑らかに表示できません。

この2つを同時にクリアできる良い方法はありませんか?
よろしくお願いします。
0344デフォルトの名無しさん2007/01/16(火) 19:02:17
んー、、、目的の fps が取れてるなら Sleep(0)を呼ぶとかどうだろう、Sleep(1)でもいいが
0345デフォルトの名無しさん2007/01/16(火) 19:27:01
ほっといてやれ
0346デフォルトの名無しさん2007/01/16(火) 21:57:57
>>344
ありがとうございます!!
どうやらすごく基本的なことのようですね。。
0347デフォルトの名無しさん2007/01/18(木) 21:52:58
マルチラインエディットボックスで
水平方向のスクロールバーの位置から
列の何文字目から表示している知りたいのですが
どうすればいいのでしょうか?

やりたいことはエディットボックスの中身を編集して
かきかえても書き換える前と同じ位置を表示したいのです。
LineScrollを使用すれば垂直はうまくいくのですが、水平がうまくできません。

また、SetScrollPosを使用してもエディットボックス内が更新されないのでこまっています。
0348デフォルトの名無しさん2007/01/18(木) 23:52:25
>>347
「書き換えても書き換える前と同じ位置」というのもよくわからないんだけど、
わざわざスクロールバーを使っているのはなぜ?
単純にGetSelでカーソル位置を取得しておいてSetSelで戻すだけじゃダメ?
あと、エディットボックスの更新するにはUpdateData(FALSE)とUpdateWindow()
じゃない?
質問がよくわかってないのではずしてるかも知れんけど。
03493472007/01/19(金) 14:44:11
>>348 さん
レスありがとうございます。

自己解決しました
0350デフォルトの名無しさん2007/01/19(金) 16:13:48
CWnd* CWnd::GetDlgItem(int nID); で得られるCWndのインスタンスの解放は
誰に責任があるんでしょうか?ソースコードを少し追ってみると、独自のアロケータ
でごにょごにょやってるような感じなんですが。
03513502007/01/19(金) 16:23:11
自己解決しました。こういう一時的に作ったオブジェクトはMFCが勝手に
CWinApp::OnIdle() → CWnd::DeleteTempMap() あたりで解放するんですね。

0352デフォルトの名無しさん2007/01/19(金) 16:23:37
ソース追うのもいいけど、ヘルプもみよう
0353デフォルトの名無しさん2007/01/19(金) 16:34:29
いや、だってヘルプには「返されるポインタは、一時的なポインタです。後で使用するために保存しておくことはできません。
」としか書いてないから、誰がどこでいつ解放するか気になるじゃん?
0354デフォルトの名無しさん2007/01/19(金) 16:39:54
一時的なポインタを解放するのか?
0355デフォルトの名無しさん2007/01/19(金) 17:09:59
そりゃ解放するでしょ。問題は誰がいつどこで開放するかであって、それに
よって「一時的なポインタ」とやらの有効範囲が決まってくるわけだから。
0356デフォルトの名無しさん2007/01/19(金) 17:21:08
クラスがなんだかわかってないのでは?
0357デフォルトの名無しさん2007/01/19(金) 18:22:15
あれ、FromHandle()あたりからDeleteTempMap()をたどって知ったんだったかな、、、
ヘルプだけで一時的なCWnd*がいつ消されるかも読んだ気がしたが・・・
0358デフォルトの名無しさん2007/01/19(金) 18:27:04
>>357
それがヘルプに書いてあれば悩む必要がないのにね。
0359デフォルトの名無しさん2007/01/22(月) 18:39:22
すいません。
自作でエクスプローラ風アプリケーションを作りたいのですが、
それ風なサンプルを説明しているサイトとか知りませんか?

全く、それ系のインターフェイス名も知らないんで、
ググれなく困っています。
0360デフォルトの名無しさん2007/01/22(月) 19:00:58
せっかく教えても無駄になりそうだからやめておこう
0361デフォルトの名無しさん2007/01/22(月) 20:54:50
>>359
えー!!
そんな殺生なぁ
03623612007/01/22(月) 20:56:48
>>360
おねがいっす!!
0363デフォルトの名無しさん2007/01/23(火) 11:03:34
質問なんですけど
AppクラスからDocumentクラスのポインタの取得方法を教えてください
よろしくお願いします。
0364デフォルトの名無しさん2007/01/23(火) 11:12:52
自分で持ってそうな気がするけど
0365デフォルトの名無しさん2007/01/23(火) 11:13:20
Viewが一つだけなら
GetFirstDocTemplatePosition()、GetNextDocTemplate()、GetFirstDocPosition()、GetNextDoc()
あたりで。
03663632007/01/23(火) 11:19:24
>365
GetFirstDocPosition()、GetNextDoc()で取得できました。
ありがとうございます。
0367デフォルトの名無しさん2007/01/25(木) 16:20:26
スライダについて質問です

slider.SetRange(0, 100, true);
slider.SetTicFreq(10);
slider.SetPos(0);

このようなスライダを作り、スライダで設定した値をEditBoxに表示しています。
このとき、スライダのつまみをドラッグした場合には正しい値が得られますが
クリックで設定しようとした場合が上手くいきません

例えば、70を設定しようと思って該当する目盛りのあたりをクリックすると、
70の位置には来ず、マウスボタンが押されるたびに60と80で切り替ってしまいます。
クリックでも値を設定できるようにするには、何か特殊な処理が必要なのでしょうか?


0368デフォルトの名無しさん2007/01/25(木) 18:32:40
スライダの現在位置が0の時に70の位置をクリックしたら
0+GetPageSize()で得られる位置に移動するのがスライダ
コントロールの仕様だと思うんですが。

仕様が気に入らないのであれば、自分で必要なイベントを拾ってSetPos()すれば良い。
0369デフォルトの名無しさん2007/01/26(金) 01:06:48
CEdit::SetFoces()に関する質問です。

任意のテキストフィールドをフォーカスさせたい場合は
CEdit::SetFocus()を行うと実現できますが、
このとき、フォーカス対象のテキストフィールドに文字列が
入力されているとき、文字列全体を範囲選択した状態で
フォーカス移動させるにはどのような手法があるでしょうか?

イメージとしてはタブでフォーカス移動させたときのような感じです。

よろしくお願い致します。
03703692007/01/26(金) 01:14:49
ごめんなさい。自己解決しました。

CEdit::SetFocus();
CEdit::SetSel(0,-1);
で実現できるようでした。
0371デフォルトの名無しさん2007/01/27(土) 01:54:56
ダイヤログベースのアプリです。
英語化について教えてほしいです。

タイトルアイコンをクリックした時のシステムメニューや、
AfxMessageBoxを表示させたときのキャンセルの表示など
あらかじめ用意されている部分に日本語が表示されますが、
すべて、一切がっさいを英語にしたいと考えています。

どのような方法で英語かすることができるでしょうか?
0372デフォルトの名無しさん2007/01/27(土) 02:56:08
>371

アプリケーションを実行するとき、デフォルトのコードページを英語に変更する。
でも、システムのバグをたたくこともあるからお勧めしない。
0373デフォルトの名無しさん2007/01/27(土) 06:21:45
英語環境でビルドしてあるやつでもそうなるから
OSの問題だろ
0374デフォルトの名無しさん2007/01/27(土) 13:08:41
だから実行時指定
0375デフォルトの名無しさん2007/01/27(土) 15:15:32
>>371
日本語関連を全くインストールしていない、設定も悉く日本にしていない端末で、実行する。
0376デフォルトの名無しさん2007/01/27(土) 15:21:43
MFCは全くの初心者なのですが、MFCにもバージョンはあると思うのですが
Visuall C++(VC6)に付属のMFCのバージョンはいくらになりますか?
0377デフォルトの名無しさん2007/01/27(土) 15:31:00
6.0
0378デフォルトの名無しさん2007/01/27(土) 17:48:04
WikipediaのMFCの項目、批判の所見てワロタ。
どこの知障だよ、書いたの。
0379デフォルトの名無しさん2007/01/27(土) 18:41:44
>378
DelphiやJavaはライブラリらしい。しかも、C++はコンパイル時間が長いらしい。
03803722007/01/27(土) 19:01:12
>371

あと、afxMessageBoxにはユーザ拡張用の前呼び出し処理があるから、
それを横取りして自作のメッセージボックスを表示する。

とかかな。
0381デフォルトの名無しさん2007/01/27(土) 19:01:26
コンパイル時間は長いとは思うけど、他のオブジェクト指向言語と
比べてどうなのかはわからんな。

ただ、「C++だから」ってより「色々インクルードするから」長いんだけど。
0382デフォルトの名無しさん2007/01/27(土) 19:06:08
実行時コンパイルの方が好感もたれるのか
0383デフォルトの名無しさん2007/01/27(土) 19:52:07
すみませんMFCど素人です
ANSIの
unsigned char foo[64]
MFCではどの様に書いたらいいのでしょうか?
コンパイラはVC6です
0384デフォルトの名無しさん2007/01/27(土) 20:20:34
unsigned char foo[64]
0385デフォルトの名無しさん2007/01/27(土) 20:47:58
ガベコレがないのが致命的欠点であるかどうかは検証不可能だから
これはもちろんWikipediaに書いてはいけない。

Delphiの方にもしょうもない書き込みしてるが、
群を抜いているのなら特定のソフトウェアをあげつらう必要はなかろうに。
「中立的な観点」を欠いてしまっているのが分らないのかね。
0386デフォルトの名無しさん2007/01/27(土) 23:24:57
何で C# って使われてないの?
VC++ ネイティブのより多少計算とか遅いかもしれないけどさ、
開発が VB 並にめっちゃ楽だし、
文法は Java そっくりで習得も移行も容易だし、
全体的にスマートな印象を受けるじゃん
いい加減 VC++ 信仰は止めて欲しいんだよね
一々 Windows と UNIX(Linux) 版を作りたくねーんだよ
もうさ、時代は中間言語の時代だと思うね
頼むから、ネイティブ信仰は止めようぜ
な
0387デフォルトの名無しさん2007/01/27(土) 23:34:26
>>386
TPOで使い分けるでFAだろ。
まあその手の議論は実りがないから他でやったほうがいいな。
0388デフォルトの名無しさん2007/01/28(日) 08:18:59
InitDialog中で、必要なファイルがあるかのチェックをして
なければSendMessage(WM_CLOSE);として終了するようにしているのですが
一瞬Windowが表示されてしまいます。。。
Windowを表示させずにそのまま終了する方法はないでしょうか?
0389デフォルトの名無しさん2007/01/28(日) 08:37:30
ダイアログ出す前に調べる
0390デフォルトの名無しさん2007/01/28(日) 10:07:30
>>388
モーダルならEndDialog、モードレスならDestroyWindow。
0391デフォルトの名無しさん2007/01/28(日) 11:06:29
ほほぉ、それからそれから?
0392デフォルトの名無しさん2007/01/28(日) 12:29:47
VC8のMFCではダイアログボックスに貼り付けるボタンやテキストボックスのサイズや
表示位置をそれぞれのプロパティから数値で詳細に設定できるのですが、VC6のMFCでは
そのようなプロパティに項目が見当たりません、VC6で皆さんは位置決めやサイズを
何処で設定されているのでしょうか?
0393デフォルトの名無しさん2007/01/28(日) 13:03:17
テキストエディタ
0394デフォルトの名無しさん2007/01/28(日) 13:16:13
>>389、390
ありがとうございました!
0395デフォルトの名無しさん2007/01/28(日) 16:34:24
ダイアログベースのアプリです。
ウインドウサイズをマウスで自由に変更できるようにするには
どのような設定、または処理を作れば良いでしょうか?
SDI/MDIベースでないとできないですか?
0396デフォルトの名無しさん2007/01/28(日) 16:48:03
いいえ。
0397デフォルトの名無しさん2007/01/28(日) 17:04:26
サイズ可変のスタイル付ければダイアログ自体のサイズは変えられるようになるが
中のコントロールもそれにあわせて調整したければ、自分で書くしかない。
0398デフォルトの名無しさん2007/01/28(日) 17:17:53
>>397さん
お返事ありがとうございます。
サイズ可変のスタイルのつけ方は、具体的なコードイメージを教えていただけないでしょうか。
ダイアログ内部に設置したCEditのコントロールもあわせて変更するように実装します。
03993962007/01/28(日) 17:44:13
スルーされたから要点だけ突っ込み。
>サイズ可変のスタイルのつけ方は、具体的なコードイメージを教えていただけないでしょうか。
MSDN嫁。リソースで定義したダイアログならリソースエディタのプロパティの該当項目をチェックするだけ。

>ダイアログ内部に設置したCEditのコントロールもあわせて変更するように実装します。
サイズ変更のメッセージハンドラを書く必要がある(勿論そこでCEditのサイズを調整する)ので、
初心者向けの解説サイトでも探して解説を読め。
0400デフォルトの名無しさん2007/01/28(日) 18:57:22
すいません。でも方法教えていただきありがとうございました。
これからはMSDNみてから質問します。
CEditのほうもありがとうございました。
0401デフォルトの名無しさん2007/01/28(日) 21:19:27
>>392ですが、どうしたらいい?
0402デフォルトの名無しさん2007/01/28(日) 21:38:35
>>401
VC6の場合画面の右下のステータスバーに座標とサイズが表示されてるから
それを見ながら、マウスかキーボードで配置する。
[↑↓←→]で位置の変更、[Shift]+[↑↓←→]でサイズ変更。
もしくはリソーススクリプトを直接編集する。
0403デフォルトの名無しさん2007/01/29(月) 05:11:45
ダイアログ上にコントロールを大量に貼り付けて等間隔に位置を合わせるtips。

1.テキストエディタで.rcファイルを開く。
2.DIALOG内のCONTROL行をcsvファイルとして保存する。
3.以下省略。
0404デフォルトの名無しさん2007/01/29(月) 05:36:57
すごい大量のとき役立ちそうだなw
0405デフォルトの名無しさん2007/01/29(月) 06:20:10
ダイアログエディタに位置そろえる機能ついてるけど
0406デフォルトの名無しさん2007/01/29(月) 15:36:03
>>403の3.の部分はストリングテーブルを書くときに便利だな。
defineと日本語/英語の文字列が一気に書ける。同時に仕様書も作れて一挙両得。
defineの数値はドラッグすれば1づつ増やせるからバグもでない。
0407デフォルトの名無しさん2007/01/30(火) 23:29:19
フレームウィンドウとかの OnDestroy について質問です
通常 OnDestroy の中では親クラスの OnDestroy を呼んでいますが、
その親の OnDestroy の直前の部分でメモリ開放処理を行うのは良くないですか?
リストに登録されているアイテムを開放したいのですが・・・
0408デフォルトの名無しさん2007/01/30(火) 23:50:16
>>407
良くないと思う理由は?
リストってリストボックスやリストビューコントロールのこと?
0409デフォルトの名無しさん2007/01/31(水) 00:00:58
>>408
CListCtrl のことです
これに new で生成したオブジェクトを登録?しています
そのまま終了するとメモリリークが発生してしまうので、
ウィンドウが破棄される直前に開放しようと思いました
それで OnDestroy に追加することにしました

良くないと思った理由は、親クラスの OnDestroy を
呼んでいるところの下にデフォルトで「ここに追加」
的なコメントが入っているからです
0410デフォルトの名無しさん2007/01/31(水) 00:10:13
CListCtrlが消えるのいつなん?
プログラムが生成→消滅→生成→消滅→・・・ってやってるか
生成→表示→非表示→表示→非表示→・・・消滅ってやってるかでタイミング違ってくるじゃん。
生成したインスタンスを消したいタイミングはいつよ?
最終的に(それがいつだかはアプリにもよるが)インスタンスを確実に消滅さしときゃ問題ねーんだしよ。
0411デフォルトの名無しさん2007/01/31(水) 00:29:46
リストは起動時から終了時までずっと表示です
終了時に一覧情報を保存して破棄することにしています

できるだけ綺麗な(オブジェクト指向的な)ソースコードを
書きたいので、親の OnDestroy の前が正解か後ろが正解か
が気になります
0412デフォルトの名無しさん2007/01/31(水) 00:49:58
>>411
WM_DESTROYを処理してる間は、子ウィンドウは存在している。
ttp://msdn2.microsoft.com/en-us/library/ms632620.aspx

リストビューアイテムに設定しているデータを削除するのは、LVN_DELETEITEM, LVN_DELETEALLITEMSでやるといい。
0413デフォルトの名無しさん2007/01/31(水) 00:51:06
>>412
ありがとうございます!
やってみます!
0414デフォルトの名無しさん2007/01/31(水) 00:52:14
>>411
だったらOnDestroyは関係ないんじゃない?
つか、親のOnDestroy後にCListCtrlにアクセスされたら(するのか?)死ぬじゃない。
親のデストラクタでdeleteしとけばいいんじゃね?やってみ、やってみ。やってみたら結果報告ヨロ
0415デフォルトの名無しさん2007/01/31(水) 00:53:07
CMainFrame::OnDestroy()の前後どっちか2択と言われたら後に1票。

個人的には、Documentで扱っているデータなら
CHogeDocument::OnCloseDocument() or OnSaveDocument()
ViewのみでやってるならCHogeView::PostNcDestroy()でやると思う。
CMainFrameにCListCtrlのデータ持たせるとViewからデータへの
アクセスが面倒じゃない?
0416デフォルトの名無しさん2007/01/31(水) 01:08:09
>>414-415
ありがとうございます!
いろいろと試してみます!
0417デフォルトの名無しさん2007/01/31(水) 08:40:38
親ウインドウと関係あるのはopenからcloseまで
closeしたらウインドウ関係ないから心配いらん

>綺麗な(オブジェクト指向的な)ソースコード

普通はデストラクタで解放
0418デフォルトの名無しさん2007/02/01(木) 00:21:49
CListCtrl コントロールのイベント処理ですが
クリック時とダブルクリック時とで処理を分けたいと思っています
しかし、ダブルクリック時には先に必ずクリックイベントが
発生してしまってうまくいきません
NM_DBLCLK の直前に NM_CLICK が発生するのを
防ぐことはできませんか?
0419デフォルトの名無しさん2007/02/01(木) 00:53:14
仮にNM_CLICKが発生しないようにしたらシングルクリック時の処理が出来ない。
コントロールの身になって考えれば、ユーザーのクリックがシングルなのかダブルの1発目
なのかの判断はできない。

シングルクリック時の処理開始をしばらく待ってみる以外手はないと思う。
0420デフォルトの名無しさん2007/02/01(木) 01:11:47
>>419
レスありがとうございます
つまり、NM_DBLCLK 前には NM_CLICK が
絶対に発生してしまうということですね
何か良い手はないですかね・・・
0421デフォルトの名無しさん2007/02/01(木) 01:20:02
だからシングルクリックのイベント後、しばらく待ってみてダブルクリックが来ないようなら
シングルの処理。来たらダブルの処理するだけ。

VBのサンプルではタイマー使ってるみたい。
http://support.microsoft.com/kb/109865/ja
0422デフォルトの名無しさん2007/02/01(木) 09:45:30
本来はダブルクリックってーのは、シングルクリック→メニュー等選択
のショートカットだから、シングルクリックのあとにダブルクリックがきても
何も困らないんだけどな。
ダブルクリックを変なことに使おうとするからこうなる
0423デフォルトの名無しさん2007/02/03(土) 19:33:32
これからMFCの勉強を始めたいのですが
書籍の「標準講座MFC」って今でも役に立つでしょうか?

MFC6.0ってちょっと古いみたいですが、最新のバージョン(MFC8.0?)と
大きく違うところってあるのでしょうか
0424デフォルトの名無しさん2007/02/03(土) 20:20:00
仕事でどうしても必要なのか?
でなければ止めとけ。
0425デフォルトの名無しさん2007/02/03(土) 20:42:57
>>423
新しいUI関連のクラスがいくつか無いだけで、基本はそんなに変わってないと思うけど。
0426デフォルトの名無しさん2007/02/03(土) 21:18:50
http://www.shoeisha.com/book/hp/pc/book/MFCMaster/
ソースは公開されてる
0427デフォルトの名無しさん2007/02/03(土) 21:57:59
お前ら教えてください。
ツールバーのボタンに文字列のみ表示したいのですが、
TBBUTTON::iBitmapにNULLを指定しただけでは
イメージ(アイコン?)のスペースの分のスペースが空き、
そこから先から文字列が描画されてしまいます。
どうすればいんでしょうか?
0428デフォルトの名無しさん2007/02/03(土) 22:40:06
CToolBarでできそうな気がするけど
04294272007/02/03(土) 22:47:49
>>428
なるほど!
CToolBar::SetSizes()の中にやり方が書いてありました。
助かったよ!ありがとう!
0430デフォルトの名無しさん2007/02/04(日) 09:09:06
今、Visual C++ 6.0 を使ってるのだが、開発環境をバージョンアップしようとしたら
どれを導入すればいいのだろう?

無料で配布されている Visual C++ 2005 Express は MFC は入ってないんですよね?

それとも、あと少し待って次のバージョンが出たときのほうがいいんでしょうかね。
0431デフォルトの名無しさん2007/02/04(日) 09:26:03
>>430
そりゃおめ、vista上で動くモン買えや。
いま、XPでなにやら揃えるのは無駄でしょ?
0432デフォルトの名無しさん2007/02/04(日) 11:30:15
IEのメニューの用に画面に収まりきらないメニューがある場合は
「>>」を表示し、「>>」を押せば残りのメニューが表示されるようにしたいのですが、
そういったコントロールがあるのでしょうか?
どなたかヒントだけでもわかる方おられましたら教えてやって下さい。
0433デフォルトの名無しさん2007/02/04(日) 11:39:00
軍人や警官の袖に付いている山形の袖章のことをいうのだそうです(多分)。
■ このスレッドは過去ログ倉庫に格納されています