Transparentny tylko dialog w WinAPI bez transparentnych kontrolek.

0

Cześć. Kombinuje i googluje, ale póki co trafiam na niedziałąjące kody po tłumaczneniu z C++ albo na informacje, że się nie da. Ale może ktoś z Was wie (pewnie tylko @kAzek i @Azarien użyali tutaj częściej WinAPI, ale może ktoś jeszcze ma z tym doświadczenie i na to liczę :)). Czy da się w WinAPI stworzyć TYLKO przezroczyste okno dialogowe bez nadawania przezroczystości pozostałym kontrolkom na nim się znajdującym. Póki co zrobiłem taki dialog, którego exek dołaczyłęm do tego posta. Niestety nadawanie przezroczystości przez SetLayeredWindowAttributes i odopwiednim stylu okna powoduje, że kontrolki również stają się przezroczyste. A podany w odpowiedziach na http://stackoverflow.com/questions/3970066/creating-a-transparent-window-in-c-win32 kod procedury SetSplashImage po przetłumaczeniu z C++ na Delphi nie działa. Może coś nie tak robię. Prosił bym o porady. Póki co osiągnałem efekt na jakim mi zalęży ale tylko pod VCL wedlug porad na: http://www.delphi7.nl/tutorials/splashscreen_transparency.php - jednak mi zależy na możłiwie jak najmniejszym exeku po "zUPXowaniu". Bitmapa z logiem TheCompany w WinAPI zajmuje wraz zkodem niecałe 109 KB przy zastosowaniu http://kolmck.net/sys/SysDcu7.zip a w VCL z użyciem tej samej bitmapy ponad 226. Jeżeli nie znajdę pomocy i działąjącego rozwiązania pod Delphi 7 to po prostu zadowolę się efektem pod VCL. Ale nawet próby zastosowania w WinAPI kodu z modułu VCL forms.pas - TCustomForm.SetLayeredAttribs nie pomaga. Pewnie TImage umieszczone na formatce VCL jest jakoś inaczej tworzone, chociaż z kodu nie umiem tego wywnioskować. W załączniku vcl_splash.zip jest efekt jaki chciałbym osiągnąc w WinAPI. Czyli może da się położyć albo stworzyć tak Statica do pokazania obrazka i go rozciągnąć, żeby się nie robił przezroczysty. Kod do robienia przezroczystej bitmapy mam z google działający. Oba splashe - zarówno ten pod WinAPI (w pliku transparent_bitmap_test.zip) jak i ten pod VCL zamkniecie klikając na obrazek. I to tyle, jeśli chodzi o pytanie. Przy okazji już teraz życze wszystkim wesołych świąt i szczęśliwego nowego roku, bo nie wiem czy będę miał później czas na skłądanie życzeń każdemu z osobna i wzbogacanie ich o wierszowane formułki, które i tak znajdziecie na google :)

1

Z tego co ja widzę to nie przezroczystość a region jest ustawiany, wygeneruj dynamicznie region na podstawie koloru tła obrazka (z jakąś tam tolerancją) i SetWindowRgn ;)

2

Tak jak napisał @Bartosz Wójcik trzeba zrobić region. Zrobiłem małe demko które dodaję jako załącznik. Kodu nie ma wiele więc myślę że nie trzeba nic wyjaśniać. Całość bazuje na znalezionej w sieci funkcji BitmapToRegion (którą ktoś niezbyt dokładnie przetłumaczył z C++ przez co było trochę drobnych błędów ale poprawiłem choć pewnie dało by to się optymalnej napisać ale w to już nie wnikałem).

0

@kAzek: bardzo dziękuję Tobie za wytrwałośc - w idealnym przetłumaczeniu kodu na Delphi z C++. Ten kod miałem już od Użytkownika @Bartosz Wójcik. Jednak byłem mniej więcej w połowie jego tłumaczenia, które przerwałem mając co innego jeszcze do zrobienia. Poza tym na pewno bym go tak dobrze nie przetłumaczył i pewnie przy mojej słabej znajomości C/C++, popełniłbym takie błedy, które by spowodowały, że owy kod by po prostu nie działał w ogóle lub nie działał prawidłowo. Także podsumowując, to mój problem został rozwiązany. Do tego posta dołaczam archiwum z działającym, jak trzeba dla mnie programem i kodem od @kAzek w pliku bitmap_region.pas. Jedyne co zmieniłem to wielkośc liter w nazwach zmiennych, ułożenie deklaracji zmiennych od najkrótszych do najdłuższych (bo tak lubię), dodałem beginy i endy oraz zamieniłem to co nie jest pointerami z instrukcji Inc jako Zmienna := Zmienna + X; (bo tak też lubię i wole ;)). Poza tym po zapoznaniu się z komentarzami je również usunąłem. Cóż. Wielu tutaj pewnie będzie pisać "Twoje WinAPI", ale ja lubię (znowu to słowo ;)) pisać poza VCL jeżeli tylko daje radę. Jak z czymś nie można to @kAzek albo ktoś jeszcze tutaj pomoże w potrzebie. I można się wielu ciekawych rzeczy nauczyć, a jak widzicie sami, że kod wynikowy po zupxowaniu jest o 120 kb mniejszy i to również... lubię ;)

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