EDGE2のツールバーカスタマイズ周りを実装中なんですが、
カスタマイズとは関係無い部分でおかしな部分が見つかりました_| ̄|○
もし解決策、回避策などが解る技術者の方がおられましたら、
私まで連絡をお願いします。
#Microsoftに質問メール送る方法が解らなかった_| ̄|○
プロフェッショナルサポートとか契約してないとメールで質問出来ないのかな~?
変わりにMSへ問い合わせてくれる人でも構いません(^^ゞ
症状1 ツールバードッキングで嫌な感じ (解決したかも?)
→問題部分のみを抽出したプロジェクトファイルはこちら(40KB)
(Visual C++6.0が必要です)
VisualC持ってないけど見てみたいという方はこちらをどうぞ。
プロジェクトの主な作成手順は次の通りです。
- ウィザードでMFC→MDIアプリケーションを作成(他の設定はそのまま)
- CMainFrame::OnCreateにて
- ツールバーを5個以上作成する
- 作成したツールバーで、最初の2個だけを残し、残りのツールバーをShowControlBar(・・・,FALSE, TRUE);で非表示する
- また、症状がわかり易くなるように、ここでダイアログバーを一つ作成しています。(無くても症状は発生します)
- ビルドし、実行します。
症状の再現方法は次の通りです。
- EXEを実行します。
ツールバー5個中、2個が表示されています。
- 上のツールバーを、ダイアログバーの下へドラッグ&ドロップしてドッキングさせます。
すると、普通にドッキングします。
- さて、ここでもう一つのツールバーを、さきほどのツールバーの横へドラッグ&ドロップしてドッキングさせようとすると・・・
下にずれる。
これが嫌な症状です。
ちなみに、がんばると(ちょっとダイアログバーへめり込むようにドロップすると)、隣へドッキングさせることも出来るのですが、また少しずらそうとすると、一段下がった場所へ勝手に配置されてしまいます。
二つしかツールバーが無い程度ならばいいのですが、それが複数になって、隣へ配置出来なくなるのは、ツールとしての使い勝手が悪くなる要因ともなりかねませんので、解決したいところです。
ツールバーは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持ってないけど見てみたいという方はこちらをどうぞ。
プロジェクトの主な作成手順は次の通りです。
- ウィザードでMFC→MDIアプリケーションを作成(他の設定はそのまま)
- CMainFrame::OnCreateにて、デフォルトで作成されたツールバーの状態をいじり、ドロップダウンボタンをいくつか追加する(2つぐらいあると症状が発生しやすい)
- ビルドし、実行します。
症状の再現方法は次の通りです。
- EXEを実行します。
- ツールバーをドラッグ&ドロップし、浮かせます(ドッキングを解除)
- あとは、その浮いたツールバーの上の部分を上へドラッグするとフリーズします。
ドロップダウンボタンが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
すっきりです(笑)