2013-10-17 59 views
0

我應用了VCL樣式的Delphi XE2中的文本編輯器有問題。如果我將2個TMemo控件(Memo1和Memo2)放置在表單上,​​並且Memo1部分位於Memo2後面,則Memo1的scollb被繪製在Memo2上。德爾福XE2 VCL樣式 - 滾動條繪畫

我試着創建一個從TScrollingStyleHook繼承的樣式鉤,但我沒有找到任何方法來解決這個問題。有沒有人有一個關於如何解決這個bug的想法?

順便說一句:我也在Delphi XE5中測試過它,它的行爲方式也是一樣的。

下面是.DFM和.PAS文件的源代碼:

DFM:

object Form1: TForm1 
    Left = 0 
    Top = 0 
    Caption = 'Form1' 
    ClientHeight = 282 
    ClientWidth = 418 
    Color = clBtnFace 
    Font.Charset = DEFAULT_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    PixelsPerInch = 96 
    TextHeight = 13 
    object Memo1: TMemo 
    Left = 120 
    Top = 80 
    Width = 185 
    Height = 89 
    Lines.Strings = (
     'Memo1') 
    ScrollBars = ssBoth 
    TabOrder = 0 
    end 
    object Memo2: TMemo 
    Left = 160 
    Top = 128 
    Width = 185 
    Height = 89 
    Lines.Strings = (
     'Memo2') 
    ScrollBars = ssBoth 
    TabOrder = 1 
    end 
end 

PAS:

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; 

type 
    TForm1 = class(TForm) 
    Memo1: TMemo; 
    Memo2: TMemo; 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

end. 
+0

您能否提供該問題的圖片? – RRUZ

+0

請提供SSCCE –

+0

我是本網站的新成員,我不允許向該文章添加圖片,但我將.pas和.dfm代碼添加到了描述中。 – daniel

回答

3

VCL的風格引擎不能正確支持滾動條,在備忘錄中,滾動條是從繼承自TWinControl類的TScrollWindow類創建的。標準滾動條(沒有vcl樣式)被繪製爲備忘錄的一部分。 使用vcl樣式時,備忘錄滾動條會變成頂部窗口,這就是導致以前問題的原因。 如果你看看TScrollingStyleHook.UpdateScroll事件,你會發現風格引擎使用SetWindowPos將滾動條帶到其他控件的頂部以顯示滾動條。

SetWindowPos(FVertScrollWnd.Handle, HWND_TOP, Control.Left + Left, 
      Control.Top + Top, Right - Left, Bottom - Top, SWP_SHOWWINDOW); 

如果要解決這個問題,你需要畫的TMemo類中的滾動條,在WM_NCPAINT消息。

+0

謝謝S.Mahdi!你是對的。我修改了WM_NCPAINT,似乎是這樣,但它也需要其他更改,因爲滾動條未完全正確繪製。 – daniel