Przenikalna forma, zawsze na wierzchu ?

0

Witam !

Mam pytanie, czy jest możliwość, aby np. forma była "przenikalna" ? Tzn. aby zachowywała się tak jakby jej nie było, a elementy pod nią były traktowane jakby były nad nią ? Obecnie mam podformę, która jest odpowiednio generowana i wycinana przez główna formę, na kształt ramki z ustawioną przezroczystością. Problem jest że nie jest ona przenikalna i że nie zostaje na wierzchu. Tj. mimo stayontop po kliknięciu ramki a następnym kliknięciu czegoś poza nią ramka chowa się.

Z góry dzięki za pomoc.

0
Whocares napisał(a):

Problem jest że nie jest ona przenikalna i że nie zostaje na wierzchu. Tj. mimo stayontop po kliknięciu ramki a następnym kliknięciu czegoś poza nią ramka chowa się.

SetWindowPos
0

Próbowałem, widziałem:
http://4programmers.net/Delphi/faq/Nie_dzia%C5%82a_StayOnTop._Co_robi%C4%87

Nie pomogło, główne okno potrafi być zawsze na wierzchu ale sub okno już nie. A co do tej przenikalności da się coś zrobić ?, nie musi to być forma może być nawet grafika, która za ramkę robi.

0
Whocares napisał(a):

nie musi to być forma może być nawet grafika, która za ramkę robi.

TCanvas+GetWindowDC+GetDesktopWindow i rysujemy ;)

0

Co do pozostawania na "wierzchu" potomnych okien to jest rozwiązanie:
http://en.allexperts.com/q/Delphi-1595/Top.htm

Rysowanie ramki nie sprawia że ona jest przenikalna ! Obecnie ma ramkę na zasadzie odpowiedniego wycięcia formy:

  
...
  start:=((wymiar-wew) div 2)*sector;
  koniec:=(wymiar*sector)-start;
  H1:=CreateRectRgn(0,0,Width,Height);
  H2:=CreateRectRgn(start,start,koniec,koniec);
  CombineRgn(H1,H1,H2,rgn_diff);
  SetWindowRgn(handle,H1,true);
...
0
Whocares napisał(a):

Rysowanie ramki nie sprawia że ona jest przenikalna !

var
  C : TCanvas;
begin
  C := TCanvas.Create;
  C.Handle := GetWindowDC(GetDesktopWindow);
  C.Brush.Style := bsClear;
  C.Pen.Width := 10;
  C.Rectangle(200,200,500,500);
  C.Free;
end;

Że niby kontrolki, które będę wewnątrz ramki rysowanej przez ten kod, nie będę reagowały ? Czy jak ? No chyba, że źle Cię zrozumiałem ...

0

Może inaczej, rysując tak jak tu pokazałeś jest ok, ale dla normalnych okien czy pulpitu. Ale nie za bardzo wiem jak mam wykorzystać tę metodę dla okna gry, gdyż jak podam uchwyt okna gry to tam w ogóle się nie rysuje ;/

0

Z grami raczej nie będzie tak łatwo TCanvas'em, tak samo funkcja SetWindowPos się nie sprawdzi, a co chcesz konkretnie zrobić ? Coś z pobieraniem obrazu ? To nie lepiej zrobić screen'a w odpowiedniej chwili i na nim działać ?

0

Ustawiam sobie parametry ramki do wygenerowania, aktualnie ramka to przycięta forma, wszystko jest ok, tj. ramka jest na wierzchu, jest półprzezroczysta, obszar wycięty z ramki jest dostępny, tylko forma jako ramka nie jest przenikalna. Klikając na obszar ramki nie klikam w grze. Program sprawia że będąc w danym obszarze ramki do uchwytu okna gry przesyłane są odpowiednie polecenia.

0
Whocares napisał(a):

Ustawiam sobie parametry ramki do wygenerowania, aktualnie ramka to przycięta forma, wszystko jest ok, tj. ramka jest na wierzchu, jest półprzezroczysta, obszar wycięty z ramki jest dostępny, tylko forma jako ramka nie jest przenikalna. Klikając na obszar ramki nie klikam w grze. Program sprawia że będąc w danym obszarze ramki do uchwytu okna gry przesyłane są odpowiednie polecenia.

Wybaczycie że się wtrącę :P
Nie łatwiej jest rysować ramkę wewnątrz formy i sprawdzać czy zdarzenie np. myszki odnosi się do ramki czy do okna gry i przekierowywać gdy trzeba?
Nawet nie wiem czy wszystko zrozumiałem dobrze, ale tak by wynikało że jest najprościej.

0
Whocares napisał(a):

Program sprawia że będąc w danym obszarze ramki do uchwytu okna gry przesyłane są odpowiednie polecenia.

To zmienia postać rzeczy :) Moim zdaniem bawienie się w ramki w takiej sytuacji to lekkie przekombinowanie. Nie lepiej po prostu pobierać współrzędne myszy i gdy znajdzie się ona w pewnym obszarze wysyłać te polecenia do okna gry ?

0

Obecnie nie rysuje ramki, forma(kwadrat) to ramka z wyciętym mniejszym kwadrantem wewnątrz obramowanie powstałe w ten sposób, jest wykorzystane właśnie w sposób w jaki zaproponowałeś. Tj. w chwili pojawienia się kursora w danym obrębie ramki do uchwytu okna gry są przesyłane odpowiednie polecenia. Jednakże operacje takie jak PPM lub RPM czy też DRAG nie mogą już zostać zrealizowane gdyż ramka i jej położenie sa generowane na podstawie bezwzględnej rozdzielczości, a w gdzie jest inna rozdzielczość.

0
Golden_Mind napisał(a):
Whocares napisał(a):

Program sprawia że będąc w danym obszarze ramki do uchwytu okna gry przesyłane są odpowiednie polecenia.

To zmienia postać rzeczy :) Moim zdaniem bawienie się w ramki w takiej sytuacji to lekkie przekombinowanie. Nie lepiej po prostu pobierać współrzędne myszy i gdy znajdzie się ona w pewnym obszarze wysyłać te polecenia do okna gry ?

Bez ramki też działa, polecenia są przekazywane na podstawie właśnie położenia kursora, ale dobrze jest widzieć obszar w którym mogę dokonywać operacji.

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