Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Delphi - forma przeźroczysta - przenikalna

alien1983 16 Sie 2009 18:40 4058 22
  • #1 16 Sie 2009 18:40
    alien1983
    Poziom 13  

    Witam Jak zrobić w delphi przezroczystą formę na 50% i przenikalną na 100% czyli taki hologram, który czesciowo bedzie widoczny a czesciowo to co jest pod nim i na to co jest pod nim można bedzie klikać itp. ???

    0 22
  • #3 16 Sie 2009 23:02
    alien1983
    Poziom 13  

    Chodzi mi o formę(formatkę) częsciowo przeźroczystą która nie jest obiektem .. czyli mysz znajdująca się na niej nie biędzie na nią klikać (uruchamiac zdarzen) tylko bedzie się klikać na to co jest pod tą czesciowo - orzezroczystą formą.

    0
  • #4 16 Sie 2009 23:20
    Dżyszla
    Poziom 42  

    nie ma takiej możliwości. Każda forma jest samodzielnym obiektem w systemie. Może co najwyżej przekazywać zdarzenie do innej formy.

    Lepiej powiedz, co chcesz konkretnie osiągnąć. Przecież istnieją algorytmy nakładania półprzezroczystego obrazów na siebie - może wystarczy?

    0
  • #5 17 Sie 2009 07:44
    alien1983
    Poziom 13  

    Chcę w pewnym momencie wyświetlić komunikat z ups na wszystkich kompach w sieci w niewielkim okienku (jeśli nastąpi awaria prądu) informujący o czasie pracy na baterii i konieczności zakończenia pracy tych stanowisk. Komunikat ma być częściowo przeźroczysty aby go było widać (tak długo jak ma miejsce praca na baterii) ale żeby nie utrudniał pracy na komputerze w tym czasie i nie blokował okien, ikonek, przycisków znajdujących się pod nim. Czyli taki hologram (jak kurz na ekranie komputera ;)) Jeśli jest to go widać ale nie uniemożliwia dalszej pracy.

    0
  • #7 17 Sie 2009 18:27
    alien1983
    Poziom 13  

    Gdybym widział to bym nie pytał czy to jest możliwe:) Pozdro... pozatym to oco chcę osiągnąć chyba nie jest nie do zrobienia?

    0
  • #8 17 Sie 2009 18:40
    Dżyszla
    Poziom 42  

    odpowiedziałeś sobie właśnie sam na pytanie

    a tak ściślej - nie ma rzeczy niemożliwych, są tylko nieopłacalne. Gdyż aby coś takiego wykonać musiałbyś stworzyć formę, obsługiwać zdarzenia kliknięcia itp i przekazywać jej do aplikacji umieszczonej w danym miejscu pod formą w postaci komunikatu zmodyfikowanego na potrzeby danej aplikacji, która aktualnie jest najbardziej na wierzchu w danym punkcie ekranu. Do tego za każdym razem przekazywać jej focus, który zostanie zabrany przy dojściu zdarzenia do faktycznej formy pierwszoplanowej (czyli twojej). Suma suamru za dużo zabawy.
    może prostszym byłoby już rysowanie bezpośrednio po ekranie, ale pobieranie wycinka, wyliczenia i narysowanie oraz utrzymywanie aktualnego fragmentu obrazu jest na tyle pracochłonne, że skutecznie obciąży to procesor, a efekt i tak będzie marny, jeśli pod spodem znajdzie się aplikacja dokonująca częstego przerysowywania bądź mająca aktywne pole interakcyjne.

    Do takich rzeczy został stworzony pasek powiadamiania i ew. balloon tips. Ewentualnie umieszczanie niewielkich okienek w mało wykorzystywanych obszarach, najczęsciej tuż nad zasobnikiem, które to okienka można zawsze zamknąć.

    A tak już zupełnie na marginesie, to Windows ma wbudowane funkcje powiadamiania o krytycznym stanie baterii (o ile tylko UPS wspiera), a w ostateczności takie czynności realizują często programy dołączone do UPSów.

    0
  • #9 18 Sie 2009 12:03
    alien1983
    Poziom 13  

    Wiem że ma ale po co firmowe jak można zrobić własne, Pozatym wbudowane w windowsa czy oprogramowanie danej firmy ups jest mało funkcjonalne i przydatne do takich celów jakie byśmy chcieli. Pozatym informacja o parcy na baterii ma poinformowac użytkowanika np. na drugim koncu sali, i nie ma mu przeszkadzac w pracy (konczeniu pracy), pozatym z tego co wiem oprogramowanie w windowsach nijak ma się do komunikacji sieciowej z ups. Satysfakcje sprawia zrobienie cos samemu a nie korzystanie z gotowaców:)

    0
  • #11 05 Lip 2010 17:54
    Arutim
    Poziom 20  

    Hej!
    Bardzo prosto da się to zrobić w delphi ... bierzesz kolor formy np. clGreen, później wybierasz w inspektorze TransparentColor na true, i TranspareColorValue na clGreen - forma jest przeźroczysta dla systemu (win2000 wzwyż) zostaje tylko obramowanie, które zaraz usuniemy.
    następnie bierzesz bordelstyle na bsNone, windowState na wsMaximized i formstate fsStayOnTop - masz zmaksymalizowane na cały ekran, zawsze na wierzchu i wszystko co jest pod spodem możesz sobie klikać i nie ma już obramowania, aplikacja jest niewidoczna;).

    Tekst wyświetlasz za pomocą np.
    Canvas.Font - tu sobie ustawiasz kolor, wielkość czcionki
    Canvas.TextOut(x,y, 'tekst') ;), w X,Y wpisujesz sobie współrzędne, w tekst, tekst który chcesz wyświetlić.

    Gdy chcesz się pozbyć tekstu, dajesz nazwaformy.Refresh; czyli domyślnie np. Form1.Refresh;

    Jedyne co to zostaje usunięcie aplikacji z alt+tab i paska zadań ale to odrębny temat ;)

    0
  • #12 05 Lip 2010 21:05
    alien1983
    Poziom 13  

    Niestety nie o to mi chodziło bradziej chodzi mi coś w rodziaju OSD. Według Twojego pomysłu cokolwiek namalowane na canvasie nie jest przenikalne tzn. ma postać (reaguje na mysz), (można w to kliknąć).

    0
  • #13 05 Lip 2010 23:08
    Arutim
    Poziom 20  

    Przecież właśnie o tym mówię:
    Przykładowe 2 screenshot'y ;)
    Delphi - forma przeźroczysta - przenikalna Delphi - forma przeźroczysta - przenikalna

    Nie mam pojęcia o jaką reakcję chodzi że niby co miałoby robić?

    Śmiało możesz klikać - aż padniesz ;D

    0
  • #14 06 Lip 2010 08:39
    alien1983
    Poziom 13  

    Kliknij sobie dokładnie na to co wyrysowałeś i zobaczysz że nie jest to osd. Klikając na to co wyrysowałeś powinno zareagować na klikniecie to co znajduję się pod nim np. przeglądarka internetowa niestety tak się nie dzieje. Wczoraj znalazłem coś takiego co tworzy troche bardziej prawdziwe osd.:

    Code:
    Canvas.Handle := GetWindowDC(GetDesktopWindow); 
    
    Canvas.TextOut(100,100, 'To jest tekst wyświetlony na pulpicie');
    ReleaseDC(GetDesktopWindow, Canvas.Handle);

    niestety nie da się ustawić przezroczystosci oraz trzeba odswieżać cały pulpit aby śmieci nie zostawały podczas poruszania oknami. za pomocą np. tej funkcji:
    Code:
    SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, NULL,SPIF_SENDCHANGE);

    Niestety od tego miga ekran/pulpit:/

    0
  • #15 06 Lip 2010 09:41
    Arutim
    Poziom 20  

    Witaj;)
    Zgadza się w miejscu 'zielonego' przeglądarka nie reaguje, ale zauważ też że półprzeźroczysty napis też nie pozwoli zareagować przeglądarce, a jak nie będzie go widać tj zostanie przesłonięty przez przeglądarkę to go nie zobaczysz... Albo chcesz napis albo nie, więc musisz zdecydować.
    Odnośnie OSD w moim lapku Lenovo jest OSD i co ciekawe albo bardzo ciekawe nie da się kliknąć niczego pod nim i standardowo jest umieszczone w miejscu pomiędzy paskiem zadań a dolnym paskiem aplikacji - dzięki czemu NIE przeszkadza w pracy a informuje o czymś tam, o czym chcemy by informował. Jak mnie pamięć nie myli w KX'a też działało w ten sposób OSD.
    Swoją drogą to jak ludziom pojawia się taki komunikat to raczej mają kończyć pracę czyli zapisać dokumenty nad którymi pracują a nie bawić się dalej ;) napis można by scrollować po całym ekranie dzięki czemu w danym momencie byłby w innym miejscu i użytkownik poczekał by te 2 sekundy i mógłby klikać w miejscu w którym chce (o ile w danym momencie napis by mu to uniemożliwiał ;)

    Co do rysowania po pulpicie - to właśnie dlatego ja zmieniłem koncepcje na taką jaką Ci przedstawiłem, gdyż system sobie może zrobić ze swoim pulpitem co mu się podoba i to w dowolnym momencie więc ciężko wyczuć kiedy odświeżać a ciągłe odświeżanie... no i jeszcze jedna sprawa jak narysujesz coś powiedzmy pod ikonami to przejechanie myszką w win7 spowoduje podznaczenie ikony i tekst znika [ten rysowany na pulpicie]

    0
  • #16 07 Lip 2010 12:30
    alien1983
    Poziom 13  

    Oki... to w taki razie mam takie pytanie....

    Jak chcę zrobić formę przeźroczystą za pomocą :TransparentColor. I na tej formie jeszcze umieścić Tlabel jakis lub Timage z obrazem png z kanałem alpha. to dzieje się coś takiego: kolor użyty do wycięcia czyli TransparenColor zostaje w miejscu kanału alpha png oraz na obrzeżasz liter komponentu Tlabel. Jak się tego pozbyć?

    0
  • #17 07 Lip 2010 12:50
    Arutim
    Poziom 20  

    Zapomniałem dodać - że w przypadku transparentcolor nie powinno się korzystać z kolorów szarych białych i czarnych bo coś tam - nie pamiętam co to powodowało, bo czytałem o tym bardzo dawno ale coś tam przeszkadzało.

    Jeżeli chodzi o TLabel to wspomniany przez Ciebie problem u mnie nie występuje, np. w takiej konfiguracji transparentcolor clgreen, label ma kolor clblue i jest niebieski bez zielonej obramówki.

    0
  • #18 07 Lip 2010 21:05
    beluosus
    Poziom 25  

    Jeżeli ten napis nie ma zajmować wiele miejsca to można zrobić tak jak to gdzieś widziałem... kiedy tylko najedziesz w pobliże napisu to ukrywa się, a kiedy kursor stamtąd zabierasz to znowu się pojawia. Możesz ewentualnie też umieścić napis np. w innym rogu ekranu. Poza tym to raczej denerwujące rozwiązanie zakładające, że użytkownik jest idiotą i ma pamięć 5s. Użytkownik powinien mieć wybór czy chce patrzeć na napis czy nie.

    0
  • #19 07 Lip 2010 22:41
    alien1983
    Poziom 13  

    Wpadłem na podobne rozwiązanie (w momencie najeżdżania na formę) będzie ona znikała bedzie również znajdowała się w rogu oraz będzie cześciowo przeźroczysta tak aby było widać to co jest pod spodem. Mało mnie interesuję to czy użytkownik chce czy nie. Nie jest to zastosowanie dla zwyklych użytkowników. Tylko dla użytkowników pracujących w małej sieci, którzy w momencie wyłączenia prądu mają niewiele czasu na skończenie swojej pracy. I muszą o barku zasilania, ewentualnie o czasie jaki im pozostał być w 100% poinformowani. Przy normalnym zasilaniu z sieci forma (ten komunikat) się nie pojawia.

    0
  • #20 09 Lip 2010 03:52
    mungo
    Poziom 18  

    Przepraszam że się tak wtrącę ale nie chce zakładać nowego tematu.

    Arutim napisał:
    Bardzo prosto da się to zrobić w delphi ... bierzesz kolor formy np. clGreen, później wybierasz w inspektorze TransparentColor na true, i TranspareColorValue na clGreen - forma jest przeźroczysta dla systemu (win2000 wzwyż) zostaje tylko obramowanie, które zaraz usuniemy.
    następnie bierzesz bordelstyle na bsNone, windowState na wsMaximized i formstate fsStayOnTop - masz zmaksymalizowane na cały ekran, zawsze na wierzchu i wszystko co jest pod spodem możesz sobie klikać i nie ma już obramowania, aplikacja jest niewidoczna;).


    Bardzo prosto w delphi, a jak sprawa by wyglądała w C++, próbuje zrobić coś podobnego do tego z opisu Artima samo wyświetlanie by mi wystarczyło bez klikania w "namalowane" ale żeby klikanie działało na aplikacjie które byłyby pod spodem i bylo by w C++. Z góry dziękuje za pomoc.

    0
  • #21 26 Lip 2010 05:30
    528649
    Użytkownik usunął konto  
  • #22 26 Lip 2010 08:38
    alien1983
    Poziom 13  

    Jeśli chodzi o łamanie przyjętych reguł to niech google , adobe itp. nie instalują śmieci na komputerach użytkowników :) Poza tym temat do zamknięcia problem rozwiązany . Jak tak dalej będzie to w niedalekiej przyszłości na maca przejdę.

    0
  • #23 26 Lip 2010 09:12
    528649
    Użytkownik usunął konto