Znalazłem poprawkę. Delphi wydaje się mieć kilka błędów związanych z tym:
- Wartość opublikowanego własności ItemHeight jest zmuszony do 16, ponieważ klasa TComboBoxEx zastępuje funkcję GetItemHt być zakodowane 16. bez uwzględnienia jakiejkolwiek dla rzeczywistego rozmiaru przedmiotu - dziwne, ponieważ działa to doskonale na TComboBox. Nie wiem, dlaczego zdecydowali się zastosować tę strategię. Prawdopodobnie, aby obrazy zawsze pasowały.
- Delphi faktycznie nie wywołuje wiadomości CB_SETITEMHEIGHT, więc nawet jeśli zastąpisz tę funkcję, nic się nie zmieni.
Aktualizacja:
Jak podkreślił mghie, mój początkowy pomysł wykorzystania zakodowane wartość 15 w wywołaniu wiadomość nie działa dobrze w różnych ustawieniach DPI. Tak więc używam calll do GetTextMetrics, aby określić wysokość. Dodana do wysokości czcionki jest wartość GetSystemMetrics (SM_CYBORDER).
Jest to oparte na sposobie, w jaki VCL określa rozmiar TEdit.Nie sądzę, że to jest w porządku, ale ponieważ celem jest, aby ComboBoxEx miał taką samą wielkość jak TEdit, prawdopodobnie jest tak blisko, jak to tylko możliwe. I działa w ustawieniach DPI 96, 120, 144 i 192.
Wysokość ComboBoxEx jest określona przez wysokość pozycji -1. Tak więc pozycje od 0 do liczby-1 są rzeczywistymi pozycjami na liście, ale pozycja -1 jest wysokością używaną dla edytora. Jeśli ustawisz tę wysokość na 15, wysokość kontrolki zostanie skorygowana do 21 pikseli (zobacz powyższą aktualizację w celu skalowania). Myślę, że Mason może mieć rację, że rozmiar czcionki odgrywa tutaj pewną rolę (prawdopodobnie zmienia rozmiar elementu), ale może to sprawić, że będzie dobrze działać, dostosowując rozmiar elementu.
Wygląda na to, że wprowadziłem nowy (moim zdaniem, mniejszy) problem polegający na tym, że na obrazach 96-megapikselowych o rozdzielczości 16-cio pikselowej tracę najbardziej dolną linię, gdy jest ona wyświetlana w części edytora, ale jest to ledwo zauważalne.
Więc poprawka jest więc nazwać ten kod:
GetTextMetrics(Canvas.Handle, TM);
SendMessage(Handle, CB_SETITEMHEIGHT, -1,
GetSystemMetrics(SM_CYBORDER) * 2 + TM.tmHeight);
Wow - schludny Fix! Sugeruję, aby dodać go jako "zaakceptowaną odpowiedź" na własne pytanie. Warto przegrać! – Roddy
Dodano odpowiedź, ale mogę ją zaakceptować tylko za dzień lub dwa. Istnieje również zastrzeżenie, które wiąże się z wyświetlaniem obrazu - zobacz moją odpowiedź poniżej. –