Jak uzyskać półprzeźroczyste okno za wyjątkiem czcionki?

0

Okno i wszystko na nim ma być półprzeźroczyste, czcionka ma być w pełni widoczna. Zastosuję czcionkę o nazwie SYSTEM, uniknę tym samym problemów z wygładzaniem czcionki i skazami w postaci koloru tła.

Efekt miałby wyglądać mniej więcej tak:
user image

Bardzo proszę o nazwy funkcji etc, których powinienem użyć. Podejrzę wtedy ich opis w google (może przykłady użycia będą konkretne) oraz zajrzę na MSDN. Im rozwiązanie będzie prostsze, tym lepiej. Nie przepadam za bardzo rozbudowanym, profesjonalnym kodem, łatwiej mi przeanalizować (linijka po linijce) prymitywny kod robiący to co chcę osiągnąć więc prosiłbym wziąć to pod uwagę o ile jest wiele sposobów na osiągnięcie tego co chcę.

0

C#:

class WindowsScheme : IWindowsGraphicStyles.Renderers
{
int WindowsBkTrans = 0;
this.ActiveForm.WindowTransparency = new WindowTransparency(' ', 100); 
WindowsBkTrans = this.ActiveForm.WindowTransparency;
this.Properties.Windows(inherit<WindowsBkTrans>, System.Resources.Default.Save());
}

o coś takiego chodzi?

0

Jest jedno dziwne trochę rozwiązanie. Trzeba dodać drugą Formę.

Czyli na Form1 ustawiamy BorderStyle na bsNone, kolor Form1 dajemy np. na clHotLight, AlphaBlend na np. 90 i True.
Na Form2 dodajemy np. TLabel (czcionka system, bo normalna z włączonym AA we właściwościach skazy z tła ma), kolor Form2 na clFuchsia, transparent też taki i transparent true

A w kodzie Form1 coś takiego:

procedure TForm1.FormShow(Sender: TObject);
begin
  Form2.BorderStyle := bsNone;
  Form2.SetBounds(0, 0, ClientWidth, ClientHeight);
  Form2.Show;
end;

Pozostaje kwestia przesuwania Formy Drugiej wtedy kiedy my przesuwamy Formę Pierwszą. Macie pomysły jak to zrobić? Oczywiście paska tytułowego żadna Forma nie ma więc można by dać w Form1 coś w stylu:

procedure WMNCHitTest(var Msg: TWMNCHitTest) ; message WM_NCHitTest; 

w kodzie:
 procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest) ;
 begin
    inherited;
    if Msg.Result = htClient then Msg.Result := htCaption;
 end; 

i wtedy przesuwanie Formy1 działa, ale trzeba dopisać kod by Forma2 też się przesuwała, by Forma 2 miała tę samą pozycję co Forma pierwsza. Jak to zrobić?
Dopisanie w tej procedurce wyżej: Form2.Top := Form1.Top byłoby bez sensu, bo forma 2 by przesunęła się dopiero wtedy kiedy puścimy przycisk myszy (bo pewnie dopiero wtedy Form1.Top dostaje namiary nowe)

1

Dziwne rozwiązanie ale niech będzie z przesuwaniem to powinna zadziałać obsługa komunikatu WM_WINDOWPOSCHANGED dla TForm1:

  private
    { Private declarations }
    procedure WMWindowPosChanged(var Msg: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
//...
procedure TForm1.WMWindowPosChanged(var Msg: TWMWindowPosChanged);
begin
if Assigned(Form2) and Form2.Visible = True then
  begin
    with Msg.WindowPos^ do
      MoveWindow(Form2.Handle, x, y, cx, cy, True);
  end;
end;
0

o, działa, dziękuję (choć oczywiście trzeba było dodać:

procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
  inherited;
  if Msg.Result = htClient then Msg.Result := htCaption;
end;

po to by przesuwanie Form1 działało po kliknięciu na formę (bo twój kod działał tylko gdy działa przesuwanie, a domyślnie ono działa tylko gdy forma ma belkę tytułową (pasek tytułowy), a po dodaniu tej dodatkowe procki wszystko śmiga).
Bardzo dziękuję za pomoc.

a swoją drogą - ten pomysł z drugą formą też uważam za dziwny, ale to był pomysł obcokrajowców, nie mój. Jak znasz lepszy pomysł (czyli bez formy2) to możesz napisać listę niezbędnych nazw funkcji ;)

0

Jedyne co jest Tobie potrzebne do przesuwania formularza to jego zdarzenie OnMouseDown, w którym wystarczy wpisać:

ReleaseCapture();
SendMessage(Self.Handle, $00A1, HTCAPTION, 0); //lub PostMessage

i podpięcie tego zdarzenia pod OnMouseDown komponentu TLabel;

Przykład w załączniku MoveForm.zip

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