モードレスダイアログを親ダイアログの下に表示するには? – プログラミング – Home

モードレスダイアログを親ダイアログの下...
 
通知
すべてクリア

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

固定ページ 1 / 2

大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

環境は、VC6.0 WindowsXp ダイアログベースです。

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


引用未解決
トピックタグ
三草
 三草
(@三草)
ゲスト
結合: 19年前
投稿: 56
 

単純に、モードレスダイアログが表示された後に、
親ダイアログをSetActiveWindow()でアクティブにするのはいかがでしょうか?

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


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

BOOL CMy0712Dlg::OnInitDialog()
{
...

// TODO: 特別な初期化を行う時はこの場所に追加してください。
childDialog_.Create(IDD_DIALOG1, GetDesktopWindow());
childDialog_.ShowWindow(true);

return TRUE;
}


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

解説忘れた。

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

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

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


返信引用
大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

三草さん、たいちうさんの方法でも親ダイアログのほうが下に隠れてしまいます。


返信引用
大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

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


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> なにかダイアログのプロパティーの設定とか関係あるんでしょうかね?

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


返信引用
大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

SetWindowPos()だと、
親のほうが選択された状態になるだけで、
子の下に表示されるのは変わりません。


返信引用
大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

>まず、新しいプロジェクトから試してみました?
>デフォルトから一切変えずに。
今やってみましたが結果は同じでした。。。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

それでは私ではお手伝いできないようですね。
最後に一応手順を書いておきます。

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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> CWnd::ShowWindowはint型の引数を取るので、SW_~の値を使ったほうがよいのでは。

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


返信引用
大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

>たいちう 2006/07/12(水) 18:55:42
たいちうさんのやり方でできました。
僕のとの違いは
>childDialog_.Create(IDD_DIALOG1, GetDesktopWindow());
のGetDesktopWindow()が【this】になってました。


返信引用
錯和
 錯和
(@錯和)
ゲスト
結合: 18年前
投稿: 5
 

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


返信引用
大三元
 大三元
(@大三元)
ゲスト
結合: 18年前
投稿: 54
Topic starter  

>なぜ嘘ついたんでしょうか?
>あなたの嘘のせいで、手間を取らしてしまったことを謝罪すべきでは?
嘘じゃないでしょ?
デフォルトからやってみたよ。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました