Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как


Людмила ©   (2002-02-12 17:56:00) 

Я рисую на канве метафайла картинки, которые заведемо полностью туда не влезают. Т.е. при рисовании некоторые части рисунка имеют отрицательные координаты. Но в отличие от Bitmap при выводе этого метафайла на принтер или экран отображается все нарисованное, даже то, что в канву не должно было влезть. Как мне "обрезать" ненужные части?


troits   (2002-02-13 16:47:00) [1]

В SDK написано, что при PlayEnhancedMetaFile Clip Region надо указывать для DC самостоятельно.

Так что можно поробовать что-то вроде этого:

procedure TForm1.FormPaint(Sender: TObject);
var
wRgn: HRGN;
begin
wRgn := CreateRectRgn(0, 0, FMetaFile.Width, FMetaFile.Height);
SelectClipRgn(Canvas.Handle, wRgn);
Canvas.Draw(0, 0, FMetaFile);
SelectClipRgn(Canvas.Handle, 0);
DeleteObject(wRgn);
end;


Людмила   (2002-02-13 13:10:00) [2]

Спасибо за участие, но в том-то и проблема, что мне BMP использовать вообще нельзя, он слишком много ресурсов жрет. Я рисую на канве метафайла, а потом этот метафайл печатаю или отображаю на форме в некоторой области (Draw или StretchDraw на канве принтера или формы). Вот тогда-то и вылезают все эти части, которые в метафайле были отрицательные и не должны были напечататься. Это никак не связано с DC, то биш Device Context?


Лёша   (2002-02-13 06:10:00) [3]

Не надо обрезать. Возьмите другую программу просмотра и печати метафайла. Большенство из них выводят метафайл в (0,0).
Если же метафайлы надо сохранять и "обрезанные" части не нужны, тогда лучше сразу, ещё при рисовании на метафайле битмапов, отсекать лишнее.
With TMetafileCanvas.Create(MyMetafile,0) do
begin
//Dest-на канве, Source-на битмапе
if Dest.Left<0 then
begin
Source.Left:= Source.Left-Dest.Left;
Dest.Left:=0;
end;
if Dest.Top<0 then
begin
Source.Top:= Source.Top-Dest.Top;
Dest.Top:=0;
end;
CopyRect(Dest, BMP.Canvas, Source);
Free;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо