eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingParadoksy [Win]API MicrosoftuParadoksy [Win]API Microsoftu
  • Data: 2011-08-27 18:27:09
    Temat: Paradoksy [Win]API Microsoftu
    Od: "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    Hej!

    Nadziałem się dziś na dziwne ograniczenie w .NET Windows Forms, a ściślej
    - w pionowym pasku przewijania. Otóż VScrollBar ma własność Maximum, która
    wraz z Minimum pozwala na ograniczenie zakresu wartości osiąganych przez
    pasek przewijania. I wszystko byłoby w porządku gdyby nie dwa fakty:
    a) Użytkownik nie jest w stanie osiągnąć wartości Maximum, tylko Maximum +
    1 - LargeChange, gdzie LargeChange to własność określająca, o ile
    przesunie się suwak po kliknięciu obszaru przewijania (lub wciśnięciu
    PageUp lub PageDown).
    b) Wartości od (Maximum + 1 - LargeChange) do Maximum są wizualizowane
    przez suwak ustawiony na maksymalnej pozycji - czyli użytkownik nie
    zobaczy różnicy pomiędzy żadnym z tych ustawień.

    Przyczyna takiego stanu rzeczy? Nieznana.

    Kiedyś potrzebowałem narysować przy pomocy GDI/GDI+ prostokąt z
    zaokrąglonymi narożnikami, wypełniony gradientem. W tym celu użyłem metody
    CreateRoundRectRgn, tworzącej region o wspomnianym kształcie.
    Każdy, kto bawił się trochę w WinAPI wie doskonale, że jeśli gdziekolwiek
    podaje się wymiary prostokąta opisującego cokolwiek, trzeba zawsze
    zwiększyć jego wymiary o jednostkę w poziomie i pionie, ponieważ WinAPI
    utnie ostatnią prawą kolumnę i ostatni dolny wiersz. W ten sposób ze
    współrzędnych (0, 0, 10, 10) zostanie utworzony prostokąt, którego prawy
    dolny narożnik ma współrzędne (9, 9).
    Microsoft jest bardzo konsekwentny w takiej a nie innej interpretacji
    prostokąta i w sumie ma to trochę sensu - można na przykład definiować
    prostokąt w nieco prostszy sposób: (x, y, x + width, y + height) zamiast
    (x, y, x + width - 1, y + height - 1). Ponadto istnieje możliwość
    utworzenia pustego regionu poprzez podanie równych współrzędnych (np. 0,
    0, 0, 0).

    Jednak okazuje się, że w przypadku (chyba jedynym) CreateRoundRectRgn
    Microsoft się wyłamał i zamiast zjadać jedną kolumnę i jeden wiersz, zjada
    dwa. Więc aby wygenerować region o współrzędnych (0, 0, 9, 9), należy
    funkcji podać współrzędne (0, 0, 11, 11).

    Przyczyna takiego stanu rzeczy? Nieznana.

    Czy nadzialiście się kiedyś na takie dziwne, niewytłumaczalne ograniczenia
    w różnych API? Czasami można stracić kilka dni na poszukiwaniu błędu,
    którego w kodzie nie ma...

    Pozdrawiam -- Spook.

    --
    ! ._______. Warning: Lucida Console sig! //) !
    ! || spk || www.spook.freshsite.pl / _ """*!
    ! ||_____|| spook at op.pl / ' | ""!
    ! | ___ | tlen: spoko_ws gg:1290136 /. __/"\ '!
    ! |_|[]_|_| May the SOURCE be with you! \/) \ !

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: