3

Option toUseExplorerTheme を使用すると、VirtualStringTree の適切な選択四角形を作成できることがわかりました。ただし、オプション toGridExtensions が設定されていて、ツリーに複数の列がある場合、選択範囲の垂直境界線は内側のセルに対して描画されず、丸みを帯びた角も失われます。左端と右端の列の最も外側の端と角だけが正しく描画されます。選択長方形が最も外側の列の間に描画され、選択されていない列の背景が選択長方形の上に描画されているように見えます。

toGridExtensions をオフにすると正しい選択四角形になりますが、セルは標準モードでテキストをクリックすることによってのみ選択できるため (テキストの横の空白をクリックすることではありません)、オンにすることをお勧めします。

この問題は、Delphi 7 および XE2 で発生し、おそらく他のバージョンでも発生します。

再現するには、TVirtualStringTree をフォームに追加し、ヘッダーを表示し、ヘッダーにいくつかの列を追加し、オプション toGridExtensions (MiscOptions)、toUseExplorerTheme (PaintOptions)、toExtendedFocus (SelectionOptions) を有効にして、プログラムを実行し、任意のセルをクリックします。

4

1 に答える 1

7

私の見解では、これはバグです。なぜなら、誰が次のような選択をしたいからです:

ここに画像の説明を入力

仮想ツリー ビュー コード (私の場合は v.5.1.4) で修正するには、TBaseVirtualTree.PrepareCellメソッド (私の場合は行 25802) に移動し、このネストされたプロシージャ コードを確認します (コメントは私のものです)。

procedure DrawBackground(State: Integer);
begin
  // here the RowRect represents the row rectangle and InnerRect the cell
  // rectangle, so there should be rather, if the toGridExtensions is NOT
  // in options set or the toFullRowSelect is, then the selection will be
  // drawn in the RowRect, otherwise in the InnerRect rectangle
  if (toGridExtensions in FOptions.FMiscOptions) or (toFullRowSelect in FOptions.FSelectionOptions) then
    DrawThemeBackground(Theme, PaintInfo.Canvas.Handle, TVP_TREEITEM, State, RowRect, nil)
  else
    DrawThemeBackground(Theme, PaintInfo.Canvas.Handle, TVP_TREEITEM, State, InnerRect, nil);
end;

この問題を修正するには、コードを次のように変更します。

procedure DrawBackground(State: Integer);
begin
  // if the full row selection is disabled or toGridExtensions is in the MiscOptions, draw the selection
  // into the InnerRect, otherwise into the RowRect
  if not (toFullRowSelect in FOptions.FSelectionOptions) or (toGridExtensions in FOptions.FMiscOptions) then
    DrawThemeBackground(Theme, PaintInfo.Canvas.Handle, TVP_TREEITEM, State, InnerRect, nil)
  else
    DrawThemeBackground(Theme, PaintInfo.Canvas.Handle, TVP_TREEITEM, State, RowRect, nil);
end;

そして、次のような選択が得られます。

ここに画像の説明を入力

DrawThemedFocusRect次の入れ子手続きも同様です。

私はこの問題を として報告しました。この問題Issue 376は で修正されていrevision r587ます。

于 2013-09-26T14:23:40.557 に答える