• 締切済み

モードレスダイアログ

お世話になっております。 VC2005を使用しております。 メインウィンドウの他にモードレスダイアログを常時表示させたいと 考えております。 ダイアログのプロパティのTopmostをTrueにすると常時手前に表示されるのですが、メインウィンドウを最小化したり、他のプログラムを起動した時も常に前面に表示されてしまいます。 メインウィンドウと同じように動作するにはどうすればよいのでしょうか?教えてください。 よろしくお願いします。

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス >メインウィンドウを最小化したり、  ↑  WM_SIZE メッセージを処理してアイコン化(SIZE_MINIMIZED)になるときに  Topmost 属性を解除します。また、元(SIZE_RESTORED)のサイズに戻るときには  Topmost 属性を設定するようにします。  http://www.winapi-database.com/Message/WM/WM_SIZE.html >他のプログラムを起動した時も常に前面に表示されてしまいます。  ↑  WM_ACTIVATE メッセージを処理して非アクティブになるときに  Topmost 属性を解除します。アクティブになったときは  Topmost 属性を設定するようにします。  http://www.winapi-database.com/Message/WM/WM_ACTIVATE.html  http://www.winapi-database.com/Message/WM/WM_MOUSEACTIVATE.html ・あと動的に Topmost 属性を解除、設定するには  (1)GetWindowLong() 関数で拡張ウインドウ・スタイル(GWL_EXSTYLE)を取得  (2)取得した拡張ウインドウ・スタイルから Topmost 属性(WS_EX_TOPMOST)をリセット  (3)SetWindowLong() 関数で拡張ウインドウ・スタイル(GWL_EXSTYLE)を設定  (4)SetWindowPos() 関数で SWP_FRAMECHANGED を指定して反映させる  の手順で行います。  http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_getwindowlong.asp  http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_setwindowlong.asp  http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_setwindowpos.asp ・以上。

cappcino
質問者

お礼

いつもお世話になっております。 親切なご回答ありがとうございます。 確認させていただきます。 今後ともよろしくお願いします。

関連するQ&A

  • モードレスダイアログをクリックして親を表示したくない

    初めまして。 VC++ win32で開発をしていますが、 モードレスダイアログをCreateDialogで作成し、ShowWindow(TRUE)で表示後、 他のアプリケーションを別プロセスで使用しているときにTOPMOSTで表示している上記ダイアログをクリックすると、親のウィンドウが表示されてしまいます。 これを抑止することはできないのでしょうか。 C#.NETだとできるようなのですが。 よろしくお願いいたします。

  • VC++でモードレスダイアログ

    突然で申し訳ありません。 VC++でアプリケーションを作成しているのですが、 メインフレームからモードレスダイアログを表示するまではよかったのですが、モードレスダイアログボックスの裏に隠れたメインフレームをどうやっても表に表示できません。リソースファイルでの設定がいろいろあるようで、やってみたのですが、うまくいきません。 どなたか知っている方がいらっしゃいましたら、無知な私にご教授願えないでしょうか。 宜しくお願いいたします。 因みにダイアログのプロパティは 「タイトルバー」と「システムメニュー」をチェックしてあるだけです。。。。。 お願いします。

  • モードレスダイアログについて

    いつもお世話になっています。 WIN98 VC++6.0 MFC モードレスダイアログにおいて、 子ダイアログが表示されていても親ダイアログの操作が出来ますが、親ダイアログを子ダイアログの前に持ってくるにはどうすれば良いのでしょうか?

  • WPFでのモーダル/モードレスダイアログの同時操作

    WPFでメインウインドウからモードレスダイアログとモーダルダイアログを表示し、 それぞれのダイアログに対して操作をしたいと思っています。 1.メインウインドウのボタンをクリックしてモードレスダイアログを表示 2.メインウインドウのボタンをクリックしてモーダルダイアログを表示 上記2の処理を行うと、上記1で表示したモードレスダイアログが一切操作を受け付けなく なるのですが、対応方法はありますでしょうか? 仕様上、片方のダイアログは必ずモーダル表示にします。 ソースコードは以下のような感じです。 private Window2 window2; private void button1_Click(object sender, RoutedEventArgs e) { window2 = new Window2(); window2.Show(); } private void button2_Click(object sender, RoutedEventArgs e) { Window window3 = new Window3(); window3.ShowDialog(); } よろしくお願いいたします。

  • モードレスダイアログをメインウインドウの上にもって来るには?

    モードレスダイアログはクリックすると、メインウィンドウの上に来ますよね。 また、メインウィンドウをクリックするとダイアログの上にきます。 これを、メインウィンドウをクリックするとメインウィンドウはアクティブになるけれど、ダイアログの上に来ないようにしたいのですが、どうすれば良いですか?

  • 複数のモードレスダイアログを表示したい

    開発環境 Windows XP Visual C++6.0 親ウインドウの、メニューから複数のモードレスダイアログを 表示しようとしています。 <ソースの抜粋> void CSmp1View::OnDialog1() { static Modaless aaa; static tagRECT bbb; aaa.Create(NULL,"Moderess",NULL, bbb ,this,IDD_DIALOG1,NULL); aaa.ShowWindow(SW_SHOW); } モードレスダイアログは、表示できるのですが 2つ目のダイアログを表示しようとすると 異常終了します。 また、1つめのダイアログを終了してから、メニュバーから モードレスダイアログを表示しようとしても 同じエラーで異常終了します。 また、任意のモードレスダイアログを閉じたときに 何か気をつけることがあるでしょうか? 参考コードなどがありましたら ご教授ください。 よろしくお願いします。

  • 起動時のメインウィンドウのアクティブ化

    お世話になっております。 VC2005を使用しております。 モードレスダイアログ(ポップアップ)を起動時から表示させて処理を行っております。 起動時に、モードレスダイアログがアクティブになってしまい、メインウィンドウがアクティブになりません(枠の色が薄い) どのようにすれば、メインウィンドウがアクティブで起動するのでしょうか? 教えてください。 よろしくお願いします。

  • 複数のModelessDialogの終了

    メインダイアログと複数のモードレスダイアログがあるアプリがあります。 そのうちの一つのモードレスダイアログに終了ボタンがあり、ボタンが押されるとメインダイアログにSendMessageにて通知して、メインダイアログからモードレスダイアログをDestroyWindowにて終了させ、各モードレスダイアログの変数にNULLをセットするのですが、その後終了ボタン処理に戻ってしまい、Access Violationとなってしまいます。 普通こういう構成のアプリケーションの場合、どういった手段を用いるのが妥当でしょうか。 例えばSendMessageではなくPostMessageを使う等…。 「自分ならこうする」でも結構ですので教えて頂ければと思います。 環境:Windows7+VC9

  • モードレスダイアログ ボックスの破棄について

    はじめまして。 VC++6.0でアプリケーションを開発していますが、モードレスダイアログの破棄の事で困っています。 まずアプリケーションの状況から説明します。 メインフレームを親として、複数の子ダイアログボックスが大量にある状態です。 1つのプロセスで使用している画面数、コントロール数とも膨大な為、子ダイアログを使うたびに作成→破棄(メモリの解放)を繰り返すようにしたいと思っています。 Create 関数で作成したダイアログ ボックスを破棄するには、CWnd::DestroyWindow 関数を使えばいいようですが、この関数を使用すればメモリの解放もされているのでしょうか? タスクマネージャを見る限り、メモリの使用量は減っていないようなのですが・・・ NSDNなどで色々調べたのですが、CWnd::PostNcDestroy関数も合わせて使用し、delete this としないとメモリの解放は出来ないのかどうかが、いまいち良く分かりません。 残り時間がほとんどなく、本当に困っています。 どなたかよろしくお願いいたします。

  • エクセルVBAのフォームを最前面にする方法を教えてください。

    エクセルVBAなのですが、UserForm1を最前面に表示して、 他のどのウインドウをアクティブにしても消えない状態にしたいのですが、 どのようなコードを書けばできるでしょうか。 VB.NETで表すとMe.TopMost = Trueとなると思うのですが、 エクセルVBAだとそのような書き方はないようです。 もうしわけございませんがご教示頂きたく、お願いいたします。m(__)m

専門家に質問してみよう