cuốn sách gpt4 ai đã làm

c++ - CreateFont() tạo ra kích thước và đặc tả phông chữ không chính xác

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 07:02:16 25 4
mua khóa gpt4 Nike

Tôi đã thử sử dụng WinAPI để hiển thị phông chữ dưới dạng bitmap nhưng không thể đạt được kích thước phông chữ mong muốn.

Đây là cách phông chữ được khởi tạo:

HDC dc = ::CreateCompatibleDC(NULL);
::SetMapMode(dc, MM_TEXT);
::SetTextAlign(dc, TA_LEFT | TA_TOP | TA_UPDATECP);
int size_in_pixels = 18;
Phông chữ HFONT = ::CreateFontA(-size_in_pixels, ..., "Arial");
::SelectObject(dc, phông chữ);
::TEXTMETRICW tm = { 0 };
GetTextMetricsW(dc, &tm);

nhưng lúc đó tôi đã Nhận GlyphOutlineWGetTextMetricsW Tôi nhận được một giá trị không chính xác, đó không phải là kích thước tôi đang chuyển dưới dạng tham số. Tôi biết nó mong đợi giá trị ở đơn vị logic, nhưng trong MM_TEXT 1 đơn vị phải là 1 pixel, phải không?

tôi hy vọng TạoFontA Chấp nhận kích thước điểm khi tôi chuyển giá trị âm (như ở đây /image/tEt8J.png ), nhưng điều này thực sự sai. Tôi đã thử ép buộc các giá trị và tìm ra các tham số phù hợp cho một số kích cỡ:

18px = -19; 36px = -39; 73px = -78;

Tôi cũng đã thử công thức do Microsoft cung cấp:

nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

Nhưng nó cũng cho tôi kết quả sai với văn bản được hiển thị (sử dụng Nhận GlyphOutlineW) nó sẽ lớn hơn nếu được đo (ví dụ: chiều cao của "j" phải có kích thước chính xác mà tôi đã vượt qua) từ GetTextMetricsW Các chỉ số cũng sai, ví dụ tmAcent. Tôi biết rằng trên Windows nó bao gồm cả phần dẫn đầu nội bộ, nhưng thậm chí từ tmAcent trừ đi tmInternalLãnh đạo Nó vẫn không chính xác. Nhân tiện,GetCharABCWidthsW Các giá trị trong là chính xác, vì vậy a+b+c là chiều rộng glyph tính bằng pixel (trong khi tài liệu nói rằng nó phải ở đơn vị logic).

Tôi cũng nên nói điều gì đó về DPI, thông thường tôi sử dụng 125% trong cài đặt trên Windows 10, nhưng tôi thậm chí còn thử sử dụng 100%, thật thú vị ::GetDeviceCaps(dc, LOGPIXELSY) Tôi không thay đổi thang đo mà tôi đã sử dụng, nó luôn là 96

Đây là bản đồ cuối cùng và các chỉ số CreateFontA(-128, ...) Ví dụ: tập bản đồ kết xuất

Câu hỏi số 1: Tôi nên làm gì để vượt qua kích thước điểm được yêu cầu (tính bằng pixel) và nhận được glyph có kích thước phù hợp với kích thước chính xác (tính bằng pixel)?

Câu hỏi số 2: Đơn vị lạ nào được sử dụng bởi tất cả các hàm này?

câu trả lời hay nhất

当您使用 ::SetMapMode(dc, MM_TEXT); , kích thước phông chữ được chỉ định bằng pixel của thiết bị. Các giá trị âm không bao gồm phần đầu bên trong, do đó, với cùng một giá trị tuyệt đối, các giá trị âm sẽ tạo ra phông chữ lớn hơn về mặt trực quan. Nếu bạn muốn bắt đầu từ GetTextExtentPoint32 Để có cùng chiều cao cho các phông chữ khác nhau, hãy sử dụng các giá trị dương.

ở độ cao của bạn -128 Trong ví dụ này, phông chữ bạn yêu cầu có chiều cao 128 pixel sau khi loại trừ phần đầu bên trong. Lựa chọn trình ánh xạ phông chữ 143, điều này tốt cho 15 Dẫn đầu bên trong chính xác theo pixel (128+15=143). tmAcent + tmDescent Nó cũng đúng (115+28=143). Bạn nhận được những gì bạn chỉ định.

Bạn nên cân nhắc rằng các giá trị trong số liệu văn bản không áp đặt giới hạn cố định. Các nhà thiết kế có thể thiết kế các kiểu chữ sao cho các nét vẽ của họ đôi khi vượt ra ngoài hoặc không vượt quá dòng chính.

ví dụ: chiều cao của 'j' phải có kích thước chính xác mà tôi đã vượt qua

j Các điểm ở dòng trên cùng có thể ở trên hoặc dưới dòng trên cùng nếu người thiết kế thấy thiết kế theo cách này hợp lý về mặt trực quan.

thú vị đó ::GetDeviceCaps(dc, LOGPIXELSY) không thay đổi theo tỷ lệ tôi sử dụng, nó luôn là 96

Hệ thống PPI không thay đổi trừ khi bạn đăng xuất và đăng nhập lại. Đối với các ứng dụng nhận biết dpi trên mỗi màn hình, bạn phải bắt đầu với WM_DPICHANGED Lấy chỉ số dpi từ các tham số màn hình đã cho hoặc giá trị được lưu trong bộ nhớ đệm.

Câu hỏi số 1: Tôi nên làm gì để chuyển kích thước điểm mong muốn tính bằng pixel và nhận glyph ở kích thước phù hợp với số liệu chính xác tính bằng pixel?

Tôi nghĩ bạn muốn có một khoảng cách cụ thể giữa dòng trên và dòng dưới, đó chính xác là cách bạn tạo phông chữ Phông chữ HFONT =::CreateFontA(-size_in_pixels, ..., "Arial"); .Vấn đề là bạn đang giả định rằng các đường nét thiết kế kiểu là ranh giới cố định của mỗi hình tượng, nhưng người thiết kế kiểu chữ không cần phải căn chỉnh các hình tượng một cách chặt chẽ với những đường nét này. Nếu bạn muốn các glyph được căn chỉnh chặt chẽ, có lẽ không có cách nào để có được nó. Có thể kiểm tra các phông chữ khác nhau.

Câu hỏi số 2: Đơn vị lạ mà tất cả các hàm này đang sử dụng là gì?

Khi chế độ được đặt thành WM_TEXT , sử dụng pixel thiết bị thô. Chiều cao xác định chiều cao dương bao gồm tmInternalLãnh đạo, chiều cao âm không bao gồm nó.

Đối với các giá trị dương:
tmAscent + tmDescent = requestHeight
Đối với các giá trị âm:
tmAscent + tmDescent - tmInternalLeading = requestHeight

Bên dưới, tôi đã dán ảnh chụp màn hình của các phông chữ khác nhau, cho thấy rằng tùy thuộc vào phông chữ được chọn, các glyph có thể được thiết kế để không chạm dòng trên cùng hoặc vượt quá dòng trên cùng và trong hầu hết các trường hợp cũng không chạm dòng dưới cùng.

Có vẻ như Arial Unicode MS phù hợp hơn với yêu cầu của bạn (nhưng j vẫn không đạt được vị trí bạn muốn).

Thời nhà Tống:
nhập mô tả hình ảnh ở đây

Arial Unicode MS
nhập mô tả hình ảnh ở đây

đầu vào đơn âm
nhập mô tả hình ảnh ở đây

MS đánh bóng
nhập mô tả hình ảnh ở đây

Về c++ - CreateFont() tạo ra các thông số và kích thước phông chữ không chính xác, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/57465704/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress