2013-09-26 63 views
3

我剛剛發現使用Option toUseExplorerTheme允許爲VirtualStringTree生成一個不錯的選擇矩形。但是,如果設置了Option toGridExtensions並且樹中有多個列,則不會爲內部單元格繪製選區的垂直邊框,並且圓角也會丟失。只有最左邊和最右邊的列的最外邊緣和邊角才能正確繪製。它看起來好像在最外面的列之間繪製了選擇矩形,而未選擇的列的背景只是繪製在了選擇矩形上。VirtualTreeView與UseExplorerThemes

關閉toGridExtensions會產生一個正確的選擇矩形,但我更願意將其打開,因爲只能通過單擊標準模式下的文本來選擇單元格(而不是通過單擊文本旁邊的空白區域)。

這個問題發生在Delphi 7和XE2上,也可能與其他版本有關。

重現向表單添加一個TVirtualStringTree,顯示標題,在標題中添加幾列,並激活選項toGridExtensions(MiscOptions),toUseExplorerTheme(PaintOptions),toExtendedFocus(SelectionOptions),運行該程序並單擊任意細胞。

回答

7

在我看來這是一個錯誤,因爲誰願意要選擇這樣的:

enter image description here

要修復它在虛擬樹視圖代碼(在我的情況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; 

,你會得到一個選擇是這樣的:

enter image description here

這同樣也適用於未來DrawThemedFocusRect嵌套的過程。

我已將此問題報告爲Issue 376,該問題已在revision r587中修復。

+0

非常好。謝謝。 –

+1

不客氣!無論如何,我之前提出的解決方案存在['問題](http://stackoverflow.com/q/20637534/960757),所以請更新到修訂版r587進行修復。 – TLama

相關問題