10

アプリを XE から XE2 に移植して以来、奇妙なバグに気付きました。ide でフォームを開くか、アプリを実行するだけで、画面の左上隅 (フォームの外) に白い四角いボックスが描画されます。マウスまたはウィンドウをホバーすると離れます。これを TLabel まで追跡しました。フォームにドロップして Glowsize を 0 より大きく設定するだけで問題が発生します。

再インストールして最新の XE2 update3 に更新しましたが、問題は引き続き発生します。誰が何が起こっているのか手がかりを持っていますか?

例 1

例 2

ここに画像の説明を入力

4

2 に答える 2

13

問題は、画面のデバイス コンテキストとフラグ DT_CALCRECT を使用したTCustomLabel.AdjustBoundsへの呼び出しから始まります。DoDrawTextしたがって、そのデバイス コンテキストに何かが描画されると、画面に描画されます。DT_CALCRECTフラグはそれを防ぐ必要がありますが、呼び出しDrawThemeTextExVcl.Themes.TUxThemeStyle.DoDrawTextDT_CALCRECT + LOptions.dwFlags DTT_CALCRECT を無視するように見え、必要な四角形のみを計算する必要があるデバイス コンテキストにペイントします。なぜそうなるのかは(まだ)わかりませんDrawThemeTextExが、それは出発点です。

更新 1:
Delphi 2009 はこの影響を受けないようですが、DrawThemeTextEx も呼び出します。唯一の違いは、Options レコードの未使用フィールドがすべてゼロであるのに対し、Delphi XE2 ではゴミが含まれていることです。おそらく、DrawThemeTextEx ではそれらをゼロにする必要があります。

更新 2:
Delphi 2009 と XE2 の違いは、Delphi 2009 では DTT_CALCRECT だけでなく DTT_COMPOSITE も指定されていることです。

Delphi 2009 では、DTT_COMPOSITE は常に設定されています。

Options.dwFlags := DTT_TEXTCOLOR or DTT_COMPOSITED or DTT_GLOWSIZE;

一方、XE2 では、ラベルがガラスに描かれている場合にのみフラグが設定されます。

  if csGlassPaint in ControlState then
    Include(LFormat, tfComposited);
于 2011-12-18T23:02:29.960 に答える