8

これは、Any Cpu 用にコンパイルする場合と x86 にコンパイルする場合に発生します。GUI のセクションは、サイズが変更されない限り再描画されません。たとえば、メイン フォームが最大化された場合、一部のコントロールはサイズ変更されず、他のコントロールには再描画されないセクションがあり、以前にあったものを表示します。

これは、XP と Vista の両方の 32 ビット マシンでは問題なく動作しますが、64 ビット Vista (テストする x64 XP がない) では再描画が正しく動作しません。

これをどこから追跡し始めるかについて、誰かアイデアがありますか?

編集:これは2台の別々のマシンで発生し、少なくとも現在使用しているマシンにはNVidiaの最新ドライバーがあります。

Edit2: 64 ビット マシンで 32 ビット XP 仮想マシンを実行すると、アプリケーションは VM で再描画の問題を示さない

Edit3: ドライバーの問題かもしれませんが、ドライバーが問題を修正するかどうか、いつ修正するかはわかりません。同僚は、NVidia よりも自宅で ATI カードを使用する方が問題が少ないと言っていますが、私はビデオ ドライバーをほぼ毎月更新してきましたが、この数か月間、まだ解決されていないため、製品をリリースすることはできません。そして、いつの日かドライバーの製造元がこれを修正する可能性があることをお客様に伝えてください.

何を避けるべきかについての洞察を持っている人はいますか? x86 としてコンパイルしており、すべてのコンポーネントは x86 です。テスト プロジェクトのどのコンポーネントでもこの問題を再現できないようです。また、ほとんどのコンポーネント フォーラムでこれらの問題を報告した人が他にいないので、私たちが行っていることである可能性がかなり高いです。

4

8 に答える 8

14

それはこの問題のように恐ろしく聞こえます。

Windows でウィンドウのサイズを変更すると、通常、各ウィンドウがWM_SIZEメッセージを受信し、次にその子を呼び出すMoveWindow()(または同様の)チェーンが取得WM_SIZEされます。.NET が内部で同じことをしていると確信しています。

x64 では、Windows はこの入れ子の深さを制限しており、特定のポイント (12 ~ 15 個の入れ子になったウィンドウ) を過ぎると、WM_SIZEメッセージを送信しなくなります。この制限は、x86 には存在しないようです。この制限は、x64 バージョンの Windows で実行されている x86 と x64 の両方のコードに影響します。

x64のインストールが異なれば異なる症状が現れるため、これは私たちを長年悩ませてきました。上記の MSDN ブログの投稿には、いくつかの可能な回避策があります。最終的に、セカンダリ スレッドを使用してウィンドウ サイズを非同期で実行することになりました。これにより、問題がかなりうまく解決されました。

于 2009-02-17T00:23:22.880 に答える
1

この問題の最も可能性の高い原因は、アプリケーションの再描画の問題だと思います。コードでこの問題を明らかにしている64ビットのWindowsメッセージの順序に微妙な違いがある可能性があります。

次のようにして、これを試すことができます。

  1. アプリケーションにタイマーを追加します。
  2. イベントハンドラーでflakyControl.Update()を呼び出します

タイマーを5秒くらいに設定します。次に、Win64でアプリケーションを実行し、問題が解決するかどうかを確認します。その場合、最も可能性の高い原因は、コントロールの1つが、無効になったことを適切に通知していないことです。

アプリケーションのカスタムコントロールから始めます。コード内のオーバーライドされたすべてのメソッドとイベントハンドラーにUpdate呼び出しを体系的に追加します。最終的には、問題を修正するものが見つかり、バグが実際にどこにあるかがわかります。

于 2009-02-15T14:54:04.143 に答える
1

MSDNブログで説明されている BeginInvoke() ソリューションを使用する場合は、OnSizeChanged() をオーバーライドするコントロールの子のドッキングを無効にしてください。Dock = DockStyle.Fill があり、修正を機能させるには DockStyle.None に変更する必要がありました。

于 2009-11-06T15:48:55.890 に答える
0

私はゴードンに同意します。新品の 64 ビット マシンでは、32 ビットでは問題なく表示されていたプログラムが、64 ビット マシンでは奇妙な問題を示すという問題が発生するという問題を見てきました。最新/推奨ドライバーに更新すると、ほとんどの場合、問題が修正されました。

于 2008-12-22T17:48:32.330 に答える
0

私にはディスプレイドライバーの問題のように聞こえます...

最新のドライバーに更新してみて、問題が解決するかどうかを確認してください。64/32 ビットの違いはおそらく厄介な問題です...

于 2008-12-22T17:44:55.990 に答える
0

これは、ツリー内にネストされた HWND の数に関連していると思います。具体的な詳細はわかりませんが、64 ビットのネストされた HWND にはいくつかの制限がありました。私はそれが発生するのを見てきましたが、完全な vista ベーシック (または aero) テーマから Windows クラシックに戻すことで回避しています。この時点で、問題はなくなります。

クラシックに切り替えてみてください。それで問題が解決する場合は、ネストされた HWND の数を減らすことができるかどうかを確認してください。

于 2009-02-15T06:00:56.450 に答える