[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 03/01 12:35 / Filesize : 186 KB / Number-of Response : 746
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

■MFC相談室 mfc19d.dll■



1 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 18:37:47 ]
Microsoft Foundation Classライブラリ専用スレです。

前スレ
■MFC相談室 mfc18d.dll■
pc11.2ch.net/test/read.cgi/tech/1185917008/

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」を参考にしては?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<186KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef