2012-01-09 38 views
5

Tôi đang gặp sự cố với hiển thị siêu dữ liệu trong ứng dụng XE Delphi của mình.khi hiển thị siêu tệp, văn bản quá lớn

vấn đề là khi tôi hiển thị siêu dữ liệu, các văn bản quá lớn. Irfanview và FastReports làm cho nó như thế này:

look at the text to the left of the graph

windows 7 sơn làm cho nó tốt: (đây là những gì các văn bản sẽ giống như thế)

windows 7 Paint renders it fine

Bất kỳ ý tưởng những gì đang gây ra điều này?

Cảm ơn bạn!

+5

How are you tạo file meta? Điều gì về một số mã? –

+0

Nhìn kỹ hơn về điều này trên một máy tính thực sự, tôi nhận ra loại hiệu ứng đó. Tôi đã nhìn thấy nó với đầu ra của chương trình của riêng tôi. Tôi nghĩ đó chỉ là bản chất của cách thức một số gói rasterise một metafile. Rõ ràng metafile là tốt bởi vì một gói làm cho nó tốt. Chương trình khác bạn nên xem là Word. Nếu bạn muốn xuất khẩu để tiêu thụ bởi một gói đồ họa raster sau đó xuất khẩu dưới dạng bitmap ở định dạng PNG tốt nhất. –

+0

cảm ơn ý kiến ​​của bạn. @DavidHeffernan: metafile được tạo bởi engine đồ họa của bên thứ 3. –

Trả lời

0

Một chút một canh bạc, nhưng:

lẽ đã làm với các phông chữ hệ thống mới trong Vista + rằng sự ủng hộ mới của Delphi? Nếu nó xảy ra trong quá trình chuyển, hãy sửa phông chữ được sử dụng trong tmetafile trong phiên bản cũ và mới.

+2

Nếu không biết bối cảnh thiết bị tham chiếu trong mã từ OP nó chỉ đoán. –

+0

không nghĩ đến điều đó. Tôi sẽ nói chuyện với nhà cung cấp. cảm ơn bạn! –

+3

Martin: tốt, đó là những gì "canh bạc" có nghĩa là :-) –

4

emf tệp chỉ là danh sách các lệnh GDI. Trong thực tế, chúng có thể được "phát lại" rất dễ dàng bởi hệ thống, sử dụng lệnh Windows GDI tiêu chuẩn (trong Delphi, một TMetaFile chỉ là một trình bao bọc xung quanh các API đó).

Khi IrfanView hoặc FastReport hiển thị nội dung siêu tệp, họ chỉ sử dụng lệnh tương ứng Windows GDI. Khi Windows 7 Paint hiển thị nội dung siêu dữ liệu, nó sử dụng trình kết xuất GDI +. Tôi thậm chí còn nghĩ rằng nó chuyển đổi nội bộ tệp emf thành định dạng emf+, sau đó hiển thị nó với chống aliaising bằng GDI +.

Vì vậy, nếu các tập tin emf kết xuất không đúng trong IrfanView hoặc FastReport, tôi nghi ngờ điều này là bởi vì Metafile của bạn không cũng được hình thành: động cơ đồ họa của bên thứ ba mà bạn đang sử dụng là sản xuất emf tiêu chuẩn không. Một vấn đề có thể xảy ra là phông chữ được sử dụng bị thiếu trong hệ thống đích và GDI không thay thế phông chữ giống như GDI +.

khả năng khác là các tập tin emf là có thể một kép dạng : nó chứa cả emf định dạng (mà không đúng cách đã tạo nên không trả lại một cách chính xác sử dụng GDI) và emf+ định dạng (được trả lại như mong đợi sử dụng GDI +) . Thông thường, định dạng képemf/emf+ không tồn tại: ngay cả thư viện GDI + chính thức không cho phép lưu nội dung siêu tệp của mình trong emf +. Đây là một loại định dạng "quái vật", được tạo bởi thư viện bên thứ ba của bạn.

Tôi đề nghị như sau:

  • Tải về và kiểm tra tập tin emf của bạn với EmfExplorer;
  • Cố gắng sử dụng GDI + để hiển thị siêu dữ liệu;
  • Hãy thử sử dụng API chuyển đổi emf đến emf+.

Để sử dụng GDI +, hãy xem mã nguồn mở SynGdiPlus unit: nó sẽ thêm GDI + chống aliaising vào bitmap đã tạo của bạn. Nó có thể chuyển đổi emf thành emf+. Nó sẽ sử dụng Vista/Seven API (giống như Windows 7), hoặc mã Delphi đơn giản trong Windows XP.

+0

+1 Thông tin tuyệt vời. –

1

Nguyên nhân có thể là do kích thước màn hình và tỷ lệ độ phân giải màn hình khác nhau. GDI có thông số HORZRES, HORZSIZE, VERTRES, VERTSIZE. Trong hầu hết các trường hợp, HORZRES/VERTRES, HORZSIZE/VERTSIZE (tỷ lệ phân giải và tỷ lệ màn hình) giống nhau và mọi thứ hoạt động tốt ... Tuy nhiên, nếu chúng khác nhau (tôi đã tìm thấy một số ví dụ về điều này xảy ra trên máy chủ) thì pixel được giả định là hình chữ nhật, gây ra LOGFONT.lfWidth để được tính "sai". LOGFONT.lfWidth xác định tỷ lệ khung hình của các ký tự và điều này cuối cùng gây ra các chữ cái lạ.

Một giải pháp là thay đổi độ phân giải để phù hợp với HORZRES/VERTRES, HORZSIZE/VERTSIZE. Các giải pháp khác là sử dụng một máy in DC để làm cho mọi thứ của bạn. Đặt giá trị LOGFONT.lfWidth rõ ràng có thể hữu ích. Cũng cập nhật trình điều khiển video có thể giúp đỡ.

Tôi gặp phải vấn đề tương tự, tôi đã tạm thời vẽ một canvas siêu mịn sử dụng GetDC(0) làm tham chiếu thay vì máy in DC. Dưới đây là một số liên kết có cùng một vấn đề:

+0

cảm ơn bạn - bạn đã dạy tôi điều gì đó mới mẻ! –

Các vấn đề liên quan