2009-08-21 19 views
5

Trong Delphi, tất cả các điều khiển TEdit và TComboBox đều cao 21 pixel theo mặc định. Trong trường hợp của TComboBox, kích thước này là tuyệt đối và cố gắng để kéo dài nó đến một cái gì đó lớn hơn không hoạt động. Trong trường hợp của TComboBoxEx, mặc dù chiều cao mặc định là 22 pixel, làm cho nó nổi bật một chút trên bất kỳ hình thức mà bạn sử dụng nó. Bây giờ theo Microsoft docs, ComboBoxEx về bản chất là một ComboBox với chức năng chủ sở hữu rút ra được xử lý để cho phép hình ảnh và thụt đầu dòng.Tôi có thể nhận được TComboBoxEx có cùng chiều cao như TComboBox không?

Vì vậy, có thể làm cho TComboBoxEx của tôi kiểm soát cao 21 pixel không? Điều này phụ thuộc vào điều gì?

Cập nhật: Tôi đã thêm Quality Central report về vấn đề này, như đề xuất của Roddy. Ngoài ra, tôi tìm thấy một sửa chữa. Rõ ràng, kích thước phụ thuộc vào kích thước của mục -1 trong combobox. Vì vậy, bạn đặt kích thước đó thành 15 (hoặc một pixel nhỏ hơn kích thước mặc định) và hộp co lại thành 21 pixel quen thuộc hơn.

+0

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

+0

Đã 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. –

Trả lời

6

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:

  1. 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.
  2. 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); 
+0

Một TEdit trên máy tính xách tay của tôi với cài đặt DPI là 124 chắc chắn không cao 21 pixel. Chiều cao mã hóa cứng chỉ sai, cho dù chúng có hoạt động cho bạn hay không, và trả lại 15 không thực sự tốt hơn là trả về 16. Còn về phông chữ hoặc cài đặt DPI khác nhau thì sao? Một sửa chữa thực sự sẽ liên quan đến việc nhận được chiều cao của phông chữ và tính toán chiều cao mục dựa trên đó. – mghie

+0

-1 cho các hằng số được mã hóa cứng như mghie được giải thích –

+0

Điểm lấy về cài đặt DPI. Vì vậy, bây giờ tôi cần phải biết làm thế nào chiều cao của một hộp chỉnh sửa được tính toán. Tôi đã xem xét tính chiều cao của mặt hàng dựa trên chiều cao phông chữ, nhưng tôi không thấy cách đặt chúng ở vị trí đầu tiên - tôi thực sự nghĩ rằng nó đã được chọn để phù hợp với 16x16 glyph. Những gì dường như làm việc trên cả 96 DPI và 120, được gọi là GetTextMetric và sử dụng tmHeight + 2. Tôi nghĩ rằng bằng cách sử dụng tmHeight + tmInternalLeading sẽ là chính xác, nhưng mà chỉ hoạt động ở 120 DPI. Tôi có thể bắt đầu từ 15 và quy mô từ 96 đến 120, nhưng điều đó dường như không đúng. Bất kỳ ý tưởng nào? –

1

Chiều cao của một TComboBox không phải là tuyệt đối; nó được gắn với chiều cao của phông chữ bạn sử dụng. TComboBoxEx hoạt động theo cùng một cách, nhưng dường như có thêm một pixel "overhead", như bạn đã lưu ý, và dường như không có cách nào đơn giản để thay đổi điều đó. Nếu đây là trình bao bọc cho điều khiển Windows tích hợp, có thể không có cách nào thay đổi nó ở cấp Delphi, thời gian.

+0

Trừ khi bạn muốn tạo phiên bản của riêng bạn, nhưng tôi không nghĩ đó là một tùy chọn hợp lệ ;-). –

1

Hai cách để thay đổi chiều cao của TComboBoxEx, tiếc là không phải là những gì bạn muốn.

  • Đặt thuộc tính font.size nhỏ hơn - hộp sẽ thu nhỏ. (tuy nhiên, văn bản của bạn nhỏ hơn)

  • Đặt StyleEx.csExNoSizeLimit: = false, sau đó đặt Chiều cao: = 21 như mong muốn. Thật không may, điều này chỉ làm cho hộp của bạn được cắt bớt, vì vậy bezel dưới biến mất.

Tôi có thể thay thế tất cả các TComboBox bằng TComboBoxEx - GExperts có trình hướng dẫn thay thế thành phần 'tuyệt vời' để thực hiện việc này.

Điều này trông giống như lỗi Delphi. Bạn đã báo cáo qua QC chưa?

+0

Đã thêm báo cáo QC. Đã thêm liên kết vào câu hỏi. –

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