2013-10-17 3 views
0

VCL 스타일이 적용될 때 Delphi XE2의 텍스트 편집기에 문제가 있습니다. 폼에 두 개의 TMemo 컨트롤 (Memo1과 Memo2)이 있고 Memo1이 부분적으로 Memo2 뒤에 있으면 Memo1의 scollbars가 Memo2 위에 그려집니다.Delphi XE2 VCL 스타일 - 그림 스크롤바

TScrollingStyleHook에서 상속 된 스타일 후크를 만들려고했지만 문제를 해결할 방법을 찾지 못했습니다. 아무도이 버그를 고칠 수있는 방법에 대한 아이디어가 있습니까?

BTW : 델파이 XE5에서도 테스트했는데 같은 방식으로 작동합니다.

DFM : 여기

는 .DFM과를 .pas 파일의 소스 코드

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); 

당신이 WM_NCPAINT 메시지에 당신이 잇는 TMemo 클래스 내부의 스크롤 막대를 칠 필요가이 문제를 해결하려면.

+0

감사합니다 S.Mahdi! 당신 말이 맞아요. WM_NCPAINT를 수정했는데 이것이 방법 인 것 같습니다.하지만 스크롤 바가 완전히 그려지지 않았기 때문에 다른 변경도 필요합니다. – daniel