09/03/11 23:50:26
>>426
すみません、もう一歩だけお願いします。
調べるなら、C++のメモリ管理で調べればいいでしょうか?
428:デフォルトの名無しさん
09/03/11 23:51:14
フォントなんかが参照不能になるのは
描画のタイミングが関数抜けた後だから
文字列は渡し終わってるから問題なし
429:デフォルトの名無しさん
09/03/12 00:10:04
>>426, 428
まとめるとこうでしょうか。
・コントローラに文字列を渡すと、コントローラが新たにメモリを割り当てる。
・この場合、関数を抜けた後も、描画タイミングで割り当てられたメモリが参照されるので問題なし
ただしフォントの場合は、メモリ割り当てが行われない(?)ので、関数を抜けると参照不能
コントローラのメモリ管理について調べてみます。
ありがとうございました。
430:デフォルトの名無しさん
09/03/12 00:18:04
どうでもいいけど「コントローラ」ってなんだよ。
controllerじゃなくてcontrolだぞ。
431:デフォルトの名無しさん
09/03/12 00:28:17
>>430
訂正thx。気をつけますw
432:デフォルトの名無しさん
09/03/12 00:44:32
>ただしフォントの場合は、メモリ割り当てが行われない(?)ので、関数を抜けると参照不能
これは単にスコープの問題
433:デフォルトの名無しさん
09/03/12 10:43:00
スコープの問題じゃなくて、寿命の問題。
スコープが外れても寿命が続くのなら大丈夫。
だから例えば、staticでも(一代限りは)使える。
434:デフォルトの名無しさん
09/03/12 20:06:01
フォントって、CFontクラスやCBrushクラス等のGDIオブジェクトをローカル
変数で作成したなら、関数を抜けた時点で変数の寿命が尽き、DeleteObject()
を呼んでいなくてもデストラクタから(メンバ変数のm_hObjectを使って)強制
的にDeleteObject()が呼び出され、(GDIオブジェクトとそのハンドルが)破棄
される。
CFont *pFont=new CFont;
などとやった場合、ポインタ変数の寿命が尽きても、newしたオブジェクト
自体はdeleteはされないので、プロセス終了まで、紐が切れた凧のように
メモリ空間に残る。
95系だとプロセス終了でも解放されず、リソースリークになるんだっけか?
static で宣言したオブジェクトでも、
if(s_FontStatic.GetSafeHandle())
s_FontStatic.DeleteObject();
s_FontStatic.CreateFontIndirect(...);
と破棄する手順を踏めば、何回でもリサイクルできる。
435:デフォルトの名無しさん
09/03/14 02:34:29
CMFCToolbar上にStatic Textを作成できないですかねぇ・・・
436:デフォルトの名無しさん
09/03/14 10:05:36
>>435
CMFCToolbar って、CDialogBar よりも美味しいの?
スタティックテキスト相当な機能なら、わざわざウィンドウを置かなくても
CString型のメンバ変数を追加して、ツールバーの描画処理を自前でやれば
いいだけのような肝。
437:デフォルトの名無しさん
09/03/17 23:37:17
>>435
つCStatic::Create
438:デフォルトの名無しさん
09/03/22 15:54:16
ダイアログ上のコントロールのタブオーダーが一つ前のコントロールIDを調べるにはどうしたらいいんですか?
例えばCEditが10個並んでいるとして、5番目のタブオーダーのCEditにフォーカスがある時に、
4番目のタブオーダーのコントロールIDを調べたいんですが。
"タブオーダー MFC"でググってもタブオーダーを変更する方法しか見つからなくて。
タブオーダーがらみのAPIって無いんですかね?
439:デフォルトの名無しさん
09/03/22 16:23:08
CWnd* pWnd = wndEdit.GetWindow( GW_HWNDPREV):
if ( pWnd->GetStyle() & WS_TABSTOP) UINT nID = pWnd->GetDlgCtrlID(); // こいつがそう。
else pWnd = pWnd->GetWindow( GW_HWNDPREV);
以下繰り返しってな感じで取得できないかな。
実際には while ループするほうがお得だろうが。
440:デフォルトの名無しさん
09/03/22 17:14:26
>>439
どうもありがとうございます。
GW_HWNDPREVというのはウインドウのZオーダー順であるだけでなく、
Window上のコントロールのタブオーダー順でもあるんですね。
441:デフォルトの名無しさん
09/03/22 21:59:09
C初心者スレで相手にされなかったので、質問させてください
MFCでアプリを作っているのですが、
動作確認のため、コンソールも起動しております。
_cprintf_sや_cscanf_s関数を使っているのですが、
_cscanf_s関数でバックスペースのキーを入力すると、
プログラムが無限ループで暴走してしまいます。
普通のscanf()関数のようにバックスペースで一つ前の文字を削除するには
どうすればよいでしょうか?
442:デフォルトの名無しさん
09/03/22 22:07:52
暴走するようなもの使うな
443:名無し募集中。。。
09/03/23 09:08:39
MFCも使っているのかもしれないけど_cscanf_s関数ってMFCじゃないし
コンソールならダイアログにEditコントロールを置いて表示・入力するって感じになりそうだけど
デバッグ表示だけならTRACEマクロが便利
値の入力は・・・ちょっと試すだけならブレイクポイントで値の代入とか
444:デフォルトの名無しさん
09/03/23 21:24:49
いまさらながら、mfcおもしろいお。
詳しい説明書ないかお?
445:デフォルトの名無しさん
09/03/24 10:07:58
SP1以降の解説か、まだないかもな。
446:デフォルトの名無しさん
09/03/24 17:14:26
>>444
SP1非対応でよければMicrosoft Pressの「プログラミングVisual C++.NET Vol.1/2」
Vol.2の最後にちょろっと.NETの説明があるけど、それ以外はMFCの説明になってる
447:デフォルトの名無しさん
09/03/24 20:59:37
後はmfcのソース読んどけ、ってところだな。
ドキュメント化されていない情報が山ほどあるし。
別に全部目を通さなくても、疑問に思った箇所だけで十分。