モードレスダイアログを親ダイアログの下に表示するには?

[戻る]
大三元 2006/07/12(水) 17:02:46
環境は、VC6.0 WindowsXp ダイアログベースです。

親ダイアログクラスから、
モードレスダイアログを作成すると、
モードレスダイアログのほうが上に表示されると思いますが、
それを逆にする方法はありませんか?

三草 2006/07/12(水) 17:44:03
単純に、モードレスダイアログが表示された後に、
親ダイアログをSetActiveWindow()でアクティブにするのはいかがでしょうか?

予め親ダイアログの下に表示するのは。。。どうやるのでしょう?
ごめんなさい、私も分からないです。

たいちう 2006/07/12(水) 17:58:03
BOOL CMy0712Dlg::OnInitDialog()
{
    ...
    
    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    childDialog_.Create(IDD_DIALOG1, GetDesktopWindow());
    childDialog_.ShowWindow(true);

    return TRUE;
}

たいちう 2006/07/12(水) 18:02:20
解説忘れた。

CMy0712Dlg がメインダイアログ。
childDialog_ がモードレスで背面に表示させたいダイアログで、
これはメインダイアログのメンバ変数にしている。

上のソースは、メインダイアログの表示と同時にサブも表示する場合。

常に親を前面に表示したければ、
SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
を追加するのが早いかと。

大三元 2006/07/12(水) 18:10:29
三草さん、たいちうさんの方法でも親ダイアログのほうが下に隠れてしまいます。

大三元 2006/07/12(水) 18:17:15
子を作成した後、以下の関数を実行してもだめでした。
>常に親を前面に表示したければ、
>SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
なにかダイアログのプロパティーの設定とか関係あるんでしょうかね?

たいちう 2006/07/12(水) 18:22:29
> なにかダイアログのプロパティーの設定とか関係あるんでしょうかね?

まず、新しいプロジェクトから試してみました?
デフォルトから一切変えずに。

大三元 2006/07/12(水) 18:22:33
SetWindowPos()だと、
親のほうが選択された状態になるだけで、
子の下に表示されるのは変わりません。

大三元 2006/07/12(水) 18:36:07
>まず、新しいプロジェクトから試してみました?
>デフォルトから一切変えずに。
今やってみましたが結果は同じでした。。。

たいちう 2006/07/12(水) 18:55:42
それでは私ではお手伝いできないようですね。
最後に一応手順を書いておきます。

1.アプリケーションウィザードで、ダイアログで作成。
    (プロジェクト名は0712_2)
    後に隠れてしまうので、メインダイアログより大きくする。

2.リソースビューのダイアログのフォルダで右クリックし、
    ダイアログの挿入を選択。

3.クラスウィザードを開き、「クラスの追加」で新規クラスの作成を選ぶ。
    (ここでは、クラス名CChildDialog)

4.0717_2Dlg.hに、以下を追加。
    #include "ChildDialog.h"  // これと

    class CMy0712_2Dlg : public CDialog
    {
        CChildDialog childDialog_;  // これを追加。
        
5.CMy0712_2Dlg::OnInitDialog()の最後を、このように変更。
        // TODO: 特別な初期化を行う時はこの場所に追加してください。
        childDialog_.Create(IDD_DIALOG1, GetDesktopWindow());
        childDialog_.ShowWindow(TRUE);
        SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | 
SWP_NOSIZE);
        return TRUE;  // TRUE を返すとコントロールに設定したフォーカ
スは失われません。
    }
    
これで、実行すると、私の環境(WinXP VC6)では、
"ダイアログ"ダイアログの手前に"0712_2"ダイアログが表示されます。

Blue 2006/07/12(水) 19:09:59
本題と関係ないけど
> childDialog_.ShowWindow(TRUE);
CWnd::ShowWindowはint型の引数を取るので、SW_〜の値を使ったほうがよいのでは。
TRUEが1であるならば、SW_SHOWNORMALになりますけど。

たいちう 2006/07/13(木) 04:15:57
> CWnd::ShowWindowはint型の引数を取るので、SW_〜の値を使ったほうがよいのでは。

はい、ご指摘の通りです。私の手抜きです。
引数をTRUE(=1)にすると私の望む結果になることは覚えてましたが、
適切なSW_〜は覚えてなかったためです。

大三元 2006/07/13(木) 08:51:15
[[解決]]
>たいちう 2006/07/12(水) 18:55:42
たいちうさんのやり方でできました。
僕のとの違いは
>childDialog_.Create(IDD_DIALOG1, GetDesktopWindow());
のGetDesktopWindow()が【this】になってました。

錯和 2006/07/13(木) 09:52:19
>>まず、新しいプロジェクトから試してみました?
>>デフォルトから一切変えずに。
>今やってみましたが結果は同じでした。。。
なぜ嘘ついたんでしょうか?
あなたの嘘のせいで、手間を取らしてしまったことを謝罪すべきでは?

大三元 2006/07/13(木) 12:57:13
>なぜ嘘ついたんでしょうか?
>あなたの嘘のせいで、手間を取らしてしまったことを謝罪すべきでは?
嘘じゃないでしょ?
デフォルトからやってみたよ。

錯和 2006/07/13(木) 13:04:29
> 嘘じゃないでしょ?
じゃあ、どうして、GetDesktopWindow()がthisになっていたんでしょうか?
どこで、thisにしろって書いてありますか?

ITO 2006/07/13(木) 13:13:39
>なぜ嘘ついたんでしょうか?
>あなたの嘘のせいで、手間を取らしてしまったことを謝罪すべきでは?
 多分、見落していたんだと思います。
 結果嘘をついたことになったとしても、行為的でないことは確かです。
>嘘じゃないでしょ?
>デフォルトからやってみたよ。
 錯和さんが言っていることは、きついけど、
 誤ってたのだから一言たいちうさん・三草さんに言って
 おいたほうがいいと思います。

大三元 2006/07/13(木) 14:09:04
[[解決]]
>じゃあ、どうして、GetDesktopWindow()がthisになっていたんでしょうか?
>どこで、thisにしろって書いてありますか?
そんなことは書いてないですよ。
Createに関しては最初参考にしたソースがthisになっていたので使ってました。
thisとGetDesktopWindow()の違いが一瞬同じだと認識したのでそこを変更しようとは思
わなかったんですよ。実際thisでも今回のことをやりたい場合以外は問題なかったし、

たいちうさん、thisを使ってるとは思わなかったでしょう!?すいません。
結果的に、最後の手順のおかげでthisとGetDesktopWindow()の違いに気づきました。
ありがとうございます。

錯和さん、
どう思ったにせよ、済のスレ&題名と関係のない質問はやめてもらいたいです。
それに答えてるほどみなさん暇じゃないですよ!
相手の目を見ながら会話してるわけじゃないんだから
勘違いは多々あるものですよ。
これからそういう発言には一切コメントしません。
以上

傍観人 2006/07/13(木) 14:18:33
またこの展開。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200606/06060020.txt

REE 2006/07/13(木) 14:24:15
>勘違いは多々あるものですよ。

錯和さんの嘘発言も、勘違いだったわけです。

それ以外に関しては、指摘する時には、[済]の有無は関係ないし、
題名に一致していなくても、話の流れに沿っていますので問題ないでしょう。

asd 2006/07/13(木) 15:05:23
#いまさら横槍を入れるのもあれですけど

> Createに関しては最初参考にしたソースがthisになっていたので使ってました。

デフォルト=最初参考にしたソースという勘違いをしていたわけですね

> thisとGetDesktopWindow()の違いが一瞬同じだと認識したのでそこを変更しようとは思
> わなかったんですよ。実際thisでも今回のことをやりたい場合以外は問題なかったし、

自分では分からないから質問をしたわけですよね?
そういう場合には思い込みはすごく危険だと思います。

まずは書かれている通りにやってみる。
それでできなければ自分の環境に合わせて改変してみる。
それでもダメならその過程を説明してさらに説明を求める。
こうすれば間違い、勘違いにもすぐに気がつけるのではと思います。

嘘つきと言われてムッとするのは分かりますが、
お互い勘違いしていたわけですから、
次からはご自分が書いたソースを貼ったらどうでしょうか?
このスレで大三元さんは一回もソースを貼られてないですよね。

そんな状態で高圧的な態度を取られても説得力がないばかりか
心証を悪くするだけです。

たいちう 2006/07/13(木) 16:03:04
私の意見も書かせてもらうと、

> たいちうさん、thisを使ってるとは思わなかったでしょう!?すいません。
> 結果的に、最後の手順のおかげでthisとGetDesktopWindow()の違いに気づきました。
> ありがとうございます。

見落としなどによって私の書いたとおりにされていない可能性は考えていました。
最初に書いたコードは作成途中で少し試行錯誤があったので、
私側の確認の意味も含めての手順まとめです。

どんなに丁寧な手順まとめを書いても、質問者の先入観・横着などのために、
同じ失敗をされるケースもあるでしょうが、
大三元さんは解決したということで何よりです。
これで解決できなければ、何か環境が違うのか先入観を払拭できないのか、
どちらにしても私にはできることはありませんでした。


掲示板の利用の仕方については、
今回の大三元さんには全く問題はないと私は感じています。
まあ、私とは違う感じ方をする人もいますので、
[解決]のときに謝意とともに不注意のお詫びもしたほうがベターでしょう。

私が質問者の時にはそうすると思います。無難ですから。
私が回答者の時にはそうされないでも不満には思いません。不毛ですから。

大三元 2006/07/13(木) 19:54:29
>見落としなどによって私の書いたとおりにされていない可能性は考えていました。
>私が質問者の時にはそうすると思います。無難ですから。
>私が回答者の時にはそうされないでも不満には思いません。不毛ですから。
これに関しては文章から伝わってました。


>[解決]のときに謝意とともに不注意のお詫びもしたほうがベターでしょう。
同意見です。以後、気をつけます。
ありがとうございます。

僕の意見は、
今回の場合、
錯和さんは話に入ってもいないのに
突然現れて謝罪しろとか言われるのは気分よくないですね。
>あなたの嘘のせいで、手間を取らしてしまったことを謝罪すべきでは?
謝罪文を記述しなかったことは事実ですが、
謝罪する気持ちがなかったわけではないし、
書き忘れたと言うのが正解でしょう。
それに、
俺が言うのはたいちうさんには申し訳ないですが
結果論として不満には思ってなかったみたいだし
やっぱり余計なお節介だと思います。
本人同士の問題だし。

まとめると、
錯和さんの発言を無視するのが一番よかったのかな!?

ITO 2006/07/13(木) 20:31:42
>結果論として不満には思ってなかったみたいだし
>やっぱり余計なお節介だと思います。
不満には思っていなかったみたいですが、逆に理解してくれたと
ほっとしてもらえると思います。
>謝罪文を記述しなかったことは事実ですが、
>謝罪する気持ちがなかったわけではないし、
求める人もいるかもしれませんが、そこまでは必要でないと思います。
僕も「一言」と書いたのは、「間違ってました。」の一言が必要かなと
思ったからです。

ITO 2006/07/13(木) 21:55:25
追加です。

回答者側からすると、謝罪文より大三元さんが書かれた次の文がありがたいです。
>結果的に、最後の手順のおかげでthisとGetDesktopWindow()の違いに気づきました。
>ありがとうございます。

古いスレッドには追加発言できません。