TPopupMenu posiada zdarzenie OnMeasureItem, które pozwala nam samodzielnie określić szerokość oraz wysokość każdego z itemów (z tekstem i bitmapami, separatorów itd.). Korzystam z tego sposobu do obliczania rozmiarów całego popupu, aby następnie móc go wypozycjonować na docelowym ekranie, a na koniec pokazać go za pomocą standardowej metody TPopupMenu.PopUp(X,Y).
Działa to świetnie, jednak jednej rzeczy brakuje — rozmiaru marginesów wokół okienka popupu, które są narzucane przez system operacyjny. U mnie, na Windows 11 i widgetsecie Win32, system dokłada 20px w poziomie i o 6px w pionie do finalnego rozmiaru całego popupu.
Żeby moja kontrolka była w stanie wyświetlić popup co do piksela w obliczonym miejscu (po odpowiedniej stronie kontrolki), muszę znać dokładny rozmiar całego okna (itemów i systemowych marginesów). Tyle że ani nie dostarcza tego widgetset, ani nawet sam system operacyjny — funkcja GetSystemMetrics zdaje się nie znać takich danych.
Jak określić rozmiar tych marginesów (bez względu na widgetset), bez pokazywania popupu na ekranie?
Jeśli ktoś zna poprawny sposób na realizację powyższego, będę wdzięczny za podpowiedzi. Na razie rozmiar marginesów mam określony z góry i trzymany jest w dodatkowych zmiennych, ale wolałbym rozwiązanie dynamiczne, nie wymagające hardkodowania.