10

テーマが有効になっているDelphi2010アプリケーションでは、clMoneyGreenの背景を持つフォームに2つのTPageControls(一方は他方の中にあります)があります。

ここに画像の説明を入力してください

外側のページコントロールは親コンポーネントの色で背景を正しく描画しますが、内側のページコントロールは、親コントロール(TTabSheet)の白ではなく、clBtnFace(画像の赤い省略記号)で背景を描画します。ページコントロールをWindowsのクラシックな外観(Windowsテーマを失う)に戻さずにこれを修正する方法はありますか?

私がGoogleとここStackOverflowで見つけたすべての修正には、ページコントロールのテーマを失うOwnerDrawが含まれています。

WM_ERASEBKGND Windowsメッセージを処理するメソッドを使用して、TPageControlから継承された新しいページコントロールコンポーネントを作成しようとしました。

procedure TMyPageControl.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
begin
  if Parent is TCustomPageControl then
  begin
    Brush.Color := clWhite;
    Windows.FillRect(Msg.dc, ClientRect, Brush.Handle);
    Msg.Result := 1;
  end
  else
    inherited;
end;

背景を白く塗りつぶしますが、WM_ERASEBKGNDの後に呼び出される他のメソッド(TWinControlのWM_PAINTメソッドを推測しています)は、白い背景の上に灰色を塗り直します。

注:Delphi 7から移植された大規模なアプリケーションにテーマを実装しているため、これを調査しています。そのため、派生コンポーネントを使用してこの問題を解決しようとしています。207個のTPageControlオカレンスをすべて簡単に検索して置き換えることができます。新しいクラスですが、それらのいくつかの後ろにパネルを配置すると、はるかに多くの時間が必要になります。

4

1 に答える 1

13

これは Delphi 2010 の既知のバグです。最も外側のタブシートの子であり、内側のページ コントロールの親であるパネルを追加することで回避できます。

これで問題が解決する理由がわかりません。私のアプリで、適切にレンダリングされたネストされたタブ/ページコントロールは、適切に挿入されたパネルを持つものだけであることに気付いたので、私は自分で回避策を発見しました。

私の記憶が正しければ、この欠陥は最新の Delphi バージョンには存在しません。

于 2012-08-22T14:14:04.260 に答える