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

Позиционирование диалога с сообщением над формой

Delphi , Программа и Интерфейс , Диалоги и Фреймы

Позиционирование диалога с сообщением над формой

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

const
   mbMessage = WM_USER + 1024;

 type
   private
      procedure ChangeMessageBoxPosition(var Msg: TMessage); message mbMessage;
   end;


 var
   Form1: TForm1;
   msgCaption: PChar;  // variable to hold the caption 

implementation


 {$R *.DFM}

 procedure TForm1.ChangeMessageBoxPosition(var Msg: TMessage);
 var
   MbHwnd: longword;
   MbRect: TRect;
   x, y, w, h: integer;
 begin
   MbHwnd := FindWindow(MAKEINTRESOURCE(WC_DIALOG), msgCaption);
   if (MbHwnd <> 0) then
   begin
     GetWindowRect(MBHWnd, MBRect);
     with MbRect do
     begin
       w := Right - Left;
       h := Bottom - Top;
     end;
     // center horzontal 
    x := Form1.Left + ((Form1.Width - w) div 2);
     // keep on screen 
    if x < 0 then
       x := 0
     else if x + w > Screen.Width then x := Screen.Width - w;
     //center vertical 
    y := Form1.Top + ((Form1.Height - h) div 2);
     // keep on screen 
    if y < 0 then y := 0
     else if y + h > Screen.Height then y := Screen.Height - h;
     // set new windows position 
    SetWindowPos(MBHWnd, 0, x, y, 0, 0, SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOZORDER);
   end;
 end;


 procedure TForm1.Button1Click(Sender: TObject);
 begin
   PostMessage(Handle, WM_USER + 1024, 0, 0);
   msgCaption := 'Confirm';
   MessageBox(Handle, 'Has our MessageBox moved ?', msgCaption,
     MB_ICONQUESTION or MB_YESNO);
 end;

Это пример программирования на Delphi, демонстрирующий, как позиционировать диалоговое окно (месседж-бокс) над формой. Вот разбивка кода:

Константы и типы Первый раздел определяет константы и типы:

const
  mbMessage = WM_USER + 1024;

mbMessage - это пользовательская сообщение, используемая для общения между формой и диалоговым окном.

Определение типа Приватный процедура ChangeMessageBoxPosition определена, которая будет вызвана, когда диалоговое окно нужно перераспорядить.

type
  private
    procedure ChangeMessageBoxPosition(var Msg: TMessage); message mbMessage;

Переменные Следующий раздел определяет переменные:

var
  Form1: TForm1; // ссылка на форму
  msgCaption: PChar; // переменная для хранения заголовка

Implementation Раздел реализации содержит код, который реализует процедуры:

implementation

{$R *.DFM}

procedure TForm1.ChangeMessageBoxPosition(var Msg: TMessage);
var
  MbHwnd: LongWord;
  MbRect: TRect;
  x, y, w, h: Integer;
begin
  // Найдите handle диалогового окна
  MbHwnd := FindWindow(MAKEINTRESOURCE(WC_DIALOG), msgCaption);

  if (MbHwnd <> 0) then
  begin
    // Получите прямоугольник диалогового окна
    GetWindowRect(MbHwnd, MbRect);

    with MbRect do
    begin
      w := Right - Left;
      h := Bottom - Top;
    end;

    // Центрируйте диалоговое окно горизонтально
    x := Form1.Left + ((Form1.Width - w) div 2);

    // Держите его на экране
    if x < 0 then
      x := 0
    else if x + w > Screen.Width then
      x := Screen.Width - w;

    // Центрируйте диалоговое окно вертикально
    y := Form1.Top + ((Form1.Height - h) div 2);

    // Держите его на экране
    if y < 0 then
      y := 0
    else if y + h > Screen.Height then
      y := Screen.Height - h;

    // Установите новую позицию окна
    SetWindowPos(MbHwnd, 0, x, y, 0, 0, SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOCREATE);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Отправьте сообщение для перераспределения диалогового окна
  PostMessage(Handle, mbMessage, 0, 0);

  msgCaption := 'Confirm';
  MessageBox(Handle, 'Has our MessageBox moved ?', msgCaption,
    MB_ICONQUESTION or MB_YESNO);
end;

Описание В коде происходит следующее: 1. Процедура ChangeMessageBoxPosition вызывается, когда диалоговое окно нужно перераспределить. 2. Она находит handle диалогового окна с помощью FindWindow. 3. Получает прямоугольник диалогового окна с помощью GetWindowRect. 4. Калкулирует новую позицию диалогового окна, учитывая размер формы и границы экрана. 5. Устанавливает новую позицию с помощью SetWindowPos.

В процедуре Button1Click: 1. Отправляется сообщение для перераспределения диалогового окна с помощью PostMessage. 2. Заголовок диалогового окна устанавливается в 'Confirm'. 3. Диалоговое окно с вопросительным знаком и двумя кнопками (Да/Нет) отображается.

В целом, этот код демонстрирует, как позиционировать диалоговое окно над формой и перераспределять его, когда это нужно.

В статье описывается способ позиционирования диалога с сообщением над формой в приложении на языке Delphi, используя SendMessage для изменения положения формы.


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

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




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


:: Главная :: Диалоги и Фреймы ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 01:25:06/0.0038011074066162/0