manifest i button

0

Witam

Szukałem w google ale nie znalazłem niczego na temat więc zapytam tutaj. Po użyciu manifestu i zmienieniu koloru formy button umieszczony na niej nie wygląda zbyt atrakcyjnie co widać na załączonym screenie, chodzi mi o to "wyżłobienie" pod nim, czy istnieje sposób aby się go pozbyć i aby button był bez niego niezależnie od koloru formy? zdaje sobie sprawę że można skorzystać z komponentów do tworzenia buttonów i przygotować własny button ale chciałbym korzystać jednak ze standardowego buttona więc może da się rozwiązać problem odpowiednim kodem?

                                  ![user image](http://cdn-i.imageox.com/2013/02/05/2c8b5ff00a49.png )
0

Zastosować TSpeedButton.

0

Niestety po zastosowaniu TSpeedButton a także TBitBtn efekt "wyżłobienia" nadal występuje.

0

@laiczny: Może ktoś coś jeszcze Tobie doradzi. Jednak według mnie ze standardowym buttonem może być ciężko. Rozwiązanie jakie przychodzi mi do głowy zaczerpnięte z WinAPI to stworzyć przez funkcję CreateWindow button ze stylem BS_OWNERDRAW i w funkcji obsługi komunikatów dla formatki, pod którą zawsze możesz się "podpiąć", odpowiednio obsługując komunikat WM_PAINT. Ewentualnie spróbować zrobić to w zdarzeniu OnPaint dla formatki. Mi się udało w aplikacji pisanej w WinAPI, ogarnąć standardowy button, tak aby wyglądał niemal jak TBitBtn z VCL. Z tym, że zamiast bitmapy jako glyph ładowana jest ikonka ze zmiennej typu HICON, ponieważ na tym mi zależało. Posiłokowałem się w tym celu przeriabiając przykładowy kod z rysowaniem buttonów i obsługą WM_PAINT. Dostępny jest on wśród wielu kodów na tej stronie: http://www.angelfire.com/hi5/delphizeus - może tak pokombinuj, chociaż nie wiem czy na pewno uzyskasz taki efekt, na którym Tobie zależy, ale możesz spróbować. W moim przypadku jednak do odpowiedniego ustawienia pozycji "glypho-ikony" posiłkowałem się wyciętym najważniejszym kodem wziętym z klasy TBitBtn. A tenże mam, bo swego czasu z "podkradłem" go sobie z instalki Delphi 7 w wersji Enterprise. Jednak jeżeli chce się pisać w czystym WinAPI używając Delphi 7, ale Personal - to według mnie inaczej jest ciężko, bo kody źródłowe modułów VCL bardzo się przydają. Googlując za jakimi kolwiek przykładami buttona z ikonką i tekstem jednocześnie (bo normalny button wyświetli albo ikonkę albo tekst, a nie jednocześnie obie te rzeczy) na jednym z wątków bodajże na usenecie i polskiej news grupie dotyczącej Delphi, natrafiłem na porady aby właśnie takie rzeczy robić przez własne obsłużenie rysowania kontrolki. Ponieważ podany tam kod, który miał to realizować (ikonka plus tekst na buttonie) nie do końca się sprawdzał. A i ktoś kiedyś tutaj nabijał się ze mnie, że wykorzystuje własne funkcje na przykład z SysUtils. Że wszystko niemal u mnie jest jako własna funkcja czy procedura. Jednak pisząc pod WinAPI, po prostu inaczej się nie da. Inaczej to nie będzie WinAPI. A i exek naszego programu będzie "puchnął" w zastraszającym tempie jeżeli skorzystamy z modułów VCL, także często ich część trzeba sobie "wypruć" i zaadaptować do swoich potrzeb.

0
laiczny napisał(a):

Niestety po zastosowaniu TSpeedButton a także TBitBtn efekt "wyżłobienia" nadal występuje.

No nie wiem. Zawsze stosuję rozwiązanie z TSpeedButton i efekt, o którym piszesz, znika (po zastosowaniu TBitBtn nadal występuje, ponieważ dziedziczy on z TButton).
Zresztą podobnie nieprzyjemnie wyświetlają się TRadioButton i TCheckBox.
Wygląda na to, że wszystkie TButtonControl tak mają.

user image

0

W Lazarusie nie miałem takiego problemu ale ciiiiiiii

0

I jeszcze jedno spostrzeżenie.
Problem ten występuje jedynie wtedy, gdy ustawiam Form1.DoubleBuffered:=True;

0

Nie mam pewności, ale wydaje mi się, że ten "pasek" pod przyciskiem narzucony jest przez manifest (a raczej styl okien i przycisków) - sam się kiedyś z tym użerałem, bo pod standardowymi kontrolkami tłem formularza był obraz i przyciski nie wyglądały atrakcyjnie; Można to obejść właśnie przez obsłużenie zdarzenia OnPaint i w nim zamalowywać niechciane części kontrolek, jednak jeśli tłem będzie obraz to będzie trochę więcej roboty z ich usuwaniem;

TSpeedButton to nie zawsze najlepsze rozwiązanie - jeśli komuś zależy na przystosowaniu interfejsu programu do obsługi klawiaturą (bez myszki), to ten przycisk jest trochę upośledzony - nie zbiera fokusa, stąd jedynie przez HotKey będzie można go kliknąć; To oczywiście sprawa drugorzędna, bo większość ludzi i tak obsługuje programy głównie myszką, jednak pytacz nie napisał czy mu to przeszkadza, czy nie, więc wolałem to nadmienić;

Jeżeli masz czas i chęci - możesz utworzyć własny komponent i zaimplementować w nim własne rysowanie, np. dziedzicząc po klasie TCustomControl - ma wbudowaną kanwę oraz obsługę komunikatów, dzięki którym zawartość kontrolki jest odświeżana automatycznie; Na dodatek będzie mogła zbierać fokusa, tak jak i wszystkie kontrolki dziedziczące po TCustomControl i TWinControl; Wystarczy jedynie dodać kilka potrzebnych właściwości i zdarzeń i cieszyć się własnym przyciskiem;

0

ale chciałbym korzystać jednak ze standardowego buttona więc może da się rozwiązać problem odpowiednim kodem?
Olać.

0

Jeśli zależy Ci na atrakcyjnym, nowoczesnym wyglądzie zainteresuj się TGlassButton z torry.net (http://www.torry.net/pages.php?id=77)
Imho wygląda dużo lepiej niż windosowski. Jest bardzo łatwy do zainstalowania, są przykłady użycia i demo.

Link do pobrania: http://www.torry.net/vcl/buttons/buttons/GlassButtonProject.zip

0

Udało się rozwiązać problem za pomocą komponentu TBaton który pobrałem kiedyś z 4programmers, po prostu mam przygotowane 3 buttony (domyślny, podświetlony i kliknięty) które obsługuje wyżej wymienionym komponentem.

                                                                           ![user image](http://cdn-i.imageox.com/2013/02/06/1a0ebe782b0b.png)

1 użytkowników online, w tym zalogowanych: 0, gości: 1