Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

### Корректировка позиционирования диалоговых окон в Delphi для Windows 8

Delphi , Синтаксис , Справочник по API-функциям

Корректировка позиционирования диалоговых окон в Delphi для Windows 8

Проблема, с которой сталкиваются разработчики, работающие с Delphi и Pascal, заключается в изменении позиционирования диалоговых окон в операционной системе Windows 8. В частности, диалоговые окна могут смещаться влево и вверх относительно ожидаемого положения, что приводит к несоответствию в отображении окон в разных версиях Windows.

Пример кода, вызывающего проблему:

procedure TForm1.Button3Click(Sender: TObject);
var p: TPoint;
begin
  p := Button3.ClientToScreen(Point(0, Button3.Height));
  MessageDlgPos('', mtInformation, [mbOK], 0, p.X, p.Y);
end;

В коде выше диалоговое окно должно отображаться прямо под кнопкой, но в Windows 8 оно смещается вверх и влево. Это происходит из-за того, что в Windows 8 система может "фальсифицировать" и "врать" приложениям при работе с координатами экрана, чтобы поведение приложения было похоже на работу в системе с низким разрешением. Это может привести к небольшим проблемам, когда взаимодействуют или конфликтуют системы координат разных разрешений.

Подход к решению:

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

p := Button3.Parent.ClientToScreen(Point(Button3.Left, Button3.Top + Button3.Height));

Также важно учесть размеры не-клиентской области окна. В Windows 8 и версиях с включенным Aero, размеры системных метрик немного изменяются, поэтому для более точной корректировки можно использовать функции DwmGetWindowAttribute(DWMWA_EXTENDED_FRAME_BOUNDS) и GetThemeSysSize().

Альтернативное решение с использованием DwmApi:

uses DwmApi;

type
  TNonClientMetricsX = packed record
    cbSize: UINT;
    iBorderWidth: Integer;       iScrollWidth: Integer;
    iScrollHeight: Integer;      iCaptionWidth: Integer;
    iCaptionHeight: Integer;     lfCaptionFont: TLogFontA;
    iSmCaptionWidth: Integer;    iSmCaptionHeight: Integer;
    lfSmCaptionFont: TLogFontA;  iMenuWidth: Integer;
    iMenuHeight: Integer;        lfMenuFont: TLogFontA;
    lfStatusFont: TLogFontA;     lfMessageFont: TLogFontA;
    iPaddedBorderWidth: Integer; // not defined in Delphi 2007
  end;

function GetExtendedFrameOffset(BorderStyle: TFormBorderStyle): integer;
var
  IsEnabled: BOOL;
  NCM: TNonClientMetricsX;
begin
  Result := 0;
  if (DwmIsCompositionEnabled(IsEnabled) = S_OK) and IsEnabled and
     (BorderStyle in [bsDialog, bsSingle, bsToolWindow]) then
  begin
    NCM.cbSize := SizeOf(NCM);
    SystemParametersInfo(SPI_GETNONCLIENTMETRICS, SizeOf(NCM), @NCM, 0);
    Result := NCM.iBorderWidth + NCM.iPaddedBorderWidth;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var p: TPoint; offset: integer;
begin
  p := Button3.ClientToScreen(Point(0, Button3.Height));
  offset := GetExtendedFrameOffset(bsDialog);
  MessageDlgPos('', mtInformation, [mbOK], 0, p.X + offset, p.Y + offset);
end;

Это решение учитывает размеры рамки окна и позволяет корректно позиционировать диалоговое окно в различных версиях Windows, включая Windows 8.

Важные замечания:

  • При использовании кнопки, которая сама по себе не имеет не-клиентской области, нет необходимости использовать прямоугольник границ.
  • Функции DwmApi должны быть использованы в среде разработки, поддерживающей их, например, в Delphi 2007 и выше.

Разработчикам важно быть в курсе таких нюансов, чтобы обеспечить совместимость и корректное отображение диалоговых окон в различных версиях Windows.

Создано по материалам из источника по ссылке.

Проблема заключается в необходимости корректировки позиционирования диалоговых окон в приложениях на Delphi для обеспечения их правильного отображения в операционной системе Windows 8.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:12:36/0.003425121307373/0