2013-02-25 34 views
8

Tôi đã viết một ứng dụng nhỏ vẽ văn bản trên hình ảnh trong bộ nhớ và ghi chúng vào tệp. Mã Delphi cơ bản trông giống như:Làm cách nào để ghi đè cài đặt ClearType khi vẽ văn bản bằng API Win32?

var 
    Canvas : tCanvas; 
    Text : WideString; 
    TextRect : tRect; 
begin 
    Canvas := Bitmap.Canvas; 
    Canvas.Brush.Color := clBlack; 
    Canvas.Pen.Color := clBlack; 
    Canvas.Font.Name := 'Courier New'; 
    Canvas.Font.Size := 11; 
    Canvas.Font.Color := clWhite; 

    TextRect := ...; // calculate text position 
    DrawTextW(Canvas.Handle, PWideChar(Text), Length(Text), TextRect, DT_NOCLIP or DT_NOPREFIX or DT_SINGLELINE or DT_CENTER or DT_VCENTER); 
end; 

Thật không may văn bản được vẽ khác nhau tùy thuộc vào cài đặt ClearType của máy tính đang chạy ứng dụng. Tôi muốn có một đầu ra nhất quán trong ứng dụng của tôi bất kể thiết lập ClearType cục bộ (đầu ra không được hiển thị trực tiếp trên màn hình). Có một số tùy chọn Win32 API để ghi đè lên các thiết lập ClearType cục bộ?

Trả lời

12

Làm mịn phông chữ của văn bản được xác định bởi phông chữ bạn chọn vào thiết bị. Để tìm hiểu về các tùy chọn được cung cấp bởi giao diện Win32 thô, hãy đọc tài liệu LOGFONT.

Trong Delphi API phông chữ API Win32 cơ bản được bao bọc bởi lớp TFont. Thuộc tính phù hợp với câu hỏi này là Quality. Giá trị mặc định là fqDefault sử dụng cài đặt làm mịn phông chữ toàn hệ thống. Bạn muốn đặt Quality thành fqAntialiased hoặc fqNonAntialiased.

Phiên bản cũ của Delphi không có thuộc tính này. Trong trường hợp đó, bạn sẽ cần phải gọi số CreateFontIndirect để tạo một HFONT với các cài đặt chất lượng được yêu cầu. Bạn có thể gọi this function ngay lập tức trước khi bạn bắt đầu văn bản vẽ:

procedure SetFontQuality(Font: TFont; Quality: Byte); 
var 
    LogFont: TLogFont; 
begin 
    if GetObject(Font.Handle, SizeOf(TLogFont), @LogFont) = 0 then 
    RaiseLastOSError; 
    LogFont.lfQuality := Quality; 
    Font.Handle := CreateFontIndirect(LogFont); 
end; 

đèo hoặc NONANTIALIASED_QUALITY hoặc ANTIALIASED_QUALITY tùy thuộc vào nhu cầu của bạn.

6

Tôi tin rằng bạn có thể tạo phông chữ lôgic mới không sử dụng bất kỳ ClearType nào. Hãy chắc chắn để vượt qua NONANTIALIASED_QUALITY cờ như fdwQuality tham số của CreateFont:

Font không bao giờ chống răng cưa, có nghĩa là, font chữ mịn không được thực hiện.

+4

Bạn cũng có thể sử dụng chất lượng chống răng cưa, chất lượng hiển thị với tính năng chống răng cưa kiểu cũ - nghĩa là không có Cleartype. Điều đó mang lại cho bạn văn bản có chất lượng tốt sẽ trông đẹp hơn so với văn bản được vẽ mà không làm phông chữ nào mượt mà. –

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