Delphi XE с эффектами Aero вызывает проблему с краской - PullRequest
9 голосов
/ 27 июня 2011

Я обновился до Delphi XE с 2009 года, и у меня возникла странная проблема.

Я создаю новый проект, записываю элемент управления TRibbon, компилирую и запускаю.Сохраняя форму по умолчанию, я минимизирую ее и восстанавливаю без проблем.Затем я максимизирую форму, минимизирую и восстанавливаю, а цвет формы меняется на черный.

У меня нет случайного кода, чтобы изменить его, и я использую все значения по умолчанию, с которыми поставляется Delphi XE и делает это каждый раз без сбоев.

Я перенес скомпилированный exe-файл на компьютер друзей, и проблема остается, поэтому я знаю, что это не мой компьютер.Если я отключу эффекты Aero, проблема исчезнет, ​​но снова включу Aero, и проблема вернется.

Есть идеи?У меня возникают проблемы с поиском соответствующих тем по этой проблеме в Интернете.

Спасибо, Seb

Редактировать (в соответствии с запросом, DFM для формы, отображающей это поведение. Примечание. Это происходитв любом проекте, который я запускаю):

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 555
  ClientWidth = 989
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poScreenCenter
  PrintScale = poNone
  Scaled = False
  PixelsPerInch = 96
  TextHeight = 13
  object Ribbon1: TRibbon
    Left = 0
    Top = 0
    Width = 989
    Height = 143
    Caption = 'Ribbon1'
    ExplicitLeft = 104
    ExplicitTop = 296
    ExplicitWidth = 0
    StyleName = 'Ribbon - Luna'
  end
end

Ничего фантастического, это просто новый проект с одной формой.

Ответы [ 2 ]

4 голосов
/ 27 июня 2011

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

  • Если я помещаю кнопку в форму и вызываю Invalidate из события OnClick кнопки, форма возвращает свои цвета.
  • Если я помещаю таймер в форму, включаю таймер с WndProc на WM_SIZE с помощью wParam = SIZE_MAXIMIZED, затем вызываю Invalidate из таймера, форма возвращает его цвета. По сути, это то же самое, что и первый метод (вызов Invalidate с кнопки), но таймер делает это автоматически и гарантирует, что Invalidate вызывается только тогда, когда больше нет сообщений для обработки. Я попробовал то же самое с простым PostMessage, но не сработало (то есть: вероятно, я Invalidate слишком рано, и это, вероятно, другая подсказка)
  • Интересно : если я сделаю Application.MainFormOnTaskbar := False в источнике проекта, я больше не вижу черную форму.

Обход

Лента занимает верхнюю часть формы. Поместите TPanel в оставшуюся часть формы, сделайте его Align = alClient и поместите все на Panel. Черный за панелью больше не виден!

1 голос
/ 27 июня 2011

Вы должны включить стеклянную рамку при использовании ленты, потому что элемент управления ленты специально разработан для работы с рамками из аэростекла.Во-вторых, вам нужно немного больше поработать, чтобы настроить ленту, добавить меню приложения и некоторые панели, чтобы она работала в соответствии с планом.Я не верю, что «лента сама по себе» без каких-либо групп вкладок или системного меню будет правильно отображаться во время выполнения.

Если вы хотите, чтобы лента работала в системах с включенным Aero glass, выследует включить свойство стеклянного фрейма (Form.GlassFrame.Enabled) и включить свойство Form.DoubleBuffered, добавить несколько страниц вкладок, добавить несколько групп вкладок и добавить системное меню.Много шагов.

Попробуйте подключенный ленточный стартер проект .(ribbonStarter.zip 88k)

Обновление Если даже мой ribbonStarter дает такой же результат в вашей системе, возможно, это следует зарегистрировать в Quality Central.Возможно, это ошибка в вашем видеодрайвере, из-за которой можно было бы выполнить обход кода на ленте и в коде формы.

...