EDGE2のツールバーカスタマイズ周りを実装中なんですが、
カスタマイズとは関係無い部分でおかしな部分が見つかりました_| ̄|○

もし解決策、回避策などが解る技術者の方がおられましたら、
私まで連絡をお願いします。

#Microsoftに質問メール送る方法が解らなかった_| ̄|○
 プロフェッショナルサポートとか契約してないとメールで質問出来ないのかな~?
 変わりにMSへ問い合わせてくれる人でも構いません(^^ゞ

症状1 ツールバードッキングで嫌な感じ (解決したかも?)

→問題部分のみを抽出したプロジェクトファイルはこちら(40KB)
(Visual C++6.0が必要です)
VisualC持ってないけど見てみたいという方はこちらをどうぞ。

プロジェクトの主な作成手順は次の通りです。

  1. ウィザードでMFC→MDIアプリケーションを作成(他の設定はそのまま)
  2. CMainFrame::OnCreateにて
    1. ツールバーを5個以上作成する
    2. 作成したツールバーで、最初の2個だけを残し、残りのツールバーをShowControlBar(・・・,FALSE, TRUE);で非表示する
    3. また、症状がわかり易くなるように、ここでダイアログバーを一つ作成しています。(無くても症状は発生します)
  3. ビルドし、実行します。

症状の再現方法は次の通りです。

  1. EXEを実行します。
    050312_00

    ツールバー5個中、2個が表示されています。
    050312_01

  2. 上のツールバーを、ダイアログバーの下へドラッグ&ドロップしてドッキングさせます。
    050312_02

    すると、普通にドッキングします。
    050312_03

  3. さて、ここでもう一つのツールバーを、さきほどのツールバーの横へドラッグ&ドロップしてドッキングさせようとすると・・・

    050312_04

    下にずれる。
    050312_05

これが嫌な症状です。
ちなみに、がんばると(ちょっとダイアログバーへめり込むようにドロップすると)、隣へドッキングさせることも出来るのですが、また少しずらそうとすると、一段下がった場所へ勝手に配置されてしまいます。

二つしかツールバーが無い程度ならばいいのですが、それが複数になって、隣へ配置出来なくなるのは、ツールとしての使い勝手が悪くなる要因ともなりかねませんので、解決したいところです。

ツールバーは5個中2のみ表示、と書きましたが、5個全て表示したり、最初から2個しか
作らなかった場合には、これらの症状は発生しません。

症状が発生しない期待通りの実行ファイルはこちら

MFC側の不具合のような気もするのですが、もしそうであっても直したい部分ではあります^^;

(20:00 追記)
きよのさんからメールを頂きまして(有難うございます!)
Visual C++ 6.0 Enterprise Edition SP6では症状が発生しないとの情報を頂きました。
ちなみに私の環境は
Visual C++ 6.0 Professional Edition SP6です。
MFCのソースが異なるんでしょうかね~_| ̄|○
もう少し追ってみます。

(20:24 追記)
と思ったらEnterprise Editionでも症状が確認されたようです(^^;
更にはVisual C++ .NET Professional 2003でも再現したそうです_| ̄|○

ツールバーの表示方法とか作成方法が間違ってるのかなぁ、と不安になってきました。

(3/13 0:55 追記)
解決したかも?明日解決方法などを紹介します。

あ、掲示板のSISTさんサンクス!
たしかにでにくくなってましたが、いろいろやっているうちに症状が再現してました。

症状2 ツールサイズ変更でアプリがフリーズ (解決しました!)

こちらはだいぶ解りやすい症状です^^;

→問題部分のみを抽出したプロジェクトファイルはこちら(40KB)
(Visual C++6.0が必要です)
VisualC持ってないけど見てみたいという方はこちらをどうぞ。

プロジェクトの主な作成手順は次の通りです。

  1. ウィザードでMFC→MDIアプリケーションを作成(他の設定はそのまま)
  2. CMainFrame::OnCreateにて、デフォルトで作成されたツールバーの状態をいじり、ドロップダウンボタンをいくつか追加する(2つぐらいあると症状が発生しやすい)
  3. ビルドし、実行します。

症状の再現方法は次の通りです。

  1. EXEを実行します。
  2. ツールバーをドラッグ&ドロップし、浮かせます(ドッキングを解除)
    050312_06

    050312_07

  3. あとは、その浮いたツールバーの上の部分を上へドラッグするとフリーズします。
    050312_08

ドロップダウンボタンが2つぐらい有ると起こる症状のようです。
フリーズ状態でVCのブレークを実行すると、CToolBar::SizeToolBarやらCToolBar::CalcSizeで無限ループに陥っているのかなぁ、というように思えます。
各関数にvirtualがついていないので、単純にオーバーライドして値をTRACEさせるという技も使えず^^;

こちらもMFC側の不具合のような気もするのですが、もしそうであっても直したい部分ではあります。

(追記)
CToolBar::CalcDynamicLayoutがvirtualになっていましたので、オーバーライドし、その中で使用されている関数などをMFCのソースからコピペ、問題を探ったところ、
CMyToolBar::SizeToolBarの中で無限ループに陥っていることが解りました。

無限ループにならないように、勝手にreturnしてみたのですが、これで良いのやら・・・
→修正後のプロジェクトファイルはこちら

        while (sizeMin.cx < sizeMax.cx)
        {
            sizeMid.cx = (sizeMin.cx + sizeMax.cx) / 2;
            WrapToolBar(pData, nCount, sizeMid.cx);
            sizeMid = CalcSize(pData, nCount);

// ここの判定分を追加してみた by takabo soft
#if 1
            if (sizeMax == sizeMid) {
                return;
            }
#endif

            if (nLength < sizeMid.cy)
            {
                if (sizeMin == sizeMid)
                {
                    WrapToolBar(pData, nCount, sizeMax.cx);
                    return;
                }
                sizeMin = sizeMid;
            }
            else if (nLength > sizeMid.cy)
                sizeMax = sizeMid;
            else
                return;
        }

(20:00 追記)
きよのさんからメールを頂きまして(ありがとうございます)、MSのサポートサイトにて解決策があると教えていただきました!
http://support.microsoft.com/default.aspx?scid=kb;ja;190501
すっきりです(笑)

記事検索

アーカイブ