[РЕШЕНО]Проблемы с изменением размера сплэша на GTK2

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

[РЕШЕНО]Проблемы с изменением размера сплэша на GTK2

Сообщение zoltanleo » 12.02.2018 11:06:39

Доброго времени суток, комрады

В рантайм меняю размеры сплэша из доп.потока таким образом
Код: Выделить всё
procedure TFrmMain.LMMyMsg(var Msg: TLMessage);
var
  AText: String;
  ARect: TRect;
  h: Integer; //height of the drawn text
  AFlag: UINT;
  SplashCenterPnt: TPoint;
  DiffHeight: Integer;//difference between a splash height and textcontainer height
begin
  ARect:= Rect(-500,0, FrmSplash.sttTextCont.Width - 500,0);
  AText:= String(NativeInt(Msg.lParam));

  with Self.Canvas do
  begin
    //uses LCLType
    AFlag:=
      DT_NOCLIP
      or DT_WORDBREAK
      or DT_LEFT
      ;
    //uses LCLIntf
    h:= DrawText(Handle,PChar(AText),-1, ARect, AFlag);

    { TODO : it's not work for linux GTK2. Why? }
    with FrmSplash do
    begin
      sttTextCont.Caption:= '';
      SplashCenterPnt.y:= Top + Height div 2;//a middle splash height
      DiffHeight:= Height - sttTextCont.Height;
      Height:= h + 15 + DiffHeight;
      Top:= SplashCenterPnt.y - Height div 2;
      Repaint;
      InMsgStr:= AText;
    end;
  end;
end;   


На винде и убунту все рисуется корректно, а на Дебиан (GTK2) облом

Изображение

Как победить? Буду благодарен за любые идеи

зы: IDE r.57265, fpc r.38156, Win7 x64/Deb 9.2 i386(GTK2)

Добавлено спустя 12 часов 8 минут 1 секунду:
Удалось почти решить альтернативной перерисовкой окна под GTK2 (увы, процесс перерисовки хорошо заметен на глаз)
Код: Выделить всё
  with Self.Canvas do
  begin
    //uses LCLType
    AFlag:= DT_CALCRECT or DT_WORDBREAK or DT_LEFT;

    //uses LCLIntf
    h:= DrawText(Handle,PUTF8Char(AText),UTF8Length(AText), ARect, AFlag);
  end;

  with FrmSplash do
  begin
    sttTextCont.Caption:= '';
    SplashCenterPnt.y:= Top + Height div 2;//a middle splash height
    DiffHeight:= Height - sttTextCont.Height;
    Height:= h + 15 + DiffHeight;

    {$IFDEF LCLGTK2}
    DoSetBounds(Left,SplashCenterPnt.y - Height div 2,Width,Height);
    {$ELSE}
    Top:= SplashCenterPnt.y - Height div 2;
    {$ENDIF}

    InMsgStr:= AText;
  end;   

Изображение
Вложения
published.7z
тестовый проект
(68.27 КБ) Скачиваний: 471
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 458
Зарегистрирован: 17.10.2013 10:55:01

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

Рейтинг@Mail.ru