- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
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 GlyphOutlineW
Và GetTextMetricsW
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).
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/
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. Sau đây là phương pháp khởi tạo phông chữ: HDC dc = ::CreateCompatibleDC(NULL);
Tôi đang xem ví dụ này về API CreateFont https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createfon
Khi tôi cố gắng đặt phông chữ của JLabel bằng phông chữ được trả về từ Font.createFont, JLabel không hiển thị gì: Font tempFont = Font.createFont(Font.TRU
Vì vậy, tôi đã thử sử dụng CreateFont để thử và tạo một phông chữ tương tự như những gì tôi sử dụng trong Photoshop, nhưng nếu bạn nhìn kỹ, chất lượng trong Photoshop tốt hơn nhiều. Đây là mã tôi sử dụng để tạo phông chữ: CreateFon
Tôi cần tải phông chữ từ một tệp và tôi nhận thấy rằng Font.createFont() mất khoảng 5 giây để hoàn tất việc tạo từng phông chữ. Đây là đoạn trích có liên quan từ lớp quản lý tài nguyên của tôi: try(InputStream in
Đoạn mã bên dưới thực hiện công việc của nó nhưng để lại một bản sao của tệp phông chữ trong thư mục tạm thời mỗi khi nó chạy. Các tệp được đặt tên là +~JF7154903081130224445.tmp, trong đó số lượng mỗi tệp được tạo dường như là ngẫu nhiên. đầu vàoStr
Trên Windows, lệnh gọi tới CreateFontIndirect() có thể âm thầm thay thế phông chữ tương thích nếu phông chữ được yêu cầu không được yêu cầu. Lệnh gọi GetObject() không phản ánh sự thay thế này; nó trả về cùng một LOG được truyền vào;
Tôi có một lớp cơ sở và tôi đặt một hàm trừu tượng trong đó. Bây giờ tôi đã kế thừa nó và khai báo hàm trong lớp dẫn xuất của mình. Nhưng Visual Studio vẫn không biên dịch mã của tôi và khẳng định rằng lớp dẫn xuất là lớp trừu tượng. Tôi thậm chí còn sao chép và dán phần khai báo từ lớp cơ sở và xóa
Đối với tôi có rất nhiều điều bí ẩn về những gì đang diễn ra với phông chữ và phông chữ cơ bản. Đặc biệt là khi nói đến các nhà xây dựng. Trang web iText có dòng này làm mã mẫu cho phông chữ mới BaseFont unicode = BaseFont.cre
Tôi đã tải xuống phông chữ Helvetica từ fontpalace.com (chỉ cần tìm kiếm Helvetica) và đưa nó vào ứng dụng Java của mình bằng Font.createFont(). Nhưng số liệu phông chữ không hoạt động cho việc này
Tôi muốn tạo một đối tượng phông chữ mới bằng tệp TTF. Tạo một đối tượng Font thực ra rất đơn giản nhưng mình không biết cách thiết lập màu sắc, kích thước vì không tìm ra phương pháp cho nó? Dòng đầu vào là = FileInputSt mới
Tôi có một số tệp phông chữ tiếng Trung tùy chỉnh: aaa.ttf bbb.ttf ccc.ttf Tôi muốn sử dụng chúng để tạo tệp pdf của mình qua iText. Đây là mã tôi sử dụng để tạo BaseFont: String encodi
Tôi đang cố gắng sử dụng phông chữ Tahoma (MS Shell Dlg 2) với chiều cao -15 và/hoặc chiều cao -12 trong điều khiển Listview. Tuy nhiên, đối với cả hai kích thước, văn bản của tôi trông có vẻ bị ép lại với nhau theo chiều ngang, tức là chữ l
Tôi có một số mã cuối cùng gọi Font.createFont. Nó hoạt động tốt trên máy chủ (centos và các thứ...) nhưng trên máy Ubuntu của tôi thì nó chết vì lệnh gọi này trong Font.createFont
Tôi là một lập trình viên xuất sắc, rất giỏi!