Вверх ↑
Этот топик читают: Гость
Ответов: 2125
Рейтинг: 159
#46: 2008-03-06 17:15:38 ЛС | профиль | цитата
nesco писал(а):
tsdima, зачем у тебя указано два вызова DrawSource
Что означает константа nFunc

Первый вызов инициализирует переменную dc, второй - соответственно, чистит.
То есть предполагалость сделать так:


#pas
procedure THIImg.Context(var _Data:TData; var dc:HDC; nFunc:word);
begin
case nFunc of
1: begin
dc := ReadInteger(_Data,_data_Bitmap,0);
end;
end;
end;

procedure THIImg.Bitmap(var _Data:TData; var dc:HDC; nFunc:word);
begin
case nFunc of
1: begin
bmp := ReadBitmap(_Data,_data_Bitmap,nil);
dc := bmp.Canvas.Handle;
end;
end;
end;

procedure THIImg.Handle(var _Data:TData; var dc:HDC; nFunc:word);
begin
case nFunc of
1: begin
wnd := ReadInteger(_Data,_data_Bitmap,0);
dc := GetDC(wnd);
end;
2: begin
ReleaseDC(wnd, dc);
end;
end;
end;

procedure THIImg_Line._work_doDraw;
var dc:HDC; c:integer; hp:HPEN;
begin
_prop_DrawSource(_Data, dc, 1);
ReadXY(_Data); // -- это, возможно, делать внутри _prop_DrawSource и с учётом MapMode
c := ReadInteger(_Data,_data_Color,_prop_Color);
hp := CreatePen(0,ReadInteger(_Data,_data_Size,_prop_Size),c);
SelectObject(DC,hp);
MoveToEx(DC,x1,y1,nil);
LineTo(DC,x2,y2);
DeleteObject(hp);
_prop_DrawSource(_Data, dc, 2);
_hi_CreateEvent(_Data,@_event_onDraw,dt);
end;

nesco писал(а):
как передать и определить разницу между hWnd и hDC -- использовать разницу типов, я правильно понял

Использовать dtObject

nesco писал(а):
Как получить MapMode

GetMapMode(dc);

------------ Дoбавленo:

dc можно сделать членом базового класса
_prop_DrawSource числом, а вместо вызовов _prop_DrawSource нормальные процедуры imgGetDC, imgReleaseDC, imgMapPoint
в базовом классе можно добавить свойство "еденицы измерения координат", которое будет использовать imgMapPoint, чтобы привести координаты к нужному MapMode (текущий в контексте)
------------ Дoбавленo:

Хотя по моему убеждению, всегда можно сделать SetMapMode, чтобы установить еденицы измерения координат.
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#47: 2008-03-06 17:21:20 ЛС | профиль | цитата
tsdima, мдяяя уж... буду переваривать.
tsdima писал(а):
_prop_DrawSource нормальные процедуры imgGetDC, imgReleaseDC, imgMapPoint
Ты имеешь ввиду вызывать их не внутри _prop_DrawSource, а как обычные методы, поясни подорбнее.
карма: 22

0
Ответов: 2125
Рейтинг: 159
#48: 2008-03-07 00:38:35 ЛС | профиль | цитата
Сейчас _prop_DrawSource это указатель на процедуру, а я предлагаю заменить его на число, которое и будет использоваться в функциях imgGetDC, imgReleaseDC
Т.е. процедура doDraw будет выглядеть так:


#pas
procedure THIImg_Line._work_doDraw;
var dc:HDC; c:integer; hp:HPEN;
begin
dc := imgGetDC(_Data);
ReadXY(_Data);
c := ReadInteger(_Data,_data_Color,_prop_Color);
hp := CreatePen(0,ReadInteger(_Data,_data_Size,_prop_Size),c);
SelectObject(DC,hp);
MoveToEx(DC,x1,y1,nil);
LineTo(DC,x2,y2);
DeleteObject(hp);
imgReleaseDC(dc);
_hi_CreateEvent(_Data,@_event_onDraw,dt);
end;

function THIImg.imgGetDC(var _Data:TData):HDC;
begin
case _prop_DrawSource of
Handle: begin
wnd := ReadInteger(_Data,_data_Bitmap,0);
Result := GetDC(wnd);
end;
Bitmap: begin
bmp := ReadBitmap(_Data,_data_Bitmap,nil);
Result := bmp.Canvas.Handle;
end;
Context:
Result := ReadInteger(_Data,_data_Bitmap,0);
end;
end;

procedure THIImg.imgReleaseDC(dc:HDC);
begin
case _prop_DrawSource of
Handle:
ReleaseDC(wnd, dc);
end;
end;
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#49: 2008-03-07 01:16:59 ЛС | профиль | цитата
tsdima, но тогда , такой метод можно еще и для отрисовки сделать -- ImgPaintDC и ему передавать парамет метрики
карма: 22

0
Ответов: 2125
Рейтинг: 159
#50: 2008-03-07 11:05:40 ЛС | профиль | цитата
Да, можно и так. Сделать виртуальную функцию для отрисовки (вызываемую в базовом классе), и передавать ей контекст. То есть, то, как ты до этого сделал, в принципе верно, но "мясо" надо было в виртуальную функцию перенести, а не передавать параметр, который говорит, что рисовать надо. Тогда и принципы ООП не пострадают
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#51: 2008-03-07 13:57:12 ЛС | профиль | цитата
tsdima, подскажи, как убрать вертикальное зеркало на принтере, ничерта не получается -- SetLayot с LAYOUT_BITMAPORIENTATIONPRESERVED крнтекста принтера не помогает, попробовал NOMIRRORBITMAP в BitBlt, тоже не помогает. Ну не делать же промежуточный bitamp, и его зеркалировать.
карма: 22

0
Ответов: 2125
Рейтинг: 159
#52: 2008-03-07 17:09:54 ЛС | профиль | цитата
Если использовать MM_TEXT, то никакого зеркалирования нет. Вывод - убрать SetMapMode или принудительно ставить MM_TEXT при выводе графики. Координаты и размеры придётся пересчитывать вручную, в зависимости от dpi контекста (который, в общем случае, не всегда одинаковый по осям Х и Y).
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#53: 2008-03-07 20:50:48 ЛС | профиль | цитата
tsdima, а качество графики, какое Я пробовал MM_LOMETRIC и MM_LOENGLISH, так плевался дальше, чем видел
карма: 22

0
Ответов: 2125
Рейтинг: 159
#54: 2008-03-07 23:09:17 ЛС | профиль | цитата
Вобщем, ничего другого не приходит в голову, как только растягивать картинку до нужного dpi и использовать MM_TEXT. С учётом свойства "еденицы измерения" и dpi контекста можно посчитать новые размеры картинки в пикселях контекста, и растянуть её в памяти перед выводом (если dpi не совпадают). Только вот, мы знаем размеры нашей картинки в пикселях, а не в дюймах. Можно, конечно, использовать dpi дисплея, чтобы выяснить размер картинки в дюймах - получишь wysiwyg А качество будет зависеть от того, насколько качественно ты сможешь растянуть/сжать картинку.
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#55: 2008-03-08 03:14:41 ЛС | профиль | цитата
tsdima писал(а):
Только вот, мы знаем размеры нашей картинки в пикселях, а не в дюймах. Можно, конечно, использовать dpi дисплея, чтобы выяснить размер картинки в дюймах - получишь wysiwyg

Ну дык, я так и делаю -- шкала пересчета вычисляется элементарно (по аналогии с компонентом принтера) делим Printerdpi на DCdpi, вот и все, сработало безотказно.
tsdima писал(а):
растянуть её в памяти перед выводом

Механизи вывода (с твоей помощью) я уже отработал, тут проблем нет.
При MM_TEXT оказалось ненужным инвертировать у, но вот качество печати дома проверить не смогу (нэма принтера), только на эмуляторе Office.
И еще, я призадумался о целесообразности применения прямого построения графических образов на контексте принтера -- маразмом это попахивает. Может только один компонент снабдить такой фичей -- Img_Bmp. В этом случае получается, что отрисовываем на экране, а затем выводим копию готового контекста на принтер -- и быстрее, и проще.
карма: 22

0
Ответов: 2125
Рейтинг: 159
#56: 2008-03-08 21:25:22 ЛС | профиль | цитата
nesco писал(а):
о целесообразности применения прямого построения графических образов на контексте принтера

Большинство современных принтеров поддерживают большое количество графических примитивов. В случае с миллиметровой сеткой мы имеем ~500 линий, допустим линия при передаче на принтер - это тип, координаты, толщина, цвет, что-то около 30 байт. Итого 15 кБ. А картинка на весь лист, даже если всего 200 dpi ~ 4 мегапикселя ~ 500 Кб монохром и 12 Мб в цвете. Вот и выбирай.
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#57: 2008-03-08 22:04:52 ЛС | профиль | цитата
tsdima писал(а):
Вот и выбирай
А значит, твоя концепция не подходит, с подгоной контекста, тк отрисовка уже произошла на чужом контексте, а вот тут как раз и подходит концепция, которую я сделал в начале, где отрисовывал прямо на контекстах (это как раз то, о чем ты только что написал).
Когда я делаю вот так через API -- Rectangle(pDC, x1, y1, x2, y2), то система сама разбирается что делать с этим прямоугольником, и где его рисовать, что не скажешь, ни о StretchBlt, ни о BitBlt, когда системе тупо говорят скопировать образ из одного места в другое, откуда ей бедной знать, что на контексте отрисован прямоугольник.

карма: 22

0
Ответов: 2125
Рейтинг: 159
#58: 2008-03-08 22:50:04 ЛС | профиль | цитата
А насчёт графических примитивов я ничего и не говорил. Речь шла о выводе на принтер картинок (битмапов), которые нужно растягивать/сжимать до нужного размера. Для линий, точек и тому подобного достаточно пересчитать координаты (и др. значимые параметры, толщину линии, например).
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#59: 2008-03-09 00:49:35 ЛС | профиль | цитата
Да понял я все это прекрасно. Сел, хорошо подумал, и упростил все это еще больше, осталось на принтере проверить, жаль прозрачность не поддерживается при выводе на принтер, а так все работает.
карма: 22

0
Ответов: 3655
Рейтинг: 69
#60: 2008-03-09 11:32:36 ЛС | профиль | цитата
nesco писал(а):
осталось на принтере проверить,

Так выкладывай ,я проверю.
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)