MFCアプリケーションでウインドウを非表示にするには?

解決


斎藤。  2002-10-15 16:52:11  No: 50457  IP: [192.*.*.*]

以下のステップで作成したプログラムのダイアログウインドウが
非表示になりません。

新規作成にてMFC AppWizard(exe)を選択。
プロジェクト名はHideWindow1とします。
作成するアプリケーションの種類はダイアログベースです。
その他は全てデフォルトです。
リソースヴューでダイアログを右クリックしプロパティを表示します。
その他のスタイルで 可視 のチェックを外します。
その状態でビルドし,Debug\HideWindow1.exeを実行しても
ウインドウが表示されてしまいます。
さらに CHideWindow1Dlg::OnInitDialog() で return TRUE; の
直前に ShowWindow(SW_HIDE); を入れたのですが表示されてしまいます。

正しい非表示の方法を教えてください。

編集 削除
斎藤。  2002-10-17 10:08:26  No: 50458  IP: [192.*.*.*]

済みません。環境を書くのを忘れていました。
Windows2000Pro, VC++6.0+SP5 です。

ダイアログのプロパティで「可視」のチェックを外しているのに
ビルドして実行すると,ダイアログが表示されてしまう理由だけでも
よいので,ご存知の方ご教授ください。

編集 削除
Mnow  2002-10-17 17:31:09  No: 50459  IP: [192.*.*.*]

ちょっと姑息ですが

MoveWindow(0,0,0,0);

編集 削除
斎藤。  2002-10-17 18:04:48  No: 50460  IP: [192.*.*.*]

同じような考え方で,
OnInitDialog()で,

SetWindowPos(&wndBottom, 0, 0, 0, 0, SWP_HIDEWINDOW);

とかやって,しのいでいますがタスクバーには残ってしまいます。
(SWP_HIDEWINDOWが動作していない。)
ダイアログにボタンをつけ,押すと

SetWindowPos(&wndBottom, 0, 0, 0, 0, SWP_HIDEWINDOW);

を実行するように書いてみると,今度はタスクバーからも,画面上からも
消えてくれます。
これを起動時にやりたいのですが。。
なんで表示されてしまうのか分かりません。

編集 削除
Mnow  2002-10-17 18:21:44  No: 50461  IP: [192.*.*.*]

Win32 Application => 標準的な"Hello World!"アプリケーション
InitInstance で ShowWindow( hWnd, SW_HIDE ); だと
期待に沿えるようですね

編集 削除
斎藤。  2002-10-17 18:37:09  No: 50462  IP: [192.*.*.*]

そうですね。
MFCのダイアログベース以外のプロジェクトだと,起動時に
非表示が出来るみたいです。。

編集 削除
斎藤。  2002-10-17 19:40:29  No: 50463  IP: [192.*.*.*]

以下のURLを参考にしたら,起動時からダイアログが表示されなくなりました。
http://isweb34.infoseek.co.jp/computer/ptvi/vc/p_0000023.html

やったこと。
[HideWindow1Dlg.h]
// インプリメンテーション
protected:
  HICON m_hIcon;

  // 生成されたメッセージ マップ関数
  //{{AFX_MSG(CHideWindow1Dlg)
  virtual BOOL OnInitDialog();
  afx_msg void OnPaint();
  afx_msg HCURSOR OnQueryDragIcon();
  afx_msg void OnWindowPosChanging(WINDOWPOS * lpwndpos);//追加
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()

(2)[HideWindow1Dlg.cpp]
BEGIN_MESSAGE_MAP(CHideWindow1Dlg, CDialog)
  //{{AFX_MSG_MAP(CHideWindow1Dlg)
  ON_WM_PAINT()
  ON_WM_QUERYDRAGICON()
  ON_WM_WINDOWPOSCHANGING()//追加
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()

(3)[HideWindow1Dlg.cpp]
//以下の関数を追加
void CHideWindow1Dlg::OnWindowPosChanging(WINDOWPOS * lpwndpos)
{
    lpwndpos->flags &= ~SWP_SHOWWINDOW;
    CDialog::OnWindowPosChanging(lpwndpos);
}

編集 削除
斎藤。  2002-10-18 10:17:15  No: 50464  IP: [192.*.*.*]

lpwndpos->flags &= ~SWP_SHOWWINDOW;

の部分はフラグで通したり,通さなかったりすれば,
以後のShowWindow(SW_SHOW)も有効になります。
一応解決ということにします。
Mnowさん,おつきあいありがとうございました。

編集 削除
コンドル  2021-10-21 07:06:22  No: 149889  IP: [192.*.*.*]

VC6.0 SP6 Windows10 21H1 タイマーでHIDEしなくてもできました。ありがとうございます。

編集 削除