Стили Delphi XE2 VCL - рисование полос прокрутки

У меня проблема с текстовыми редакторами в Delphi XE2, когда применяется стиль VCL. Если у меня есть 2 элемента управления TMemo (Memo1 и Memo2), размещенных на форме, а Memo1 частично находится за Memo2, то полосы прокрутки Memo1 закрашиваются поверх Memo2.

Я попытался создать хук стиля, унаследованный от TScrollingStyleHook, но не нашел способа исправить проблему. Кто-нибудь знает, как исправить эту ошибку?

Кстати: я тестировал его и в 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.

person daniel    schedule 17.10.2013    source источник
comment
Можете ли вы включить изображение проблемы?   -  person RRUZ    schedule 17.10.2013
comment
Я новый участник этого веб-сайта, и мне не разрешено добавлять изображения в сообщение, но я добавил в описание код .pas и .dfm.   -  person daniel    schedule 18.10.2013


Ответы (1)


Механизм стилей Vcl не поддерживает правильно полосу прокрутки, в заметке полоса прокрутки создается из класса TScrollWindow, унаследованного от класса TWinControl. стандартная полоса прокрутки (без стиля 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.

person S.MAHDI    schedule 17.10.2013
comment
Спасибо С.Махди! Ты прав. Я изменил WM_NCPAINT, и кажется, что это так, но он требует и других изменений, потому что полосы прокрутки нарисованы не совсем правильно. - person daniel; 21.10.2013