ドッキングツールバーのつまみ部分の背景がおかしくなる

[戻る]
2005/02/09(水) 18:28:28
こんにちは
いつもお世話になっております

まず環境です
WinXP、VC++6.0、MFC、SDI

現在AppWizardで作成したSDIプログラムを改造しているところなのですが、
そのドッキングツールバーにおかしなところを見つけました

まずこの画像を見てください
http://www95.sakura.ne.jp/~ayu/sdi.jpg

このようにツールバーを移動させるためのつまみ部分の背景が描画されず、
その部分にウインドウを重ねたりしたときに重なっていたウインドウの
描画内容がそのまま残ってしまうのです

最初は仕様(バグ?)なのかと思って試しに別のプロジェクトで
SDIプログラムを作成してみたのですが、再現されませんでした

そのときに気がついたのですが、クライアント領域の境界線が
画像ではわかりにくいのですが青い1本線になってしまっていました
しかし試しに作成した方のプログラムでは内側にへこんだような
立体的な境界線でした

ウインドウのスタイルなどは一切いじっていないはずなのに
いつの間に変わってしまったのかまったく見当がつきません

また、現在作成しているプログラムでは、CSplitterWndを使ってフレームを分割してい
て、
それが原因かと思ってフレーム分割の処理があるCMainFrame::OnCreateClient()を丸ご
と消し、
CTreeViewを派生元としたViewのみを表示させるようにしてみましたが変わりませんでし
た

ちなみにViewでの処理は、初期化処理を含めて全てコメントアウトしてみましたがだめ
でした

なにぶんMFCを使うのは初めてなもので、いまいち原因を探りきれずにいます
何かアドバイスをいただけないでしょうか?
よろしくお願いします

シャノン 2005/02/09(水) 22:32:18
XP のビジュアルスタイルを有効にしていると、そんな現象が出たような…

2005/02/09(水) 22:49:07
[[解決]]
シャノンさん、レスありがとうございます

確かにXPビジュアルスタイルを適用するためにリソースにmanifestファイルを組み込ん
でありました
で、それをはずしてみると例の現象は発生しなくなりました

考えてみたらサンプルで作成してみたSDIプログラムはXPスタイルを適用させていなかっ
たので
現象が再現されなかったのでしょう・・・

まったく同じ状況で再現するかどうか試したつもりでしたが、
まさかそんなところに原因があったとは・・・盲点でした・・・

クライアント領域の1本線とへこんだような境界線の違いも
確かにビジュアルスタイルだと考えると全てが納得いきます
まだXPを導入して時間が経っていないので思い至らなかったようです

ちなみに同じようにドッキングツールバーを使っているフリーソフトを見てみたところ
同じようにXPビジュアルスタイルの場合のみで
例のツールバーのつまみ部分の描画がおかしくなっていました

原因はそこらあたりでまず間違いないようです

的確なご指摘感謝します
どうもありがとうございました

Takahashi 2005/02/10(木) 09:05:38
もう調べちゃったかもしれないけど、一応書いておきますね。
こうすればツールバーが正常になります。

<修正する前>
    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;      // 作成に失敗
    }

<修正後>
    if (!m_wndToolBar.CreateEx(this, 0, 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;      // 作成に失敗
    }
    m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT); // 追加!

シャノン 2005/02/10(木) 09:32:58
> こうすればツールバーが正常になります。

へぇー。確かに。
でも、まだ万全じゃないみたいです。

> ツールバーのボタンの上で、マウスの両方のボタンを押し下げると
> ハングしてしまうのであきらめました。

> ちなみにクラッシックにしても、manifest があるとハングして
> しまいます。manifest ファイルを消せば、大丈夫なんです。。。。

http://forums.belution.com/ja/vc/000/067/12s.shtml

Takahashi 2005/02/10(木) 11:30:25
ああ、そういえばそうでしたね。
URL等、補足ありがとうございます。

# まあ、普通両方押さないから気づかなかったけどWindows XP SP2 でも未だに直ってな
いようですね。
# さっき試してみたら、やっぱりハングした。(^_^;

2005/02/10(木) 12:54:15
Takahashiさん、シャノンさん、レスありがとうございます

実は「ビジュアルスタイルの不具合ならしょうがないか・・・」と思い
半ば諦めてこのままでいいかなと思っていたところでした

ですが追加で書き込まれた情報とリンク先の情報を元にいくつか実験をしたので
その報告をします

まずTakahashiさんに教えていただいた方法を試してみました
CreateExでスタイルを指定せずに、作成後にModifyStyleでTBSTYLE_FLATを追加したとこ
ろ
描画の不具合はなくなりました

最終的にまったく同じスタイルになっているのではないかと思うのですが、
なぜこうするとうまく行くのは少し謎ですね・・・

また、左右のボタン同時押しによる不具合のチェックもしてみました

結果としては、やはり止まってしまいます
が、なんというかアプリ自体が完全にハングするというわけではないみたいです

ツールバーのボタン左右同時クリック
   ↓
ツールバーのほかのボタンを押すと押し下げ状態の表示で固定され、
ボタンを押した時の処理は成されない
   ↓
このとき、キーボード操作は一切受け付けなくなるようで、
Alt+Fなどのメニュー操作や、Alt+F4も受け付けなくなる
ただしAlt+TABは通常通り動作する
   ↓
この状態でそのウインドウ内のツールバー以外の領域をクリックすると、
不正終了することがある
   ↓
不正終了していない場合なら、
一度ウインドウを非アクティブにしてから再びアクティブにすると、
また操作できるようになる

だいたいこのような感じでした
原因とかはさっぱりわけわかりませんけど

それとツールバーではないのですが、
いろいろ試していたとき某IRCクライアント(XPビジュアルスタイル未対応)
にこちら側でmanifestファイルを作成しXPビジュアルスタイルを適用させたところ、
1行エディットで一度入力した文字を消したときに、
データ上は消えているが描画内容だけ残ってしまうという不具合が起こってました

実験報告は以上のような感じです

このような場合、ビジュアルスタイルを適用させたいのならば
この不具合は避けて通れないということなのでしょうね
Microsoft側で対応するのを待つしか・・・?

しかしビジュアルスタイルには対応させておきたいので、
上記の方法で対処しておくことにします

どうもありがとうございました

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