Как изменить границу формы на Windows Basic вместо стиля Aero?

Я хочу знать, возможно ли это, и если да, то как изменить стиль границы форм на Windows Basic вместо темы Aero? Очевидно, принимая во внимание, включен ли Aero в первую очередь, если это не так, то нет необходимости пытаться изменить стиль границы.

Так что вместо:

введите описание изображения здесь

У нас будет: (изображение-макет)

введите описание изображения здесь

Приложения MDI уже делают это для дочерних форм, но мне не нужно и не нужно приложение MDI. Я попытался просмотреть источник Vcl.Forms, чтобы узнать, могу ли я найти что-нибудь связанное с этим, но я не смог - я мог ошибаться, но на самом деле я думаю, что способ рисования форм MDI определяется Windows, а не Delphi.

DSiWin32 содержит несколько функций, связанных с Aero, таких как определение того, является ли Aero включен или нет, а также может включать и отключать Aero - однако это, похоже, изменение всей системы, а не для каждой формы / окна, это также вызывает задержку экрана при изменении темы, что не очень хорошо.

Я не уверен, что делать дальше. Есть ли что-то простое, что я мог упустить из виду? Нужно ли нам создавать и переопределять нашу собственную TForm с некоторыми конкретными флагами и т. Д., Чтобы достичь этого, или, возможно, есть способ изменить стиль формы в любой момент, например, включить / отключить Aero для формы?

Проще говоря, я хочу знать, возможно ли это, не прибегая к приложениям MDI, можем ли мы изменить любую форму / границу окна на тему Windows Basic, при условии, что Aero включен в первую очередь?


person Craig    schedule 11.04.2015    source источник


Ответы (1)


Вызовите DwmSetWindowAttribute, передав атрибут DWMWA_NCRENDERING_POLICY со значением DWMNCRP_DISABLED .

type
  TForm1 = class(TForm)
  protected
    procedure CreateWnd; override;
  end;

procedure TForm1.CreateWnd;
var
  Policy: Integer;
begin
  inherited;
  Policy := DWMNCRP_DISABLED;
  DwmSetWindowAttribute(WindowHandle, DWMWA_NCRENDERING_POLICY, @Policy, 
    SizeOf(Policy));
end;

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

Обратите внимание, что CreateWnd - правильное место для вызова DwmSetWindowAttribute. Дескриптор окна создается в CreateWnd, и мы хотим применить эту политику как можно скорее. Помещение кода в CreateWnd также делает его устойчивым к повторному созданию.

Нормальная аэродинамическая форма:

введите описание изображения здесь

Форма с обращением к DwmSetWindowAttribute:

введите описание изображения здесь

person David Heffernan    schedule 11.04.2015
comment
Красиво, большое спасибо (и еще раз спасибо за объяснение) - Winapi.Dwmapi - вот где волшебство :) Но как вы узнали о DwmSetWindowAttribute хотя? Я просмотрел несколько страниц Windows API в MSDN и ничего не нашел. Я не знаю, откуда вы, ребята, знаете об этих более непонятных функциях. - person Craig; 11.04.2015
comment
Я научился, отвечая и пытаясь ответить на подобные вопросы. - person David Heffernan; 11.04.2015
comment
Думаю, я потрачу больше времени на чтение Windows API и MSDN, это отличный ресурс (особенно если вы знаете, что искать). Еще раз большое спасибо. - person Craig; 11.04.2015