デュアルモニター環境で、MFCで作ったアプリをメインモニター側に出して、アプリのツールーバー(CToolBar)をドラッグすると、枠がメインモニター側に表示されずに、サブモニター側に枠と残像が表示されるという現象が、ここ最近出はじめた。
どうやらWindows 11 24H2のバグのようだが、MFC(Microsoft Foundation Class)という枯れた技術を使ったアプリなため、ネットで騒がれることもなく、問題視されていない。動作速度が重要視されるCAD界隈で少し話題になっており、おいらも自分とこのCADで現象が出ることを確認し、最初は自分とこだけの問題かと怪しんだが、VisualStudioのウィザードで作った簡単なアプリでも再現したので一般性のある問題だと確信できた。アプリはこんな。
ツールバーをドッキングしている分には問題ない。マウス操作でドラッグしてフローティング状態にしようとすると枠が表示されずに、ドラッグを完了させるべくマウス左ボタンをはなすと指定位置に移動されている。メインモニターではそんな挙動となるのに対して、左側にあるサブモニターで枠と残像が表示されている。つまり、メインモニターの左側にサブモニターがあると現象が顕著になるということ。1がサブモニターで、2がメインモニター。
サブモニター側の残像はこんな感じ。ドラッグ終了時に消えることもあるし、消えないこともある。アクティブウインドウ切り替えで消えるので、ずっと残っているわけでもない。
以下、実装面での考察。MFCのツールバークラスはCToolBar。ドラッグ時に中身が表示されずに枠しか出ないという動きなので、今っぽくなくて昔々から使われてきた過去の遺跡なのかもしれない。CMFCToolBarというクラスもあって、こっちであればこの問題がおきないのはわかっている。ただ、CToolBarをCMFCToolBarに置き換えるだけではダメで、親クラスのCMainFrameの継承元をCFrameWndからCFrameWndExに変えるなど、周囲を取り巻く関係クラスをごっそりと変更しなければいけないっぽい。つまり、PG実装面から回避することは容易ではないということ。
さて、この問題についてマイクロソフトさんはいつ直してくるだろうか。おいらが積極的に働きかけるつもりはない。ネットの動向を見守ろう。