現在、MFCで検索プログラムを作成しています。
始めはDoModalで作成していたのですが、ダイアログを閉じずに、ダイアログを複数並べて見たいという意見が出た為、モードレスで作成し直そうとしたところ、ダイアログが現れてくれません。
インターネットで見つけたソースを試してみたのですが、上手くいきません。
どなたか教えて頂けますか?
=ダイアログに移るボタンコードに=
CDlg1 dlg;
dlg.Create(IDD_DIALOG1, this);
dlg.ShowWindow(SW_SHOW);
(dlg.DestroyWindow();は他に記述)
1.
上記では、ShowWindowに0が返ってしまい、一瞬ダイアログが映って
消えてしまいます。Createは1が返ってるのでいいかと思いますが…。
2.
あと、違うソースで試したところ、ダイアログは表示できるものの、
一回消してしまうと、もう一度ボタンを押しても再度は表示されません。
しかも、Destroy()を設定したOKボタンでは強制終了となってしまいます。
モードレスで作成すると、一回そのダイアログを消してしまうと再度表示ができないのでしょうか?
モードレスってただ他の処理ができるというだけで、そのダイアログを何枚も表示させておくことはできないのでしょうか?
3.
このダイアログにjpegファイルを表示させているのですが、ダイアログベース・htmlView以外で表示させれる方法がありましたら教えて下さい。
よろしくお願いします。
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
もし作成したダイアログのポインタを削除する為だけにポインタ配列を用意する
のでしたら変わりにこんな方法もあります。
CMyDialog::PostNcDestroy()をオーバーライド
CMyDialog::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;
}
こうすればモードレスダイアログが閉じられた時に自動でメモリも削除されるし
楽かなと思いますけど。
とりあえず参考まで...
No.5
- 回答日時:
こんにちは。
itohhといいます。その後、進展はありましたか?
もし、まだ悩んでいるようでしたら、子ダイアログのオブジェクトを配列で持つときの注意点を。
1.上限を決めたとき、それ以上はダイアログが表示されないようにする。
2.子ダイアログを閉じたとき、配列のどの位置のオブジェクトを削除するかわかるようにする。
3.親ウィンドウが終了するときには、子ダイアログはすべて閉じてオブジェクトもすべて
削除しなければいけない。
大まかに注意事項を上げるとするとこんなところでしょうか。
配列で管理する場合、配列の添字の管理が難しいと思います、配列の何番目がどの子ダイアログ
なのかとか、配列の空きはあるのかとかです。
配列の代わりとしてCObArrayクラスから派生させてコレクションにするという手もあります。
わからないところがあれば再度、補足をしてください、出来る範囲でお手伝いしますよ。
これからも頑張ってください。
No.4
- 回答日時:
> このやり方が一般的と考えていいのでしょうか?
newで実体を得る方法が一般的ですが、ポインタ変数をグローバル化してしまうのはお行儀が悪い気がします。
グローバル変数ではなく、親ウィンドウ(ダイアログ?)クラスのメンバ変数にしてしまうのがスマートではないかと思います(^_^;
> これは、グローバル変数のところで、dlg[10]のように枚数分設定しておくということなのでしょうか?
あらかじめ枚数が分かっているならそれでも良いと思います。その場合は、枚数の上限を超えて開かれないようにチェックしないといけませんね。
枚数が不定の場合にはリスト構造等でポインタ変数を動的に管理すれば可能だと思います。
要は作ったダイアログ(自分で確保したメモリ)全てを、終了時に確実に破棄できれば良いだけなので、自分で管理しやすいデータ構造を選べばいいと思いますよ。
返答ありがとうございます!
お礼が遅くなってしまって申し訳ありません。
>グローバル変数ではなく、親ウィンドウ(ダイアログ?)クラスのメンバ変数にして>しまうのがスマートではないかと思います(^_^;
すいません、ついついグローバル変数と書いてしまいました。(・・;
メンバ変数のことですよね。
ローカルにしたり、グローバルと言ったり…。
あまりに知らなくて申し訳ないのですが、
リスト構造、データ構造…今の私のレベルからだとかなり難しいことのように
思えます。
枚数を決めてみたものの、変数が登場する度に[]の中の数字をどうするのか
??です。[]の中にint型変数をいれて管理するのでしょうか??
No.3
- 回答日時:
こんにちは。
itohhといいます。動きましたか。良かったですね。(^_^)v
>表示の際のif文3つ{ return;}のところ、削除しました。
これのことでしょうか?
if(pDlgMless->GetSafeHwnd()) {
if(::IsWindow(pDlgMless->m_hWnd)) {
if(pDlgMless->IsWindowVisible()) {
//破棄部分pDlgMless->DestroyWindow();
return;
// returnで脱出しているのに注意。
}
}
}
これは一度、作成されている場合は再作成しないためです。
ですので、これを削除してしまうと、このあとにある
//生成部分
pDlgMless=new CDlgMless(this);
pDlgMless->ShowWindow(SW_SHOW);
で、一つの変数に2個、3個と上書きしていきますからメモリーリークを起こしますよ。
(deleteすることが出来なくなると言うことです。)
(注)関数はMSDNライブラリを参照しましょう。
返答ありがとうございます!
お礼が遅くなってしまって申し訳ありません。
一難去ってまた一難ってかんじです..。(;_;)
>で、一つの変数に2個、3個と上書きしていきますからメモリーリークを起こし>ますよ。
>(deleteすることが出来なくなると言うことです。)
この場合、どうしたらいいのでしょうか??
漠然とした質問で申し訳ありません…。
実はまだプログラムを始めたばかりで、何がどうなっているのか
解らない状態です。
ダイアログを作る度に、変数のアドレスが移動して、deleteできないっていう理解でいいのでしょうか?
今、子ダイアログのほうにdeleteが設定してあるのですが、どこにdeleteを設定していようと、変数が一つなら必ずメモリーリークが起きるということでしょうか?
No.2
- 回答日時:
こんにちは。
itohhといいます。モードレスで作成するのは、結構めんどくさいですよ。
(どのタイミングでWindowを作るのかとか、消す方法は?とか。)
サンプルを作成しようかとも思いましたが、
解説しているHPがありますので、そちらを参照してください。
URL:http://www2s.biglobe.ne.jp/%7Emaekawa/dev/vc/dia …
参考URL:http://www2s.biglobe.ne.jp/%7Emaekawa/dev/vc/dia …
早速の回答、ありがとうございます!!
教えて頂いたHPのソースで作ってみたら、上手くいきました!
解り易いHPですね!
ただ、同じダイアログを複数表示したかったので、
表示の際のif文3つ{ return;}のところ、削除しました。
今のところ問題は無さそうなのですが、このif文は何の為にあるのでしょうか?
No.1
- 回答日時:
ダイアログクラスの実体がローカル変数として宣言されているので、その関数を抜けた時点でウィンドウとメモリが破棄されているだけでは?
この場合はCDlg1型ポインタをメンバ変数で用意しておき、newでインスタンスを得るのが一般的だと思います。
(ダイアログが不要になった場合は、DestroyWindow()後、deleteで破棄します。)
モードレスダイアログを何枚も開く場合は、ポインタ変数の管理が必要ですね。
JPEGファイル表示のほうはネット上にライブラリやソースが落ちてるので、それを参考に自前で表示処理を書いてあげれば可能だと思います。
早速の回答ありがとうございます!!
仰る通り、ローカル変数が原因でした。
CDlg1* dlg; とグローバル変数にし、
dlg = new CDlg1(this);
dlg->ShowWindow(SW_SHOW); としたら上手くいきました!
このやり方が一般的と考えていいのでしょうか?
>モードレスダイアログを何枚も開く場合は、ポインタ変数の管理が必要ですね。
これは、グローバル変数のところで、dlg[10]のように枚数分設定しておくという
ことなのでしょうか?
ポインタがイマイチよく解っていないので、申し訳ありませんが教えて頂けますでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Windows 10 MSアカウントの「個人設定をクラウドから削除します」は機能していないのでしょうか? 1 2022/11/20 17:01
- その他(Microsoft Office) Office(Windows版,Word/Excel/PowerPoint等)にログインできません 4 2022/07/24 15:18
- その他(プログラミング・Web制作) pythonでアプリが終了されたときに特定の処理を実行したい 2 2023/01/19 17:13
- その他(ソフトウェア) UnityのPublishing SettingsでCreate Keyを押しても反応しない 1 2023/06/27 01:03
- C言語・C++・C# Seleniumで「ファイルを開く」ダイアログボックスのフォルダ指定する方法を教えてください。 1 2022/05/09 07:38
- Excel(エクセル) マクロでボタンにつける名前がどこに設定されているかわからないケースがありました。 1 2023/06/19 19:37
- Visual Basic(VBA) Application.Dialogs(xlDialogFileDelete).Showの件 1 2023/02/22 10:02
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
3分あったら何をしますか?
カップ麺にお湯を入れて、できるまでの3分間で皆さんは何をしていますか?
-
モテ期を経験した方いらっしゃいますか?
一生に一度はモテ期があるといいますが、みなさんどうですか? いまがそう! という方も、「思い返せばこの頃だったなぁ」という方も、よかったら教えて下さい。
-
自分の通っていた小学校のあるある
進学したり大人になってから、「あれって自分の小学校だけだったのかな」と思うことありますよね。 逆に「他の小学校ってそんなことするの!?」と思ったり。 そんな「自分の通っていた小学校」のあるあるを教えてください!
-
「黒歴史」教えて下さい
若気のいたりでやってしまったけれど、いまとなっては封印したい… そんなあなたの黒歴史を教えて下さい。
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
ラジオボタンのグループ化
C言語・C++・C#
-
-
4
CStringとString
C言語・C++・C#
-
5
MFC ダイアログ上のID取得について
C言語・C++・C#
-
6
VC++スレッドの正しい終了のさせかた
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
C# Listを使わずに2次元配列の...
-
ExcelVBAで質問です。離れた二...
-
先頭アドレスとは何ですか?
-
VBで構造体の配列を関数に渡す...
-
複数の選択範囲の行番号を個別...
-
CSVファイルのデータを2次元配...
-
C言語初心者 ポインタについて...
-
unsigned char配列への入力の仕方
-
銀行ATMの数字キーの配列
-
VB.netの配列とVB6の配列の違い
-
【速いブラインドタッチ】手を...
-
配列同士の文字列の比較
-
Functionの戻り値を2次元配列...
-
配列の参照渡しで型が一致しま...
-
配列を使わずに、変数名を動的...
-
C# 配列の変数宣言について。
-
C言語 変換指定%sについてです。
-
C++ vectorに配列をプッシュしたい
-
int型をchar型に(右詰で)代入...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
C# Listを使わずに2次元配列の...
-
配列で格納したものをmsgboxで...
-
先頭アドレスとは何ですか?
-
C言語で特定列だけを抽出して配...
-
複数の選択範囲の行番号を個別...
-
配列の参照渡しで型が一致しま...
-
テキストファイルから文字列を...
-
【速いブラインドタッチ】手を...
-
C# 配列の変数宣言について。
-
unsigned char配列への入力の仕方
-
【C言語】配列の中に配列を入れ...
-
VBで構造体の配列を関数に渡す...
-
配列を含む構造体の初期値について
-
C++ vectorに配列をプッシュしたい
-
ExcelVBAで質問です。離れた二...
-
配列をEraseしてもメモリが開放...
-
Functionの戻り値を2次元配列...
-
VB.NET 構造体の配列の検索機能...
おすすめ情報