Tôi đã tìm thấy bản sửa lỗi. Delphi dường như có một vài lỗi về vấn đề này:
- Giá trị của tài sản ItemHeight bố buộc phải là 16, bởi vì lớp TComboBoxEx đè chức năng GetItemHt là một mã hóa cứng 16. Không liên quan gì cho kích thước thực của mục - lạ, vì nó hoạt động hoàn hảo trên TComboBox. Tôi không biết tại sao họ quyết định đi với chiến lược này. Có lẽ để đảm bảo hình ảnh sẽ luôn phù hợp.
- Delphi không thực sự gọi thông báo CB_SETITEMHEIGHT, vì vậy ngay cả khi bạn ghi đè lên chức năng này, không có gì thay đổi.
Cập nhật:
Như đã chỉ ra bởi mghie, ý tưởng ban đầu của tôi về cách sử dụng một giá trị mã hóa cứng 15 kêu gọi thông điệp không hoạt động tốt ở thiết lập DPI khác nhau. Vì vậy, bây giờ tôi đang sử dụng một calll để GetTextMetrics để xác định chiều cao. Thêm vào chiều cao của phông chữ là giá trị của GetSystemMetrics (SM_CYBORDER).
Điều này được dựa trên cách VCL xác định kích thước của TEdit.Tôi không nghĩ rằng nó là khá đúng, nhưng kể từ khi mục tiêu là để có ComboBoxEx cùng kích thước như TEdit nó có lẽ là gần như chúng tôi sẽ nhận được. Và nó hoạt động ở các thiết lập DPI 96, 120, 144 và 192.
Chiều cao của ComboBoxEx được xác định theo chiều cao của mục -1. Vì vậy, các mục 0 đến count-1 là các mục danh sách thực tế, nhưng mục -1 là chiều cao được sử dụng cho trình soạn thảo. Nếu bạn đặt chiều cao đó thành 15, chiều cao của điều khiển được sửa thành 21 pixel (xem phần cập nhật ở trên để biết các vấn đề về tỷ lệ). Tôi nghĩ rằng Mason có thể đúng rằng kích thước phông chữ đóng một phần ở đây (có thể thay đổi kích thước mục), nhưng bạn có thể làm cho nó hoạt động tốt bằng cách điều chỉnh kích thước mục.
Có vẻ như sẽ giới thiệu một vấn đề mới (ở chế độ xem của tôi, nhỏ hơn) ở mức 96 DPI ảnh 16 pixel cao dòng dưới cùng nhất khi được hiển thị trong phần trình chỉnh sửa, nhưng điều này khó nhận thấy.
Vì vậy, việc sửa chữa sau đó, là để gọi mã này:
GetTextMetrics(Canvas.Handle, TM);
SendMessage(Handle, CB_SETITEMHEIGHT, -1,
GetSystemMetrics(SM_CYBORDER) * 2 + TM.tmHeight);
Nguồn
2009-08-21 14:33:07
Wow - sửa chữa gọn gàng! Tôi đề nghị bạn thêm nó như là "câu trả lời được chấp nhận" cho câu hỏi của riêng bạn. Cũng có giá trị một upvote! – Roddy
Đã thêm câu trả lời, nhưng tôi chỉ có thể chấp nhận câu trả lời trong một hoặc hai ngày. Ngoài ra còn có một báo trước liên quan đến việc hiển thị hình ảnh - xem câu trả lời của tôi bên dưới. –