TPopupMenu — określenie systemowych marginesów wokół okienka popupu

TPopupMenu — określenie systemowych marginesów wokół okienka popupu
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12316
0

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.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12316
1

Dobra, na razie odpuszczam temat tych ramek — zdaje się, że nie da się tego sensownie określić, więc stały rozmiar marginesów musi mi wystarczyć. Natomiast pokazywanie testowego popupu nie wchodzi w grę, tak samo jak pomijanie użycia własnych handlerów do mierzenia itemów menu.

No jak nic muszę w końcu napisać własną bibliotekę kontrolek i samodzielnie opakować Win32 API — raz na zawsze skończą się problemy z brakiem danych czy możliwością własnoręcznego renderowania elementów okna czy kontrolek. Tymczasem swoje kontrolki skończyłem i opisałem je w tym wpisie na blogu, w razie gdyby ktoś chciał zerknąć.

pstmax
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Reda
  • Postów: 69
0

Czy warto. Jeszcze tworzyć rozwiązania 32 bit?

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12316
0

Win32 to nazwa API Windowsa wprowadzonego w 32-bitowych systemach Windows. Ówcześnie używa się tej nazwy w określeniu klasycznego API Windowsa, bez względu na bitowość platformy.

John Gordon
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 77

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.