windowを常に手前にしたい

このQ&Aのポイント
  • 親ウインドウから子ウインドウを呼び出して、常に子ウインドウを手前にし、かつ常にアクティブにしたい
  • ソースコードを使って子ウインドウを手前に表示しようとしているが、うまくいかない
  • DoModalではなくCreateを使用して子ウインドウを表示している
回答を見る
  • ベストアンサー

windowを常に手前にしたい。

すみません。教えてください。 [環境] windows2000 visual c++6.0 [内容] 親ウインドウから子ウインドウを呼び出して、常に子ウインドウを手前にし、かつ常にアクティブにしたいのですが、うまくいきません。 [ソース] 親ウインドウ : : : CSysCp02Dlg2* frm02Dlg; frm02Dlg = new CSysCp02Dlg2(); frm02Dlg->Create(IDD_SYSCP02_DIALOG,NULL); frm02Dlg->ShowWindow(SW_SHOW); : : (裏で処理をする) :  delete frm02Dlg; (処理の終了) [ソース]子ウインドウ : : :  this->SetActiveWindow();  this->SetWindowPos(&wndTop,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); : : : イメージ的には、DoModalで子ウインドウを表示し、裏の親ウインドウで処理をしたいのです。(もちろんDoModalでは無理なので、Createをしていますが....) どなたかご存知の方いらっしゃいましたら、ご教授お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>親ウインドウから子ウインドウを呼び出して、常に子ウインドウを手前にし、かつ常にアクティブにしたいのですが、うまくいきません。 常にアクティブってのは、他のアプリにも制御を移させないってことですか? >frm02Dlg->Create(IDD_SYSCP02_DIALOG,NULL); 第二パラメータで親ウィンドウを指定してもだめですか? http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_mfc_cdialog.3a3a.create.asp 常にアクティブってのがアプリ内のことであれば、Createのあとで、EnableWindowで親ウィンドウを使用不可にしちゃえばあとはOKかな。

poposan
質問者

お礼

遅くなって申し訳ありません。 ありがとうございました。 うまくいきました。

関連するQ&A

  • フォームのサイズを変更したいです。

    フォームビューにて、 void CProject2View::OnBnClickedButton1() { this->SetWindowPos(&wndTop,0,0,100,100,SWP_NOMOVE); } とすると、スクロールバーが表示されるだけです。 タイトルのことをするにはどうすればいいですか? よろしくお願いします。

  • 実行中のプログラムが自分を隠すため

    そうしたい場所で SetWindowPos(hW,HWND_NOTOPMOST,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE); としたのですが(hWはこのプログラムのメインウィンドウ)一旦はかくれるもののすぐに自分が前面に現れます どうしたら他の1つのプログラムのウィンドウに隠れた状態にする事ができるでしょうか?

  • モードレスダイアログの作成方法

    以下のようにダイアログを作る場合、    dlg = new CMyDlg(this); ・・・1    dlg->Create(IDD_DIALOG1,this); ・・・2 それぞれのコードでthisを渡していますが、1で渡すthisと2で渡すthisは生成されるダイアログにどう影響をあたえるのですか? 両方とも親のウインドウを指示してると思うのですが、2回も指示するのはおかしいと思います。 また、1で何を与えようが、2でまた与えたら2が優先されて1で与えた意味が無い気がします。

  • SetWindowPosについて

    こんにちは。以前のスレッドを何件か拝見して、私の事象がないようなので、投稿します。背面フォーム内の処理をタイマ割込みやループなどで処理しつつ、その前面でフォームを表示する場合、SetWindowPosのAPIが有効というところまでは分かっているのですが、私の場合、割り込みによるビットのON/OFFをしたいと思ってロジックを組んでいるのですが・・・ どうしてもモーダルフォームを前面表示したときと同じように、背面での処理が走ってくれません・・・ ロジックですが、前面フォームのイベントを sub Form_Load() SetWindowPos(frm_ctrl.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE) end sub のように行っています。アンロード時にハンドルの設定は解除してあります。 タイマ割込みの処理が他者作成のため、目下処理が不明なのですが、こちらの方もAPIを使用しているかもしれません。 情報が少なくて恐縮ですが、この内容で解決の手掛かりとなる事をご教授頂けると幸いです。

  • MFC、ダイアログベースでのモードレス作成

    現在、MFCで検索プログラムを作成しています。 始めはDoModalで作成していたのですが、ダイアログを閉じずに、ダイアログを複数並べて見たいという意見が出た為、モードレスで作成し直そうとしたところ、ダイアログが現れてくれません。 インターネットで見つけたソースを試してみたのですが、上手くいきません。 どなたか教えて頂けますか? =ダイアログに移るボタンコードに= CDlg1 dlg; dlg.Create(IDD_DIALOG1, this); dlg.ShowWindow(SW_SHOW); (dlg.DestroyWindow();は他に記述) 1. 上記では、ShowWindowに0が返ってしまい、一瞬ダイアログが映って 消えてしまいます。Createは1が返ってるのでいいかと思いますが…。 2. あと、違うソースで試したところ、ダイアログは表示できるものの、 一回消してしまうと、もう一度ボタンを押しても再度は表示されません。 しかも、Destroy()を設定したOKボタンでは強制終了となってしまいます。 モードレスで作成すると、一回そのダイアログを消してしまうと再度表示ができないのでしょうか? モードレスってただ他の処理ができるというだけで、そのダイアログを何枚も表示させておくことはできないのでしょうか? 3. このダイアログにjpegファイルを表示させているのですが、ダイアログベース・htmlView以外で表示させれる方法がありましたら教えて下さい。 よろしくお願いします。

  • SendMessage();の使い方

    よろしくお願いします。 <環境> WIN98 VC++6.0 MFC SDIにてウィンドウをクリックすると、モードレスダイアログ1とモーダルダイア ログ2が開くようにしました。 void CMy222View::OnLButtonDown(UINT nFlags, CPoint point) { CDlg1 *dlg; dlg = new CDlg1; dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); CDlg2 dlg2; dlg2.DoModal(); CView::OnLButtonDown(nFlags, point); } ダイアログ2のボタン押し下げにてダイアログ1のボタン1を押し下げたいのですが 、どのようにすれば実現できるのでしょうか? void CDlg2::OnButton2() { SendMessage(); //■ここの書き方が分かりません CDialog::OnOK(); } 宜しくお願いいたします。

  • 子ウィンドウを常に手前表示、親ウィンドウは操作させない

    まず親ウィンドウから、子ウィンドウを新しく開きます。 そして、子ウィンドウを常に手前で表示させて、親ウィンドウは触れない、というPAGEを作成したいのですがわかりません。 どなたか教えてください。

  • 非アクティブのウィンドウを最前面に呼び出したい。

    右ダブルクリックで呼び出すランチャプログラムを作成したいのですが、 システムフックをかけてWM_RBUTTONDBLCLKをアプリ側に送り,それに反応させる形でランチャのウィンドウを最前面に持ってきたいのですが上手くいきません。 フックされたメッセージが送られてきた場合の処理は以下のようになっています。 ~省略 case WM_USER+100: //ダブルクリックが送られてきた場合のメッセージコード //任意文字列を別ウィンドウのリストボックスに吐く自作関数 Add("dblclk"); //以下でウィンドウを最前面に持ってくる。 //lpにクリックされた座標が入っている SetWindowPos(hWnd , HWND_TOP,(int)LOWORD(lp),(int)HIWORD(lp), NULL,NULL,SWP_NOSIZE|SWP_SHOWWINDOW); SetForegroundWindow(hWnd); UpdateWindow(hWnd); break; ~省略 このコードの場合、ウィンドウの位置は変更されるのですが、最前面に来てくれません。 Add関数が呼ばれているのでフック自体は成功しているようなのですが、何かおかしな点はありますでしょうか?

  • 変数の代入について

    ダイアログベースで、ダイアログ1からダイアログ2を開きダイアログ1のエディットボックスのデータをダイアログ2に表示する下記コードを教わりました。 変更後のようにしても問題ないと思いましたが、'dlg' は定義されていない識別子です。とエラーが出ます。 どうしてなのかお教えていただきたいのですが、 よろしくお願いします。 <変更前> CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); <変更後> void CSubDlg::OnPaint() { m_strText = dlg.strText; ちなみにdlgはウィザードが作ったコードで、 CMainDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); ダイアログ1のことだと思うのですが。。。。 ************************** メインダイアログとしてCMainDlgを例にしますが、かなり割愛します。 このダイアログには、Editが貼り付けられているとします。Editコントロールに割り当てたIDをIDC_EDIT_INPUTだと仮定します。 DDXとかのデータ変換を使う方法もありますが、ここでは単にデータを取得します。 // // OKボタンが押された時の処理 // void CMainDlg::OnOK() { // データの取得 CString strText; GetDlgItemText(IDC_EDIT_INPUT, strText); CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); } class CSubDlg : pbulic CDialog { public: CString m_strText; // 親から渡される文字列を格納する変数 ・ ・ ・ ・ ・ }; あとは、CSubDlgのOnPaintでテキストを描画します。 void CSubDlg::OnPaint() { // テキストをクライアント領域の中央に描画 CRect rect; GetClientRect(rect); CPaintDC dc(this); dc.TextOut(m_strText, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); }

  • ダイアログを終了させてもハンドルが1つ増加したまま。。。

    VC++のMFCを使ってダイアログベースのEXEを造っています。 ハンドルのリークが発生し、困っています。 <動作内容> メインのダイアログで、ボタン押下により別のダイアログを表示します。 DoModal()でモーダルダイアログを作成します。 別のプロセスからブロードキャストされるメッセージを処理したいため、 ボタン押下のルーチンで DoModal() せずに、スレッドを作成し、 そのスレッドで DoModal() を実行しています。 スレッド作成は AfxBeginThread() を使用しています。 <サンプルソース> ●メインダイアログ // ボタン押下のルーチン void CTestModalDlg::OnButton1() { AfxBeginThread( TestDlgThread, (LPVOID)this, THREAD_PRIORITY_NORMAL ); } // スレッド static UINT TestDlgThread(LPVOID pThis) { CTestDlg1 Dlg; Dlg.DoModal(); } ●DoModal() で表示されるダイアログ 何も手を加えてない、デフォルトのまま。 <結果> DoModal() で表示されたダイアログを CDialog::OnCancel() で終了させ、 メインのスレッドが終了しても、ハンドルカウントが1つ増加しています。 Sleep() を入れて値をみてみると、 ・スレッド作成:2増加 ・DoModal() でダイアログ表示:1増加 ・OnCancel() で終了:増減なし ・スレッド終了:2減少 =>結果、1増加となっていました。 以下のパターンでは問題ありませんでした。 ・スレッドを作成+終了(ダイアログ表示しない) ・スレッドを作成せずに、ボタン押下ルーチンから DoModal() でダイアログ表示+終了 ということで、AfxBeginThread()、DoModal() 自体は問題ないのですが、 スレッドを作成して DoModal() するとリークが発生します。 識者の方、原因、対策など、ご教授願います。

専門家に質問してみよう