Форум: "WinAPI";
Текущий архив: 2009.09.13;
Скачать: [xml.tar.bz2];
ВнизНужно содержимое большой панели вывести в EMF файл Найти похожие ветки
← →
Mielofon (2008-07-11 19:47) [0]Нужно всё содержимое панели вывести в EMF файл.
Имеем следующий код. Просто тест.unit Unit24;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm24 = class(TForm)
ScrollBox1: TScrollBox;
Panel1: TPanel;
Button1: TButton;
Edit1: TEdit;
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
procedure PaintScaleVCLToEMF(Scale: double);
{ Private declarations }
public
{ Public declarations }
sp: TPanel;
end;
var
Form24: TForm24;
implementation
{$R *.dfm}
procedure TForm24.Button1Click(Sender: TObject);
begin
PaintScaleVCLToEMF(StrToFloat(Edit1.Text));
end;
procedure TForm24.PaintScaleVCLToEMF(Scale: double);
var
i, j, res: integer;
sl: TLabel;
mf: TMetaFile;
mfc: TMetafileCanvas;
rect: TRect;
rgn: HRgn;
begin
if sp <> nil then FreeAndNil(sp);
//Создаём панель и кучу лабелов с учтом масштаба
sp := TPanel.Create(nil);
sp.Visible := false;
sp.Parent := ScrollBox1;
sp.Left := 10; sp.Top := 10;
sp.Width := round(1000*Scale);
sp.Height := round(1000*Scale);
for j := 0 to 8 do begin
for i := 0 to 65 do begin
sl := TLabel.Create(sp);
with sl do begin
Parent := sp;
Top := Round(i*15*Scale);
Left := Round(20+ j*110*Scale);
Width := Round(100*Scale);
Height := Round(10*Scale);
Caption := "Text "+ IntToSTr(i);
Font.Height := Round(-11*Scale);
Alignment := taCenter;
BevelWidth := Round(2*Scale);
Layout := tlCenter;
AutoSize := False;
case ((i+j) mod 4) of
0: Color := clWhite;
1: Color := clGray;
2: Color := clGreen;
3: Color := clRed;
end;
ParentColor := False;
ParentFont := False;
end;
end;
end;
sp.Visible := true;
mf := TMetaFile.Create;
mf.width := sp.Width;
mf.Height := sp.Height;
mfc := TMetafileCanvas.Create(mf, 0);
// res := GetClipBox(mfc.Handle, rect);
// rect.Right := sp.Width div 2;
// rect.Bottom := sp.Height div 2;
// rect.Left := 500;
// rect.Top := 500;
// rgn := CreateRectRgnIndirect(rect);
// ExtSelectClipRgn(mfc.Handle, rgn, RGN_OR);
// SelectClipRgn(mfc.Handle, rgn);
// res := GetClipBox(mfc.Handle, rect);
sp.paintTo(mfc, 0,0);
with mfc do begin
pen.color := clRed;
pen.width := 4;
// рисуем крест по диагонали
moveto(0,0);
lineto(sp.width, sp.Height);
lineto(0, sp.Height);
lineto(sp.width, 0);
GetClipBox(mfc.Handle, rect);
// рисуем ClipBox нашего MetaFileCanvas
moveto(rect.Right,rect.Top);
lineto(rect.Right, rect.Bottom);
lineto(rect.Left, rect.Bottom);
end;
mfc.Destroy;
deletefile("123.emf");
mf.SaveToFile("123.emf");
mf.Destroy;
end;
procedure TForm24.FormCreate(Sender: TObject);
begin
sp := nil;
end;
procedure TForm24.FormShow(Sender: TObject);
begin
PaintScaleVCLToEMF(StrToFloat(Edit1.Text));
end;
end.
Так вот получается следующая петрушка:
Если панель влазит на экран (зависит от разрешения, у меня например PaintScaleVCLToEMF(0.5) ), то все созданые TLabel прекрасно выводятся в EMF.
Но если размер выводимой панели зашкаливает (PaintScaleVCLToEMF(10) например) то выводится только та часть TLabel-ов, которая "как бы" попадает на экран (в левом верхнем углу EMF). Хотя на самой форме они все прекрасно показываются (если поскролить TScrollBox). При этом LineTo, MoveTo отрабатывают по всей площади EMF.
Вот вопрос:
как бы сделать что бы вывелись все компоненты?
← →
MultIfleX (2008-07-18 14:51) [1]А для чего создавать кучу лабелов с именами "text 1","text 2","text 3"..а потом их выводить в метафайл ?? Если нужно выводить только текст, то используй DrawText(). Или нормально поясни задачу, лично пока смотрел код сломал голову.
> Хотя на самой форме они все прекрасно показываются (если
> поскролить TScrollBox).
поясни как скроллиш, если создаются и выводятся в одной процедуре?
улыбнуло TForm24 )) у тебя 24 формы ? o_O
ЗЫ. Код твой запустил в малюююсеньком окне, выполнил и ВЫВЕЛИСЬ В ФАЙЛ ОБСОЛЮТНО ВСЕ МЕТКИ и КРАСНЫЙ КРЕСТ ПОВЕРХ, ничего не менял, нахожусь в замешательстве - ты чаво спросил то??
← →
Mielofon (2008-07-22 18:12) [2]>А для чего создавать кучу лабелов с именами "text 1","text 2","text 3"..а >потом их выводить в метафайл ?? Если нужно выводить только текст, то >используй DrawText().
Это пример. Пример создал за 5ть минут на коленках только для демонстрации ошибки. Никакого практического смысла тут нет.
Там где есть смысл выводятся не TLabel-ы, а другие компоненты, но суть от этого не меняется.
← →
Mielofon (2008-07-22 18:12) [3]>Или нормально поясни задачу, лично пока смотрел код сломал голову.
Там коду 3 строчки - где там разбираться то?
>поясни как скроллиш, если создаются и выводятся в одной процедуре?
Скролю ручками/мышкой - там справа и внизу скролбары.
Вот что мы видим (масштаб 2 в поле ввода - что бы картинки поменьше были) если отскролить в правый нижний угол:
http://img246.imageshack.us/img246/9429/p1xx8.jpg
т.е. на ScrollBox1 у нас 65 строчек с TLabel-ами (колонки не считаем)
А вот что выводится в наш EMF:
http://img170.imageshack.us/img170/7476/123resizeiw0.jpg
Увеличеный центр:
http://img413.imageshack.us/img413/1037/123resizebt0.jpg
Т.е. видно что вывелось только 28 рядов TLabel-ов, а остальные 17ть пропали.
← →
Mielofon (2008-07-22 18:13) [4]Если увеличивать масштаб, то будет ещё хуже. Если уменьшать, то можно добится, когда размер выводимой EMF будет меньше разрешения экрана и тогда все войдут.
>ЗЫ. Код твой запустил в малюююсеньком окне, выполнил и ВЫВЕЛИСЬ В >ФАЙЛ ОБСОЛЮТНО ВСЕ МЕТКИ и КРАСНЫЙ КРЕСТ ПОВЕРХ, ничего не менял, >нахожусь в замешательстве - ты чаво спросил то??
А у тебя что все 65 рядов вывелись при масштабе 10?
Если так, то давай скриншот в студию. Можешь куда-нибудь EMF запулить - они маленькие к Кб получаются, но правда большие по разрешению :-)
При масштабе 10, т.е. сразу после запуска данной програмки получается EMF размером 10006x10006 размером в 36Кб с 5тью строчками и 2мя рядами TLabel-ов.
Обсуждение есть ещё http://www.delphikingdom.com/asp/answer.asp?IDAnswer=63747, но решения проблемы так и нет.
← →
Mielofon (2008-07-22 19:11) [5]Вот сам EMF http://depositfiles.com/files/6711200
← →
multiflex (2008-07-25 07:17) [6]Повторно создал форму и разместил компоненты прям как у тебя, и снова все прекрасно вывелось...
http://img133.imageshack.us/img133/6738/votvedxga1.jpg
Вы скажете ДевидБлейн?? Аннет - в vcl косяк гдето.. у мну д2007.
← →
Mielofon (2008-07-25 15:24) [7]
> Вы скажете ДевидБлейн?? Аннет - в vcl косяк гдето.. у мну
> д2007.
>
В рот мне ноги! :-)
У меня Delphi 2006. Действительно исправили видимо.
Пошел думать насчёт перехода....
Спасибо.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2009.09.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c