現在、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も見ています
-
【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
【お題】 ・存在しそうで存在しないモノマネ芸人の名前を教えてください
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
ホテルを選ぶとき、これだけは譲れない条件TOP3は?
ホテルを探す時、予約サイトで希望条件の絞り込みができる便利な世の中。 あなたは宿泊先を決めるとき「これだけは譲れない」と思う条件TOP3を教えてください。
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら「ろうそくの数はあなたが好きな人の数です」と言われ浮気者扱いされたことをいまだに根に持っています。
-
タイムマシーンがあったら、過去と未来どちらに行く?
20XX年、ついにタイムマシーンが開発されました。 あなたは過去に行く? それとも未来? タイムマシーンにのって、どこに行って、何をしたいか教えてください!
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
ダイアログ表示時にチェックボックスにチェックされている状態にするには?
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
-
4
ラジオボタンのグループ化
C言語・C++・C#
-
5
UpdateData( FALSE); による文字列データの表示更新(VC++6.0)
C言語・C++・C#
-
6
メモリリークの件
C言語・C++・C#
-
7
コンボボックス表示文字列を取得する場合
C言語・C++・C#
-
8
コンボボックスのドロップダウンリストが表示されない
C言語・C++・C#
-
9
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
10
VC++スレッドの正しい終了のさせかた
C言語・C++・C#
-
11
エディットボックスの入力制限について
C言語・C++・C#
-
12
VC++でUTF-8のファイルを出力したい
C言語・C++・C#
-
13
ダイアログクラスのコントロールを別クラスで参照するには?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を含む構造体の初期値について
-
配列で格納したものをmsgboxで...
-
配列を使わずに、変数名を動的...
-
C# 配列の変数宣言について。
-
配列同士の文字列の比較
-
プログラミング MATLAB
-
【速いブラインドタッチ】手を...
-
任意で決める配列を関数内から...
-
Redimした動的配列はEraseする...
-
構造体から平均点を求める方法
-
C言語初心者 構造体 課題について
-
市販のビンゴカードについて
-
VBで構造体の配列を関数に渡す...
-
2次元配列の、黒いマス目で囲...
-
《C言語 数独》 学校の授業でC...
-
クイックソートがうまくいかない
-
ポインタの配列のコンマについて
-
VB.NET 構造体の配列の検索機能...
-
先頭アドレスとは何ですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
先頭アドレスとは何ですか?
-
C# 配列の変数宣言について。
-
配列で格納したものをmsgboxで...
-
C# Listを使わずに2次元配列の...
-
VBで構造体の配列を関数に渡す...
-
テキストファイルから文字列を...
-
C言語で特定列だけを抽出して配...
-
Excel、VBAのユーザーフォーム...
-
【C言語】配列の中に配列を入れ...
-
配列を含む構造体の初期値について
-
unsigned char配列への入力の仕方
-
複数の選択範囲の行番号を個別...
-
【速いブラインドタッチ】手を...
-
配列の参照渡しで型が一致しま...
-
ExcelVBAで質問です。離れた二...
-
VB.NET 構造体の配列の検索機能...
-
VBでC言語のポインタみたい...
-
Redimした動的配列はEraseする...
おすすめ情報