Перейти к содержанию
Fire Monkey от А до Я

Letos

Пользователи
  • Постов

    57
  • Зарегистрирован

  • Посещение

  • Победитель дней

    2

Весь контент Letos

  1. Вот я и размышляю, и пытаюсь привлечь к этому уважаемых участников форума. И я о том же.
  2. Если аппаратного скроллирования на видеокарте не существует, то, может быть, вопрос в таймере?
  3. Помню, на Спектруме в ассемблере (Z80) была команда HALT, чтобы дождаться обратного хода луча на кинескопе (если успел прорисовать) и тем самым обеспечить плавность. Тут же, в FMX синхронизация с дисплеем обеспечивается размещением прорисовки в OnPaint? Тогда почему же дёргается фон? И да, видал эмуляторы приставок, там фон двигается плавно, значит, как-то можно.
  4. Извини, если вопрос нубский, но где его взять?
  5. В приставках есть видео-сопроцессор (был даже ещё в Амиге в 80-х годах), и в Амиге сколлировалось именно аппаратно. А в моём примере - скроллируется программно, процессором. Неужели графическая видеокарта PC не умеет? Умеет, но как?
  6. Это понятно. Перерисовывать фон не жалко. Но как сделать плавный скроллинг? Вы видели мой пример? Все же рывками двигается фон. Сейчас специально делается видеокарта - со своим(и) процессором(и). (Это тогда процессор, как Z80 в ZX Spectrum, должен был справляться со всеми задачами.)
  7. Кстати, в Win 10 не нашёл такой настройки, неужели, наконец-то догадались эту дурь убрать?
  8. В настройках ОС у тебя не стоит увеличение шрифта? (вредная вещь, сталкивался с такой, даже в своей библиотеке функцию написал для нивелирования этой дури)
  9. Добавлю. Где-то читал рекомендацию использовать т.н. мультимедийный таймер. Но что это такое? И потом, таймер таймером, но как всё же сколлировать фон, неужели перерисовкой каждый раз всей канвы?
  10. Letos

    Скроллинг на канве

    Здравствуйте. Подскажите, пожалуйста, правильно ли я делаю скроллинг фона? Собственно интересует, рационально ли здесь использовать метод DrawBitmap? При этом же прорисовывается вся канва. (И да, помещать картинку на TImage и двигать её я пробовал, так ГОРАЗДО медленнее.) Ведь даже на игровых приставках имелась аппаратная функция скроллинга экрана, реализовано ли это как-то в FMX? Пример я прилагаю, включая exe файл. Как видим, двигается не идеально плавно. //--------------------------------------------------------------------------- #include <fmx.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.fmx" TForm1 *Form1; TBitmap *MapBmImage = new TBitmap; String InitialDirectory; float MapVx=150; // скорость по X, пиксели в секунду float MapOutX=0, MapOutY=0; // координаты левого верхнего угла, с которого выводится фон float ScreenMapWidth, ScreenMapHeight; // ширина и высота фона на экране float MapOutXLimit; //крайняя правая точка карты, которая может быть отражена //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- boolean LoadMapFile() //загрузка карты { String filename=InitialDirectory+"\\2dbackground_b.png"; if(!FileExists(filename)) return false; MapBmImage->LoadFromFile(filename); return true; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { InitialDirectory=ExtractFileDir(ParamStr(0)); // the path and file name of the executing program LoadMapFile(); } //--------------------------------------------------------------------------- void DrawBackground() { TPaintBox *ScreenMap=Form1->PaintBox1; //где отрисовывается карта на экране TRectF MapRect = TRectF(MapOutX, MapOutY, MapOutX+ScreenMapWidth, MapOutY+ScreenMapHeight); TRectF ScreenRect = TRectF(0, 0, ScreenMapWidth, ScreenMapHeight); ScreenMap->Canvas->BeginScene(); ScreenMap->Canvas->DrawBitmap(MapBmImage,MapRect,ScreenRect,255); ScreenMap->Canvas->EndScene(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormShow(TObject *Sender) { ScreenMapWidth=PaintBox1->Width; ScreenMapHeight=PaintBox1->Height; MapOutXLimit=MapBmImage->Width-ScreenMapWidth; } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { if (MapOutX>=MapOutXLimit) MapVx=-1* abs(MapVx); else if (MapOutX<=0) MapVx=abs(MapVx); static DWORD LastTick=0; //из-за неравномерного срабатывания таймера DWORD Tick; float step; Tick=GetTickCount(); if(LastTick!=0) { step=(float)(Tick-LastTick)/1000; // столько секунд прошло } else { step=(float)Timer1->Interval/1000; } LastTick=Tick; float dx; //на столько сдвигаем карту по X dx=MapVx*step; MapOutX+=dx; if (MapOutX>MapOutXLimit) MapOutX=MapOutXLimit; if (MapOutX<0) MapOutX=0; PaintBox1->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TForm1::PaintBox1Paint(TObject *Sender, TCanvas *Canvas) { DrawBackground(); } //--------------------------------------------------------------------------- BackgroundScroll.zip
  11. Спасибо. Хоть это не совсем то, что ClientWidth в VCL (как начинаю понимать, прямого аналога нет), так Content.Width меняется при появлении полосы прокрутки и при изменении ширины колонок, но из этого уже можно что-то слепить...
  12. Так как получить клиентский размер у StringGrid?
  13. Нашёл, что ширину ScrollBar можем узнать так: int ScrollBarW=GetSystemMetrics(SM_CXVSCROLL); А всё-таки, клиентские размеры убрали из FMX?
  14. Letos

    TStringGrid - Header

    Вот решение void __fastcall TForm1::StayingGridApplyStyleLookup(TObject *Sender) { THeader *Header; Header=(THeader*) (Form1->StayingGrid ->FindStyleResource("header")); if(Header!=NULL) { for (int i = 0; i < Header->Count; i++) { THeaderItem *HeaderItem; HeaderItem=(THeaderItem*) (Header->Items[i]); HeaderItem->TextSettings->HorzAlign=TTextAlign::Center; } } }
  15. Letos

    ClientWidth и ClientHeight

    Здравствуйте. Не могу найти в FMX у многих компонентов такие свойства как ClientWidth и ClientHeight. В частности, я хочу установить в TStringGrid ширину колонок, чтобы избежать появления вертикальной полосы прокрутки, но ширину клиентской области узнать не могу (в отличие от VCL, где пользовался ClientWidth). Или хотя бы, как узнать ширину полосы прокрутки, если напрямую ClientWidth не узнать?
  16. А я разобрался от чего такое было. Это моя ошибка. В событии OnPaint у меня было условие: void __fastcall TForm1::MapImagePaint(TObject *Sender, TCanvas *Canvas, const TRectF &ARect) { if(MapRepainting) DisplayMap(); } А так работает: void __fastcall TForm1::MapImagePaint(TObject *Sender, TCanvas *Canvas, const TRectF &ARect) { // if(MapRepainting) DisplayMap(); DisplayMap(); } Почему-то действия на другом компоненте затрагивают перерисовку TImage...
  17. Вот разместил компонент TMemo на дополнительной FMX форме, теперь при работе с Memo картинка на первой форме не затрагивается.
  18. Да, вижу, добавил в примере на твою форму Memo, набираю там текст, канва не нарушается. Но я с FMX очень мало работал, может разница в том, что мы по-разному рисуем канву? Я свою рисую в событии OnPaint (которое по необходимости вызывается), где вызывается функция, отрисовывающая карту и то, что на ней. И рисую, в отличие от твоего примера, между BeginScene и EndScene: ScreenMap->Canvas->BeginScene(); ScreenMap->Canvas->DrawBitmap(MapBmImage,MapRect,ScreenRect,1); DisplayTrolls(ScreenMap); ScreenMap->Canvas->EndScene();
  19. Наверное, попробую компоненты разместить на другой форме (скорее всего, даже VCL), надеюсь, хоть там не будет глюка, но всё же непонятно, почему такое происходит...
  20. Да нет, обращаюсь к Memo по-простому (тут по событию таймера): ... //отмечаем события троллейбусов for (unsigned int i = 0; i < TrollPositions_main.size(); i++) { sTrollPosition &P=TrollPositions_main[i]; String S=P.Description; if(S!=NoNameSite) { TMemo *m= Form1->Memo1; S=P.TrollNum+": "+S; S+=", "+P.preDescription; S+=", "+P.LastKon; m->Lines->Add(S); vfScrollMemoDown(m); // MapRepaint(); } } ... Вызов своей функции по перерисовке карты MapRepaint(), который тут закомментирован, помогает, но не вставлять же его после каждого действия с компонентами...
  21. Letos

    TStringGrid - Header

    Так к хэдеру есть обращение программное?
  22. Letos

    TStringGrid - Header

    Например, нет у меня никокого GridPanelLayout. Есть Form1->StringGrid1, например. ГДЕ там Header?
  23. Letos

    TStringGrid - Header

    мне нужно программно обратиться к Хедеру. Как это сделать?
  24. Letos

    TStringGrid - Header

    Доступ к заголовку TGrid подскажите, пожалуйста, как например, выровнять текст в заголовке таблиц StringGrid, скажем, по центру да, я нашёл тут https://stackoverflow.com/questions/32131522/change-theader-font-size-in-fmx-tstringgrid но мне нужно на C++, я немогу перевести, компилятор затыкается уже на типе THeader - не знает такого.
×
×
  • Создать...