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

Исправление ошибки `WM_SIZING` при изменении размера окна без заголовка на Delphi

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

Исправление ошибки WM_SIZING при изменении размера окна без заголовка в Delphi

При разработке приложений на Delphi иногда возникают проблемы, связанные с обработкой сообщений окон. Одна из таких проблем связана с неправильной обработкой сообщения WM_SIZING при изменении размера окна, у которого отсутствует заголовок. В данном случае, при попытке изменить размер окна, удерживая нижнюю границу, система ведет себя так, как будто за удержание взята верхняя граница. Это происходит из-за того, что в параметрах сообщения WM_SIZING указывается WMSZ_TOP, вместо WMSZ_BOTTOM.

Описание проблемы

Разработчик создает окно без заголовка, изменяет его размеры программно или вручную так, чтобы высота была 30 пикселей или меньше. При последующем изменении размера окна, удерживая нижнюю границу, происходит некорректное поведение: система ведет себя как будто изменяется верхняя граница. При отладке программы параметры сообщения WM_SIZING действительно содержат значение WMSZ_TOP, что не соответствует действиям пользователя.

Пример кода

Пример кода из FormCreate демонстрирует, как изменяется стиль окна:

procedure TForm2.FormCreate(Sender: TObject);
var
  oldStyle, newStyle: LongInt;
begin
  oldStyle := WINDOWS.GetWindowLong(Handle, GWL_STYLE);
  newStyle := oldStyle and not (WS_CAPTION or WS_MAXIMIZEBOX);
  WINDOWS.SetWindowLong(Handle, GWL_STYLE, newStyle);
  WINDOWS.SetWindowPos(Handle, 0, 0, 0, 0, 0, SWP_NOZORDER or SWP_NOMOVE or SWP_NOSIZE or SWP_FRAMECHANGED or SWP_NOACTIVATE);
end;

Предложенный альтернативный способ

Использование CreateParams для установки стилей окна, как было предложено, приводит к появлению заголовка окна.

Подтвержденное решение

Проблема, вероятно, является ошибкой операционной системы, так как в тестах случая по умолчанию функция определения перехвата (hit test) неверно обрабатывается и возвращает HTTOP, когда следовало бы возвращать HTBOTTOM. Можно переопределить обработку перехвата, что решит проблему:

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
  inherited;
  if (Message.Result = HTTOP) and
    (Message.Pos.Y > Top + Height - GetSystemMetrics(SM_CYSIZEFRAME)) then
    Message.Result := HTBOTTOM;
end;

Альтернативный подход

В ответ на успех предыдущего решения, была подтверждена ошибка операционной системы. Это не связано с Delphi, так как проблема воспроизводится даже с простым окном, созданным с использованием WINDOWS API. Дополнительный код переопределения перехвата помогает решить проблему:

procedure TForm2.WMNcHitTest(var msg: TWMNCHitTest);
begin
  inherited;
  case msg.Result of
    HTTOP:
      begin
        if msg.Pos.Y > Top + Height div 2 then
          msg.Result := HTBOTTOM;
      end;
    HTTOPRIGHT:
      begin
        if msg.Pos.Y > Top + Height div 2 then
          msg.Result := HTBOTTOMRIGHT;
      end;
    HTTOPLEFT:
      begin
        if msg.Pos.Y > Top + Height div 2 then
          msg.Result := HTBOTTOMLEFT;
      end;
  end;
end;

Заключение

Для решения проблемы с неправильной обработкой сообщений WM_SIZING при изменении размера окна без заголовка в Delphi, разработчикам следует переопределить метод WMNCHitTest, что позволит корректно обрабатывать перехват событий при изменении размеров окна. Это решение позволяет избежать ошибок, связанных с поведением операционной системы, и обеспечить правильное функционирование приложения.

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

Описание контекста: При разработке приложений на Delphi возникает проблема, связанная с неправильной обработкой сообщения WM_SIZING при попытке изменить размер окна без заголовка, что приводит к некорректному поведению системы при изменении размеров чере


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

Получайте свежие новости и обновления по 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:36:13/0.0033600330352783/0