• ベストアンサー

MFC:モードレスダイアログの最小化を抑制したい

現在MFCでUI処理を書いているのですが、親Windowを指定していないモードレスダイアログをCreateしてShowWindow(SW_HIDE)などとやっています。このモードレスダイアログがメインフレームの最小化とともに最小化されてしまい、これを抑制したいのですがいまいち方法がわかりません。検索してみたのですが見つけられませんでした。SetWindowPosあたりで無理やりできるのかなと思っているところなのですが、どなかたよろしければご教授ください。

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

  • ベストアンサー
  • FAY
  • ベストアンサー率49% (95/193)
回答No.1

m_HogeDialog.Create(CHogeDlg::IDD); とかなってるのを m_HogeDialog.Create(CHogeDlg::IDD, GetDesktopWindow()); とするとか。

crysis5375
質問者

お礼

FAYさんのおっしゃるように、明示的にCWnd::GetDesktopWindowを呼んで親ウィンドウにしてやったところ解決しました。 Spy++で見ると親ウィンドウをNULLでCreateしたときにも確かにデスクトップの下にあるようなんですけどねぇw

関連するQ&A

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

    開発環境 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つめのダイアログを終了してから、メニュバーから モードレスダイアログを表示しようとしても 同じエラーで異常終了します。 また、任意のモードレスダイアログを閉じたときに 何か気をつけることがあるでしょうか? 参考コードなどがありましたら ご教授ください。 よろしくお願いします。

  • MFCタブコントロールのグラデーション描画

    現在、VC++2010・MFC環境でMFCのタブコントロールのウィンドウ部(?)をグラデーション描画にしたいと考えています。 完成予想としては、Excelのメニュー(?)みたいな感じでグラデーションがかかるような感じにしたいのですが、現在、グラデーションの描画は何とか(たぶん無理やり)できましたが、タブを切替たり、ダイアログ自体が非アクティブ/アクティブを繰り返すとちらついてしまいます。 ソースは以下のようになっています。 ----------------------------------------------------------------- void CTabGradDlg::OnTcnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: ここにコントロール通知ハンドラー コードを追加します。 int sel = m_xcTab.GetCurSel(); m_edit1.ShowWindow(SW_HIDE); m_edit2.ShowWindow(SW_HIDE); m_button1.ShowWindow(SW_HIDE); m_button2.ShowWindow(SW_HIDE); switch(sel) { case 0: m_edit1.ShowWindow(SW_SHOW); m_button1.ShowWindow(SW_SHOW); break; case 1: m_edit2.ShowWindow(SW_SHOW); m_button2.ShowWindow(SW_SHOW); break; } Invalidate(); *pResult = 0; } void CTabGradDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CDialogEx::OnActivate(nState, pWndOther, bMinimized); // TODO: ここにメッセージ ハンドラー コードを追加します。 switch( nState ) { case WA_INACTIVE : // 非アクティブ break; case WA_ACTIVE : // (マウスをクリックする以外の方法) アクティブ case WA_CLICKACTIVE : // (マウス クリック)アクティブ Invalidate(); break; } } ----------------------------------------------------------------- Invalidate();が原因でちらついていることまでは分かっているのですが、 なぜちらつくのか?ということと、対処方法もしくは別の方法はないのか? 別の方法があればどういったことなのか?ということが知りたいです。 初心者(小学生並み)にもわかるように教えていただければ幸いです。 宜しくお願いします。

  • MFC VC++6.0 DestroyWindowの実装場所について

    [開発環境]:Visual C++ 6.0 現在、Visual C++ 6.0を使ったプログラミングの勉強をしています。 MFC AppWizard (exe)でSDIプログラムのtest1プロジェクト作成後、メインフレームにボタンを実装し、そのボタンを押下するとモードレスダイアログを表示するというアプリケーションを作っているのですが、ダイアログを終了させる時のDestroyWindowの実装場所と実装方法が分かりません。 ダイアログ用のクラスはCmyDialogとしていますが、ダイアログの終了ボタンを実装した場合、そのボタン処理の中すなわちCmyDialogクラスのなかの関数で行うべきなのでしょうか?それともダイアログの作成と同様にメインフレームがわの処理(CTest1Viewクラスでの処理?)として行うべきなのでしょうか?この場合にはどのような場所でどのようなタイミングで実装すればよいのか分かりません。 ご存じの方、これらについて御教授お願いします。 以下プログラムの一部を記載します。 -test1view.cppの一部-(ここでダイアログの作成と表示をしています) void CTest1View::OnButton1() { CmyDialog* myDLG = new CmyDialog; myDLG->Create(IDD_DIALOG1,this); myDLG->ShowWindow(SW_SHOW); }

  • CColorDialogの拡張について

    始めまして。質問させて下さい。 VC++ 2005 MFCで開発しております。 CColorDialogのサブクラスを作成しています。 ダイアログ上にあるコントロールのVisibleを変更させようと思い、 サブクラスのOnInitDialogで CButton *pBtnOK = ( CButton* )GetDlgItem( IDOK ); CButton *pBtnCancel = ( CButton* )GetDlgItem( IDCANCEL ); if( pBtnOK != NULL ){ pBtnOK->ShowWindow( SW_HIDE ); } if( pBtnCancel != NULL ){ pBtnCancel->ShowWindow( SW_HIDE ); } としています。 「色の作成」ボタンのも同様の処理をしたいのですが、 コントロールIDがわからないため実装できません。 IDをご存じの方はいますでしょうか? また、別の方法等ございましたらご教授お願い致します。

  • ウィンドウハンドルの取得方法について

    よろしくお願いします。 WIN98 VC++6.0 MFC にて 色々勉強しておりますが、今だにウィンドウハンドルの取得方法が良く分かりません。 SDKのサンプルを見ると、なるほどそうするのか。と思いますが、MFCになると分からなくなります。 たとえば、 ウィザードのデフォルトに従いダイアログベースでのプロジェクトを作成し、ボタン1と2を配置します。 以下のコードでボタン1を非表示にできます。 void CPppDlg::OnButton2() { CWnd* pButton1 = GetDlgItem (IDC_BUTTON1); pButton1->ShowWindow(SW_HIDE); } このコードにおいて、 1.SDKの BOOL ShowWindow( HWND hWnd, // handle to window int nCmdShow // show state of window ); を用いて引数が2個の形式に書きかえることは可能でしょうか? 2.可能であれば、具体的にはどう記述すれば良いのでしょうか?

  • ウィンドウ非表示のちらつきを無くすには

    <環境> WIN98 VC++6.0 MFC SDIにて 起動時に下記にてウィンドウを非表示にしていますが、最初に一瞬表示されてから、消えます。 何事も無かったかのように、こっそりと非表示にするにはどうすればよいですか? BOOL CAbcApp::InitInstance() { 省略 //m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->ShowWindow(SW_HIDE); m_pMainWnd->UpdateWindow(); return TRUE; }

  • 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以外で表示させれる方法がありましたら教えて下さい。 よろしくお願いします。

  • タスクトレイのアイコンが消えてしまう。

    こんにちは。 今、タスクトレイに常駐するプログラムを作成しています。 プログラム起動するとすぐ、メインウインドウとタスクトレイにアイコンが 表示されます。 メインウインドウ右上の最小化ボタンまたは、終了ボタンを押すと メインウインドウが消えてタスクトレイのアイコンだけが残るように したいと考えています。 最小化ボタンの場合はWM_SIZEをキャッチして、ShowWindow(hwnd, SW_HIDE) で、メインウインドウだけ消え、タスクトレイのアイコンは残ります。 しかし、終了ボタンの場合は、WM_DESTROY をキャッチし、同じくShowWindow(hwnd, SW_HIDE) でメインウインドウを消しているのですが、メインウインドウだけでなく、 アイコンも消えてしまいます。アイコンを消さずに残すようにしたいのですが、 どうしたらよいでしょうか。WM_DESTROYでは、PostQuitMessage(0)はポストして おらず、最後にreturn 0;を返しています。 どうぞよろしくお願いします。 環境 BCC、WindowsXP、C言語、Win32 API

  • 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をしていますが....) どなたかご存知の方いらっしゃいましたら、ご教授お願いいたします。

  • 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(); } 宜しくお願いいたします。

専門家に質問してみよう