О DoubleBuffer
.NET может иметь один, и он может иметь то же имя и ту же цель, что и Delphi, но Delphi реализует DoubleBuffer с нуля, и я предполагаю, что .NET делает то же самое.Для этого не используются биты стиля окна.
DoubleBuffer и Glass Aero
Довольно просто: не устанавливайте DoubleBuffer для элементов управления, расположенных на Glass.Чтобы DoubleBuffering работал, нужно уметь инициализировать «Buffer» - но чем его инициализировать для Glass?DoubleBuffering не требуется для стандартных элементов управления Windows (включая TButton).Для новых элементов управления, которым требуются как прозрачные поверхности, так и поведение, подобное двойному буферу, можно использовать API слоистых окон.
Получение элементов управления для работы со стеклом
Шаг 1:
TForm1 = class(TForm)
...
protected
procedure CreateWindowHandle(const Params: TCreateParams); override;
...
end;
procedure TForm15.CreateWindowHandle(const Params: TCreateParams);
begin
inherited;
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, RGB(60, 60, 60), 0, LWA_COLORKEY);
end;
Шаг 2 , это должен быть обработчик OnPaint вашей формы:
procedure TForm15.FormPaint(Sender: TObject);
var rClientRect:TRect;
begin
if GlassFrame.Enabled then
begin
rClientRect := ClientRect;
Canvas.Brush.Color := RGB(60, 60, 60);
Canvas.Brush.Style := bsSolid;
Canvas.FillRect(rClientRect);
if not GlassFrame.SheetOfGlass then
begin
rClientRect.Top := rClientRect.Top + GlassFrame.Top;
rClientRect.Left := rClientRect.Left + GlassFrame.Left;
rClientRect.Right := rClientRect.Right - GlassFrame.Right;
rClientRect.Bottom := rClientRect.Bottom - GlassFrame.Bottom;
Canvas.Brush.Color := clBtnFace;
Canvas.FillRect(rClientRect);
end;
end;
end;
Шаг 3 : Set GlassFrame.Enabled = True;Установите все остальные свойства стекла, добавьте элементы управления в форму, где бы они вам ни понравились.Может быть на стекле или где-нибудь еще.Убедитесь, что элементы управления не имеют «DoubleBuffered = True».Вот и все, наслаждайтесь.Я тестировал с TButton, TCkBox и TEdit.
... РЕДАКТИРОВАТЬ ...
К сожалению, используя этот метод, "Стекло" рассматривается как 100% прозрачная поверхность, и это не ...это похоже на стекло, но оно не ведет себя как стекло.Проблема со 100% -ной прозрачностью заключается в том, что если вы щелкнете по этой прозрачной области, ваш щелчок перейдет к окну позади вашего окна.Ужасно.
На момент написания этой статьи я почти уверен, что не существует API для изменения цвета по умолчанию ЧЕРНОГО ключа для оригинального стекла (Google находит бесчисленные сообщения в блогах и на форуме о том, как использовать пользовательский рисунок дляэлементы управления, расположенные на стекле, и нет функции изменить это в списке функций DWM в MSDN ).Без изменения цвета по умолчанию ЧЕРНЫЙ большинство элементов управления не могут правильно отображаться, потому что они пишут текст с использованием clWindowText, и это ЧЕРНЫЙ.Один из предложенных трюков, найденных на нескольких форумах, заключается в изменении цвета прозрачности с помощью API SetLayeredWindowAttributes.И это работает!Как только это сделано, черный текст на элементах управления показывает бросок, но, к сожалению, стекло больше не стекло, стекло выглядит как стекло, но ведет себя как 100% прозрачность.Это в значительной степени лишает законной силы это решение и показывает двойной стандарт на стороне Microsoft: оригинальный ЧЕРНЫЙ не ведет себя как 100% прозрачность, но если мы изменим его на что-то лучшее, он будет вести себя как 100% прозрачность.
По моему мнениюраспространенное мнение об использовании пользовательских элементов управления на Glass неверно.Это единственное, что может сработать, но это неправильно, потому что мы должны использовать элементы управления, которые согласованы на всей платформе: предложение пользовательских элементов управления открывает двери для непоследовательных, похожих на winamp приложений, где каждый пользователь заново создает колесо длякостюм это художественные идеи.Даже если разработчику удается точно воссоздать любой заданный элемент управления Windows и заставить его работать на стекле, «исправление» является только временным и его необходимо создать заново для следующей версии окон.Не говоря уже о том, что, вероятно, должно быть несколько вариантов для существующих версий окон.
Другое решение заключается в использовании многослойных окон с UpdateLayeredWindow.Но это БОЛЬНО по ооочень многим причинам.
Это тупик для меня.Но я задам вопрос «любимый» флаг, если появится что-то лучше, я бы хотел об этом узнать.