環境は、VC6.0 WindowsXp ダイアログベースです。
親ダイアログクラスから、
モードレスダイアログを作成すると、
モードレスダイアログのほうが上に表示されると思いますが、
それを逆にする方法はありませんか?
単純に、モードレスダイアログが表示された後に、
親ダイアログをSetActiveWindow()でアクティブにするのはいかがでしょうか?
予め親ダイアログの下に表示するのは。。。どうやるのでしょう?
ごめんなさい、私も分からないです。
BOOL CMy0712Dlg::OnInitDialog()
{
...
// TODO: 特別な初期化を行う時はこの場所に追加してください。
childDialog_.Create(IDD_DIALOG1, GetDesktopWindow());
childDialog_.ShowWindow(true);
return TRUE;
}
解説忘れた。
CMy0712Dlg がメインダイアログ。
childDialog_ がモードレスで背面に表示させたいダイアログで、
これはメインダイアログのメンバ変数にしている。
上のソースは、メインダイアログの表示と同時にサブも表示する場合。
常に親を前面に表示したければ、
SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
を追加するのが早いかと。
三草さん、たいちうさんの方法でも親ダイアログのほうが下に隠れてしまいます。
子を作成した後、以下の関数を実行してもだめでした。
>常に親を前面に表示したければ、
>SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
なにかダイアログのプロパティーの設定とか関係あるんでしょうかね?
> なにかダイアログのプロパティーの設定とか関係あるんでしょうかね?
まず、新しいプロジェクトから試してみました?
デフォルトから一切変えずに。
SetWindowPos()だと、
親のほうが選択された状態になるだけで、
子の下に表示されるのは変わりません。
>まず、新しいプロジェクトから試してみました?
>デフォルトから一切変えずに。
今やってみましたが結果は同じでした。。。
それでは私ではお手伝いできないようですね。
最後に一応手順を書いておきます。
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ダイアログが表示されます。
本題と関係ないけど
> childDialog_.ShowWindow(TRUE);
CWnd::ShowWindowはint型の引数を取るので、SW_~の値を使ったほうがよいのでは。
TRUEが1であるならば、SW_SHOWNORMALになりますけど。
> CWnd::ShowWindowはint型の引数を取るので、SW_~の値を使ったほうがよいのでは。
はい、ご指摘の通りです。私の手抜きです。
引数をTRUE(=1)にすると私の望む結果になることは覚えてましたが、
適切なSW_~は覚えてなかったためです。
>たいちう 2006/07/12(水) 18:55:42
たいちうさんのやり方でできました。
僕のとの違いは
>childDialog_.Create(IDD_DIALOG1, GetDesktopWindow());
のGetDesktopWindow()が【this】になってました。
>>まず、新しいプロジェクトから試してみました?
>>デフォルトから一切変えずに。
>今やってみましたが結果は同じでした。。。
なぜ嘘ついたんでしょうか?
あなたの嘘のせいで、手間を取らしてしまったことを謝罪すべきでは?
>なぜ嘘ついたんでしょうか?
>あなたの嘘のせいで、手間を取らしてしまったことを謝罪すべきでは?
嘘じゃないでしょ?
デフォルトからやってみたよ。