eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingParadoksy [Win]API Microsoftu
Ilość wypowiedzi w tym wątku: 9

  • 1. Data: 2011-08-27 18:27:09
    Temat: Paradoksy [Win]API Microsoftu
    Od: "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>

    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! \/) \ !


  • 2. Data: 2011-08-28 06:06:32
    Temat: Re: Paradoksy [Win]API Microsoftu
    Od: m...@t...pl

    > Hej!

    > b) Wartości od (Maximum + 1 - LargeChange) do Maximum są wizualizowane  
    > Przyczyna takiego stanu rzeczy? Nieznana.
    Naprawdę jest nieznana? Nie chodzi przypadkiem o to, że jeśli mamy N stron
    to sens przewijania jest tylko o N-1 stron?
    Pozdrawiam


    --
    Wysłano z serwisu OnetNiusy: http://niusy.onet.pl


  • 3. Data: 2011-08-28 11:34:02
    Temat: Re: Paradoksy [Win]API Microsoftu
    Od: Marek <m...@w...pl>

    W dniu 2011-08-27 20:27, Wojciech "Spook" Sura pisze:

    > 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).

    Czy prostokąt podaje się w postaci (x,y,width,height)?

    jeżeli tak to prostokąt o parametrach (0,0,1,1) - powinien być pikselem
    w punkcie 0,0 czy też być prostokątem o 4 rogach (0,0),(1,0),(1,1),(0,1)?
    i mieć szerokość 2 pikseli?


  • 4. Data: 2011-08-28 18:01:01
    Temat: Re: Paradoksy [Win]API Microsoftu
    Od: "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>

    Dnia 28-08-2011 o 13:34:02 Marek <m...@w...pl> napisał(a):

    > W dniu 2011-08-27 20:27, Wojciech "Spook" Sura pisze:
    >
    >> 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).
    >
    > Czy prostokąt podaje się w postaci (x,y,width,height)?
    >
    > jeżeli tak to prostokąt o parametrach (0,0,1,1) - powinien być pikselem
    > w punkcie 0,0 czy też być prostokątem o 4 rogach (0,0),(1,0),(1,1),(0,1)?
    > i mieć szerokość 2 pikseli?

    W WinAPI to jest left, top, right, bottom. Jeśli jakąkolwiek metodę
    rysującą prostokąt nakarmimy współrzędnymi (0, 0, 1, 1), zostanie
    narysowany pojedynczy piksel.

    Dla odmiany, w .NET Rectangle jest konstruowany przez (x, y, width,
    height).

    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! \/) \ !


  • 5. Data: 2011-08-28 18:04:24
    Temat: Re: Paradoksy [Win]API Microsoftu
    Od: "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>

    Dnia 28-08-2011 o 08:06:32 <m...@t...pl> napisał(a):

    >> Hej!
    >
    >> b) Wartości od (Maximum + 1 - LargeChange) do Maximum są wizualizowane
    >> Przyczyna takiego stanu rzeczy? Nieznana.
    > Naprawdę jest nieznana? Nie chodzi przypadkiem o to, że jeśli mamy N
    > stron to sens przewijania jest tylko o N-1 stron?

    Rozumiem, że przez stronę rozumiemy pojedyncze "LargeChange"? Wtedy ma to
    trochę sensu. Tyle że moim zdaniem to jest uszczęśliwianie programisty na
    siłę - ponadto kłóci się to z zasadą "samowyjaśniającego" nazewnictwa
    własności. Maximum to maksimum, a nie "MaximumMinusOnePage"...

    > Pozdrawiam

    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! \/) \ !


  • 6. Data: 2011-08-28 18:26:23
    Temat: Re: Paradoksy [Win]API Microsoftu
    Od: "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>

    Dnia 27-08-2011 o 20:27:09 Wojciech "Spook" Sura <spook"mad@hatter"op.pl>
    napisał(a):
    (...)

    Jeszcze jeden kwiatek.

    Graphics.FillRectangle(Pens.Red, new Rectangle(0, 0, 10, 10))

    narysuje wypełniony prostokąt 10x10.

    Graphics.DrawRectangle(Pens.Blue, new Rectangle(0, 0, 10, 10))

    narysuje ramkę o wymiarach 11x11.

    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! \/) \ !


  • 7. Data: 2011-08-29 06:11:11
    Temat: Re: Paradoksy [Win]API Microsoftu
    Od: Paweł Kierski <n...@p...net>

    W dniu 2011-08-28 20:04, Wojciech "Spook" Sura pisze:
    > Dnia 28-08-2011 o 08:06:32 <m...@t...pl> napisał(a):
    >
    >>> Hej!
    >>
    >>> b) Wartości od (Maximum + 1 - LargeChange) do Maximum są
    >>> wizualizowane Przyczyna takiego stanu rzeczy? Nieznana.
    >> Naprawdę jest nieznana? Nie chodzi przypadkiem o to, że jeśli mamy N
    >> stron to sens przewijania jest tylko o N-1 stron?
    >
    > Rozumiem, że przez stronę rozumiemy pojedyncze "LargeChange"? Wtedy ma
    > to trochę sensu. Tyle że moim zdaniem to jest uszczęśliwianie
    > programisty na siłę - ponadto kłóci się to z zasadą "samowyjaśniającego"
    > nazewnictwa własności. Maximum to maksimum, a nie "MaximumMinusOnePage"...

    Tym bardziej, że czasem używa się przewijania, "do końca" - vide edytor
    VS, gdzie "koniec" oznacza widzialność ostatniej linijki w pierwszej
    linii okna.

    --
    Paweł Kierski
    n...@p...net


  • 8. Data: 2011-08-29 06:26:29
    Temat: Re: Paradoksy [Win]API Microsoftu
    Od: m...@t...pl

    > W dniu 2011-08-28 20:04, Wojciech "Spook" Sura pisze:

    > Tym bardziej, że czasem używa się przewijania, "do końca" - vide edytor
    > VS, gdzie "koniec" oznacza widzialność ostatniej linijki w pierwszej
    > linii okna.
    Nie pamiętam, a używałem wiele razy. Zawsze gdy potrzebowałem to czytałem
    dokumentację i po dwóch tygodniach nie pamiętałem. Nigdy nie miałem z tym
    żadnych "paradoksów", działało bardzo dobrze. Microsoftowi można to i owo
    zarzucić, ale WinApi nigdy mnie nie zawiodło.
    Pozdrawiam


    --
    Wysłano z serwisu OnetNiusy: http://niusy.onet.pl


  • 9. Data: 2011-08-31 08:28:57
    Temat: Re: Paradoksy [Win]API Microsoftu
    Od: Marek <m...@w...pl>

    W dniu 2011-08-28 20:26, Wojciech "Spook" Sura pisze:
    > Dnia 27-08-2011 o 20:27:09 Wojciech "Spook" Sura
    > <spook"mad@hatter"op.pl> napisał(a):
    > (...)
    >
    > Jeszcze jeden kwiatek.
    >
    > Graphics.FillRectangle(Pens.Red, new Rectangle(0, 0, 10, 10))
    >
    > narysuje wypełniony prostokąt 10x10.
    >
    > Graphics.DrawRectangle(Pens.Blue, new Rectangle(0, 0, 10, 10))
    >
    > narysuje ramkę o wymiarach 11x11.
    >
    > Pozdrawiam -- Spook.
    >
    Ogólnie w przypadku GdiPlus należy używać wyłącznie liczb
    zmiennoprzecinkowych - w tej bibliotece jest mnóstwo zagadek, typu
    trzeba dodawać 0.5 lub odejmować 0.5 od współrzędnych - w sieci jest
    nawet dokument z opisem tego buga, ale niestety nie pamiętam - walczyłem
    z tym ze 2 lata temu.

strony : [ 1 ]


Szukaj w grupach

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: