• ベストアンサー

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

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

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

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

InitInstance()の先頭で、 m_nCmdShow = SW_HIDE; を追加してください。 通常、初期表示状態は、WinMain()の引数nCmdShowによって決まります。 exeのショートカットを作ってプロパティを見ると、”実行時の大きさ”というのがあります。 ここで設定された値がWinMainの引数で渡されてMFCのフレームワークの中でShowWindowがこのパラメータで呼ばれます。 つまり、このパラメータを何が設定されてもSW_HIDEに置き換えてしまおうというのが追加した処理になります。 逆にいうと、外部から制御できないようにしたことになりますので使う際には注意してください。

VitaminBB
質問者

お礼

回答ありがとう御座います。 出来ました。 実はさっき聞いたダイアログの非表示もちらつくのですが、どう対処すればよろしいでしょうか?

VitaminBB
質問者

補足

>外部から制御できないようにしたことになりますので使う際には注意してください。 以下のコードで表示できますが、言われていることは別の意味でしょうか? void CMainFrame::OnKShow() { this->ShowWindow(SW_SHOW); }

その他の回答 (1)

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

>実はさっき聞いたダイアログの非表示もちらつくのですが、 >どう対処すればよろしいでしょうか? モードレスですよね。 ダイアログデザインしたときに、自分でリソースの可視にチェック入れてません? >以下のコードで表示できますが、言われていることは別の>意味でしょうか? ちょっと意味が違いましたね。 別のプロセスからの、作成したexeの起動時の表示状態ということです。 さっき、ショートカットの例を出しましたが、メモ帳や、通常の方法で作成したMFCアプリケーションでは、 ショートカットの”実行時の大きさ”で設定を変えれば、最大化やアイコン化の状態で起動させることができます。 しかし、m_nCmdShowをいじると、ここが無視されるということです。

VitaminBB
質問者

お礼

回答ありがとうございます。 可視にチェック入れてます。 家のPCではチェック入れてもちらつかないので明日会社で確認します。 >m_nCmdShowをいじると、ここが無視されるということです 分かりました。 だってプログラム上からいじれないなんてイヤなんだもの。

関連するQ&A

  • ダイアログのOKボタンを押してウィンドウを生成する方法は?

    ダイアログのOKボタンを押すとウィンドウが生成する方法を教えてください。 MFCでプログラミングしてメインウィンドウをダイアロボックスにしています //アプリケーション class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; //メインダイアログ class CMyDlg : public CDialog { public: CMyDlg(CWnd *pParentWnd=NULL); protected: virtual void OnOK(); virtual void OnCancel(); }; #include <afxwin.h> #include <afxdlgs.h> #include <string.h> #include "dlg.h" #include "resource.h" CMyApp myApp; BOOL CMyApp::InitInstance(){ m_pMainWnd = new CMyDlg; m_pMainWnd ->ShowWindow(m_nCmdShow); m_pMainWnd ->UpdateWindow(); return TRUE; } CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/) { Create("MYDLG"); } としています。 ダイアログはできるのですが、ここからウィンドウを生成する方法を教えてください

  • 非表示のメインウィンドウを表示させるには?

    環境 WIN98 VC++6.0 MFC SDIにて タスクトレイに常駐するアプリにおいて 1.起動時にメインウィンドウを非表示にしています。 2.起動時と同時にダイアログを表示しています。 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; } 3.このような場合に、ダイアログのボタン押し下げにて、メインウィンドウを表示させるには、どうすれば良いでしょうか? 以下のようにしてみましたが、不正な処理で落ちてしまいます。 void CInput::OnButton1() { CWnd* mywnd = (CWnd*)GetParent(); mywnd->ShowWindow(SW_SHOW); }

  • ウィンドウ枠をいちいち作るのがめんどくさい

    ウィンドウの作成の部分を書き出してみました。 BOOL InitInstance(HINSTANCE hInst,int nCmdShow) { HWND hWnd; hWnd=CreateWindow(szClassName, TEXT("文字列を表示する"); WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL); if(!hWnd) return FALSE; ShowWindow(hwnd,nCmdShow); UpdateWindow(hWnd); return TRUE; } 毎回やるのはめんどくさいのでコピー&ペーストでもいいでしょうか? または、覚えた方がいいのでしょうか?

  • ダイアログの表示、非表示の切り替えについて

    環境 WIN98 VC++6.0 MFC SDIにて 1.ポップアップメニューの”ダイアログ作成”をクリックすると、 void CMainFrame::OnKNew() { CInput dlg; int iID = dlg.DoModal(); } として、ダイアログを作成します。 2.次に、ダイアログのボタン押し下げにてダイアログを非表示にします。 void CInput::OnButton1() { ShowWindow(SW_HIDE); } このようなコードにおいて、非表示状態での”ダイアログ作成”クリックでは非表示から表示に切り替えることを実現するにはどのようにすれば良いのでしょうか? よろしくお願いいたします。

  • 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();が原因でちらついていることまでは分かっているのですが、 なぜちらつくのか?ということと、対処方法もしくは別の方法はないのか? 別の方法があればどういったことなのか?ということが知りたいです。 初心者(小学生並み)にもわかるように教えていただければ幸いです。 宜しくお願いします。

  • プロパティーシートでOKボタンを押しても終わらなくするには?

    VC++ Ver6.0  プロパティーシートを使用した場合に自動で表示されるOK、キャンセルのボタンで、OK処理を実行した時は継続して処理を行う事はできないのでしょうか? キャンセル処理だけ終わるようにしたいのです。 BOOL CTESTApp::InitInstance() { AfxEnableControlContainer(); //省略 CPSheet Dialog("テストタイトル"); m_pMainWnd = &Dialog; if (Dialog.DoModal() == IDOK) { // [OK]が押されたときの処理 //処理後は、次のイベント待ちにしたい・・・ } else if (Dialog.DoModal() == IDCANCEL) { // [キャンセル]が押されたときの処理 //何もせず終了する(現状のまま) } return FALSE; }

  • ダイアログの再表示について

    宜しくお願いします。 <環境> WIN98 VC++6.0 MFC  ダイアログのボタン押し下げでウィンドウを生成し、 生成後はダイアログを非表示にしています。 void CInput::OnButton1()//ウィンドウの生成 { UpdateData (TRUE); pWnd = new CMyWnd( this); pWnd->m_left=100; pWnd->m_top=100; m_pAryDlg.Add ( pWnd ); //m_pAryDlg2.Add ( &m_InputData ); pWnd->m_moji=m_InputData; pWnd->Kado_Create(this); ShowWindow(SW_HIDE); //ダイアログの非表示 } ウィンドウをダブルクリックすると、ダイアログが非表示から 表示になるように以下のコードを書きましたが、表示されません。 どのようにすれば表示されるようになりますか? void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point)  //ウィンドウのダブルクリック { CInput* pInput = (CInput*)GetParent(); // CInputは親ダイアログのクラス pInput->ShowWindow(SW_SHOW); CWnd::OnLButtonDblClk(nFlags, point); }

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

    よろしくお願いします。 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にて mmmというプロジェクト名でウィザードに従いダイアログベースのPGを作りました。 下記のようにコードの2箇所にAfxMessageBox("3",MB_OK);を追加しましたが、どちらもメッセージボックスが表示されません。 どうしてなのでしょうか? お分かりも方是非教えてください。 ************************** BOOL CMmmApp::InitInstance() { AfxEnableControlContainer(); #ifdef _AFXDLL Enable3dControls(); #else Enable3dControlsStatic(); #endif CMmmDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); AfxMessageBox("3",MB_OK);//■追加 if (nResponse == IDOK) { AfxMessageBox("3",MB_OK);//■追加 } else if (nResponse == IDCANCEL) { } // ダイアログが閉じられてからアプリケーションのメッセージ ポンプを開始するよりは、 // アプリケーションを終了するために FALSE を返してください。 return FALSE; }

  • MFCでのボタン配置

    ダイアログではなく、直接Windowにボタンを貼り付けるために、AppWizaerdを使用して、MyAppというプロジェクトをつくり、MyAppクラスのヘッダに CButton mybutton を定義し、cppファイルのInitInstance関数内の m_pMainWnd->UpdateWindow();の下に、以下のように記述したところ、 mybutton.Create(_T("OK"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,100), m_pMainWnd, 1); ボタンは表示されるのですが、押しても凹んでくれません。どうしてなのでしょうか?? 環境はWinXP VisualStudio.Net2003です。

専門家に質問してみよう