ツールバーとステータスバーについて

[戻る]
wood 2002/11/29(金) 08:08:29
VC++6.0(SP5) MFC XP(SP1)

AppWizard(MFC.EXE)でスケルトン生成しステータスバーのみを使用したくて
ツールバーは不要と思い下記のように2箇所だけコメント化しました

コンパイル・リンクは通り実行できたのですが 終了時(ウィンドウ クローズ)に

>Debug Assertion 
>barstat.cpp 
>Line: 239
に成ります

質問の書き込みしながら思ったのですが
>m_wndStatusBar.Create(this)
これの記述に問題があるのでしょうか?
またはほかに修正しなければいけないところあるのでしょうか?

ここが原因(ステータスバー)で「Debug Assertion」に成ったと分かっただけで
まだほかのWEB検索等はしていません

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
---------------  ここから コメント化 1 ----------------------
    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE 
| CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
        TRACE0("Failed to create toolbar\n");
        return -1;      // 作成に失敗
    }
---------------  ここまで       1--------------------------
    if (!m_wndStatusBar.Create(this) ||
        !m_wndStatusBar.SetIndicators(indicators,
          sizeof(indicators)/sizeof(UINT)))
    {
        TRACE0("Failed to create status bar\n");
        return -1;      // 作成に失敗
    }

    // TODO: ツール バーをドッキング可能にしない場合は以下の3行を削除
    //       してください。


---------------  ここから コメント化    2-------------------
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar);
---------------  ここまで          2-------------------
    return 0;
}


実は
>wood 2002/11/27(水) 06:37:28
>MSDNの検索「CMainFrame」について
はこの質問に関連(自分的には)したものなんですけどね

皆さんよろしく、ご教授くださいませ

こん! 2002/11/29(金) 09:03:26
試してみました。
 結果から言って問題ないようです。こちらでも同様の部分をコメントアウトし実行してみまし
たがエラーはでませんでした。(終了時にも)
 ついでにAppWizardで生成する時にドッキングツールバーのチェックをはずしてスケルトンを
作ってみましたがやはり違いはそのコメントアウトした部分が無いだけのようです。

こん!<=^・^=>

NEG(ねぐ) [E-Mail] [HomePage] 2002/11/29(金) 09:38:11
 せっかくAssertionが出てるのだから、そっちから調べたらどうでしょうか?

 見たぶんにはステータスバー関連で出てるので、ツールバーは関係ないようですね。
 BARSTAT.CPPの以下の行で発生しています。

        VERIFY((BOOL)DefWindowProc(SB_GETBORDERS, 0, (LPARAM)
&rgBorders));

wood 2002/12/01(日) 22:06:07
こん!さん、NEG(ねぐ)さん
ご返信ありがとうございます

シングルドキュメント・シングルビューだとエラーになりませんが
シングルドキュメント・複数ビューだとエラーに成ります

起動時に「ビュー」が登録動作するたび「BARSTAT.CPP」によばれているようで
今のところ的は絞れていません

サンプルにしているのは「VSWAP32」です

AfxGetMainWnd()->PostMessage(WM_CLOSE);
で終了させるとエラーになり

ウィンドウの「×」で終わらせるとエラーになりません
今こんな状況です

こん! 2002/12/01(日) 23:39:56
> 起動時に「ビュー」が登録動作するたび「BARSTAT.CPP」によばれているようで
> 今のところ的は絞れていません

> サンプルにしているのは「VSWAP32」です

 お見受けしたところこのサンプルは、アプリケーションクラスのInitInstance()で、切り替
えて使うビューを2つCreate()しているようですが終了処理はしていないようでした。

> AfxGetMainWnd()->PostMessage(WM_CLOSE);

はどういった経緯でどこに追加されたのでしょうか?
最初はAppWizardの吐き出すスケルトンだという話だったと思うのですが・・・

こん!<=^・^=>

wood 2002/12/02(月) 07:32:59
[[解決]]
こん!<=^・^=> さん、NEG(ねぐ)さん、ごめんなさい

テスト版でも同じ現象出ていたので最初の書き込みになりましたけど
やはり本来の目的のアプリケーション直せなくては意味がないので
途中で話題のソースプログラム変更してしまいました

解決しました

こんなアプリケーション作っていたんですけど

ビュー1(CRecordView):アプリケーションへのログイン画面(終了ボタンあり) こ
こでエラー発生
ビュー2(CFormView) :アプリケーションのメニュー画面 (終了ボタンあり) こ
こはエラーにならない
ビュー3から24:ビュー2のメニューボタンからのそれぞれの機能で終了ボタンなし

今はメインフレームの「メニュー・ファイル・アプリケーションの終了」が付いていま
すが最終的に削除する予定でいます

ずいぶん前に「アプリケーションをボタンを押したら終了するには」のような質問した
時に教えてもらったので使ってました
AfxGetMainWnd()->PostMessage(WM_CLOSE);

MSDNで「WM_」メッセージをよく調べたら「WM_QUIT」と言うものがあり
ました

ビュー1で
AfxGetMainWnd()->PostMessage(WM_CLOSE);
を
AfxGetMainWnd()->PostMessage(WM_QUIT);
に変更したらエラーも出ず終了してくれました


参考にMSDNは英語だったんですけど
翻訳ソフト使って参考にした結果です(いいまわし変ですけど)

>プラットフォームSDK:Windowsユーザーインターフェイス
>WM_QUIT
>WM_QUITメッセージは、アプリケーションをターミネートするために、
>要求を示し、アプリケーションがPostQuitMessage機能を呼ぶ時には生成されます。
>それはGetMessage機能に0を戻させます。
>ウィンドウはそのWindowProc機能を通じてこのメッセージを受け取ります。

>WM_QUITメッセージはウィンドウと関連せず、従って、決してウィンドウの
>ウィンドウ手続を通じて受け取られません。
>それはGetMessageまたはPeekMessage機能だけにより取り戻されます。
>ポストメッセージ機能を使ってWM_QUITメッセージを投稿しないでください;
>PostQuitMessageを使ってください。

YuO [E-Mail] 2002/12/02(月) 08:02:24
解決となっていますが……。

> ビュー1で
> AfxGetMainWnd()->PostMessage(WM_CLOSE);
> を
> AfxGetMainWnd()->PostMessage(WM_QUIT);
> に変更したらエラーも出ず終了してくれました

WM_QUITをPostMessageで投げるのはやめた方がよいですよ。
元々WM_QUITはメッセージループを終了させるためのものです。
#専用のPostQuitMessageってAPIもあります。

メッセージループが終了するということは,
WM_CLOSEもWM_DESTROYもウィンドウに来ないまま,
ウィンドウが強制的に破棄されることになります。
WM_CLOSEやWM_DESTROYで共有リソースの解放処理を行っているのであれば,リソースがリークしてしまいます。

いきなりWM_QUITを投げるのは,TerminateProcessと同じような暴挙と考えた方がよいです。

古いスレッドには追加発言できません。