Поиск аналога виндовых функций в FPC
Модератор: Модераторы
-
Alex_123_1
- новенький
- Сообщения: 26
- Зарегистрирован: 24.07.2009 10:02:52
Поиск аналога виндовых функций в FPC
Доброе время суток. Сейчас разрабатываю проект в делфях (мне в нем пока проще). Затем хочу перетащить его на fpc. В качестве IDE буду юзать Lazarus. Компилить хочу и для винды и для линукса. На данный момент разрабатываю парсер wmf/emf файлов. Без использования специализированной winapi метадряни. Для отрисовки хотел заюзать функции типа BeginPath, EndPath, PathToRegion, PaintRGN, FrameRGN и т.п. из юниты windows.
Такой вопрос есть ли аналоги этих функций в fpc/lazarus под виндой/линуксом? Если есть то в какой юните они лежат.
Такой вопрос есть ли аналоги этих функций в fpc/lazarus под виндой/линуксом? Если есть то в какой юните они лежат.
Всё что для Windows в соответсвующем модуле Windows
Утверждать небуду, но возможно есть аналоги и для Linux....
Утверждать небуду, но возможно есть аналоги и для Linux....
-
Alex_123_1
- новенький
- Сообщения: 26
- Зарегистрирован: 24.07.2009 10:02:52
но возможно есть аналоги и для Linux....
вот это "возможно" хотелось бы и узнать точно. В противном же случае придется обходиться без этих функций, что в конечном итоге сильно повлияет на скорость.
да и еще небольшой вопрос. Чтоб новую ветку не создавать.
На делфях у мну такой код
var
pRecWmf:PMetaRecord;
buff:string;
...
setlength(buff, size);
pRecWmf:=Pointer(buff)
...
работает на ура. Под лазарем же ругается, что-то типа "Error convert что-то там. непомню"
возможно из-за юникодовского string, хотя недолжно бы. Да и кстати какой тип строки в фпк не юникодовский
String - однобайтная строка
WideString - двухбайтная строка
Добавлено спустя 10 минут 25 секунд:
Посмотри этот пакет. Там реализован класс TMetaFile
Добавлено спустя 43 секунды:
но он только для Windows
WideString - двухбайтная строка
Код: Выделить всё
pRecWnf:=@buff[1];
Добавлено спустя 10 минут 25 секунд:
Посмотри этот пакет. Там реализован класс TMetaFile
Добавлено спустя 43 секунды:
но он только для Windows
-
Alex_123_1
- новенький
- Сообщения: 26
- Зарегистрирован: 24.07.2009 10:02:52
я его уже смотрел прежде чем начинать писать парсер. Он и впрям только для винды (все из за "специализированной winapi метадряни") и ктомуже
Код: Выделить всё
procedure TMetafile.LoadFromFile(const Filename: String);
begin
[b] raise EComponentError.Create('Not Implemented');[/b]
end;Alex_123_1
А Вы напишите на русском языке, что делает каждая из этих функций, тогда можно быстро им найти замену или в Linux или fpc (несвязанную с WinAPI).
А Вы напишите на русском языке, что делает каждая из этих функций, тогда можно быстро им найти замену или в Linux или fpc (несвязанную с WinAPI).
-
Alex_123_1
- новенький
- Сообщения: 26
- Зарегистрирован: 24.07.2009 10:02:52
Vadim 24.07.2009 11:55:53
Код: Выделить всё
var
rgn: hRGN; ////указатель на структуру региона в памяте
begin
/////////////////////////////////////////// привязываем хендл канвы к создаваемому пути
BeginPath(canvas.Handle);
///////////////////////////////////////////рисуем на канве////////////////////
Canvas.Rectangle(50, 50, 200, 200);
Canvas.Rectangle(80, 80, 120, 120);
///////////////////////////////////////////закрываем путь////////////////////
EndPath(canvas.Handle);
////////////////////////////////////////считываем с канвы инвормацию преобразуя ее в регион/////
RGN := PathToRegion(canvas.Handle);
////////////////////////////////////////отрисовываем регион "заливку"/////////
Canvas.Brush.Color := clred;
PaintRGN(canvas.Handle, RGN);
////////////////////////////////////////отрисовываем регион "обводку"/////////
Canvas.Brush.Color := clblue;
FrameRGN(canvas.Handle, rgn, canvas.Brush.Handle, 5, 2);
end;в итоге получается красный квадрат, со сковзной дыркой и синей обводкой, которая внизу и верху 2 пикселя, а по бокам 5 пикселей.
Это нужно для того чтоб получилась заливка на канве (без floodfill) например этого
EMR_HEADER
EMR_SETMAPMODE
EMR_SETWINDOWORGEX
EMR_SETWINDOWEXTEX
EMR_SETWINDOWORGEX
EMR_SETWINDOWEXTEX
EMR_SETVIEWPORTORGEX
EMR_SETVIEWPORTEXTEX
EMR_SETWINDOWEXTEX
EMR_SETVIEWPORTEXTEX
EMR_SETPOLYFILLMODE
EMR_EXTCREATEPEN
EMR_SELECTOBJECT
EMR_BEGINPATH
EMR_MOVETOEX
EMR_LINETO
EMR_POLYBEZIERTO16
EMR_LINETO
EMR_POLYBEZIERTO16
EMR_LINETO
EMR_POLYBEZIERTO16
EMR_LINETO
EMR_POLYBEZIERTO16
EMR_CLOSEFIGURE
EMR_ENDPATH
EMR_STROKEPATH
EMR_SELECTOBJECT
EMR_DELETEOBJECT
EMR_EOF
или чтонить еще сложнее.
Это считка команд с emf файла. Где отображен квадрат с круглеными углами
Alex_123_1 писал(а):привязываем хендл канвы к создаваемому пути
Вот если, к примеру, что такое хэндл канвы я понимаю, в Х-ах ему соответствует графический контекст, который получают функцией XCreateGC() (в WinAPI аналог - CreateDC() или GetDC() ), то что такое "путь", Вы можете рассказать?
-
Alex_123_1
- новенький
- Сообщения: 26
- Зарегистрирован: 24.07.2009 10:02:52
что такое "путь", Вы можете рассказать?
то же, что и кривые безье, только (насколько я знаю) более сложно организваные.
в частности регион это (грубо) замкнутый объект с заливкой внутри.
При выполнении команды
RGN :=PathToRegion(canvas.Handle);
на самом деле создается два региона при отрисовке которых происходит вычитание одного из другого, таким образом появляется "дырка"
а path же ето единая кривая без всяких вырезаний. Ее можно хорошо наблюдать например в кореле. Когда из одного объекта вырезаешь другой
Alex_123_1
Хм... Можно ли тогда сказать, что "путь" - это контуры (границы) фигуры?
Хм... Можно ли тогда сказать, что "путь" - это контуры (границы) фигуры?
-
Alex_123_1
- новенький
- Сообщения: 26
- Зарегистрирован: 24.07.2009 10:02:52
можно сказать и так. Причем им (контурам) совсем не обязательно принадлежать единой обводке. Например можно отобразить два квадрата на растоянии метра друг от друга и объеденить их в один "путь". И этот "путь" будет единой кривой со всеми вытекающими из этого свойствами.
Добавлено спустя 8 минут 36 секунд:
а еще точнее, если не ошибаюсь, это массив регионов...
Добавлено спустя 8 минут 36 секунд:
а path же ето единая кривая без всяких вырезаний.
а еще точнее, если не ошибаюсь, это массив регионов...
Используйте Wine. У Вас будет все (почти все), что есть под Windows.
-
Alex_123_1
- новенький
- Сообщения: 26
- Зарегистрирован: 24.07.2009 10:02:52
да ну, както несерьезно.
Вот можно попытаться выдернуть реализацию этих функций из исходников wine... но чувствую это будет еще тот гемор
Вот можно попытаться выдернуть реализацию этих функций из исходников wine... но чувствую это будет еще тот гемор
-
Павел Ишенин
- постоялец
- Сообщения: 475
- Зарегистрирован: 24.03.2007 09:16:52
Не все функции для отрисовки ломаных реализованы в lazarus. Так, например, есть MoveToEx, LineTo, PolyLine, но нет BeginPath, EndPath. Для их использования надо подключать модуль LCLIntf. При нахождении аналогов необходимых функций в gtk2, qt, carbon их будет можно добавить и в LCL.
Alex_123_1 писал(а):да ну, както несерьезно.
Наоборот, как раз именно это и серьёзно.
