モードレスダイアログの表示について

解決


あいや  2009-01-26 20:22:41  No: 69498

お世話になります.環境はXP, VS2008C++, MFCです.

ビュー画面上でマウスを左クリックすると,モードレス
ダイアログ画面が表示され,[OK]ボタンを押すと消える 
ようなプログラムを作ったのですが,モードレスダイア
ログ画面が常に最前面に表示されてしまい,ビュー画面
を見たいときに邪魔になってしまいます.現在はモード
レスダイアログ画面のプロパティシートの[Minimize Box]
をtrueにして対処していますが,できれば

(1)ビュー画面をクリックすると,ビュー画面が前面に現れる.
(2)ビュー画面の背後に一部が現れているダイアログ画面を
   クリックすると再びダイアログ画面が前面に現れる.
(3)ダイアログ画面がビュー画面の陰に完全に隠れているとき
   は画面下のタスクバーにダイアログ画面のアイコンが表示
   され,これをクリックするとダイアログ画面が前面に表示
   される.

のようにしたいです.どのようにやればこうできるのか
アドバイスをお願いします.

なお,モードレスダイアログクラスをCmdlsとすると,

CxxxViewクラスのコンストラクタで
    m_pCmdls = new Cmdls;

デストラクタで
    delete m_pCmdls;

CxxxViewクラスのOnLButtonDownハンドラ内で

   if( !m_pCmdls->GetSafeHwnd() ) {
      m_pCmdls->Create(this);
   }
   m_pCmdls->ShowWindow(SW_SHOW);

CmdlsダイアログクラスのOnClose()ハンドラ内で
    DestroyWindow();
    //CDialog::OnClose();

また, CmdlsクラスのCreate関数は

Cmdls::Create(CWnd* pParent)
{
    m_pParent=pParent;
    return CDialog::Create(IDD_DIALOG1, pParent);
}
としています.


subaru  2009-01-26 23:04:57  No: 69499

ダイアログのオーナーがビューになっているからです。
Createするときに親をデスクトップ(GetDesktopWindow)に
してみましょう。


あいや  2009-01-27 00:57:12  No: 69500

subaruさん、ありがとうございます。

CxxxViewクラスのOnLButtonDownハンドラ内で

   if( !m_pDlg->GetSafeHwnd() ) {
      m_pDlg->Create( GetDesktopWindow() );
//    m_pDlg->Create(this);
    }

とやったところ、うまくいきました。


あいや  2009-01-27 01:01:23  No: 69501

すみません.

↑ダイアログオブジェクト名が m_pDlg となっていますが,
m_pCmdlsの間違いです.


あいや  2009-01-27 03:59:45  No: 69502

またまた間違えて...orz

ダイアログオブジェクト名がm_pDlgとなっていますが,
m_pCmdlsの間違いです.
      ↓
ダイアログオブジェクトを指すポインタ名がm_pDlgとなっていますが,
m_pCmdlsの間違いです.


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加