Tehnika Krstarice > Programiranje > Delphi - Forma bez naslovne (caption) linije

Delphi - Forma bez naslovne (caption) linije

15.10.2001.

Recimo da želimo da napravimo malu aplikaciju kao što je časovnik ili hardverski monitor, koji će zauzimati malo mesta na ekranu. Kreiraćemo malu formu i to takvu da nema naslovne linije, da korisnici ne bi mogli da povećavaju/smanjuju veličinu forme, ali da ipak mogu da premeštaju formu. Na primer, program "Sat" koji dolazi uz Windows ne poseduje naslovnu liniju, ali forma programa može biti prevučena na drugo mesto. Kako ovaj efekat reprodukovati u Delphi aplikacijama?

Postoji nekoliko načina da dobijemo ovaj efekat. Osnovna tehnika je da "zavaramo" Windows da je cela forma (ili neki njen deo) u stvari naslovna linija. Pa tako, kada korisnik klikne mišem bilo gde na formi i pomeri pokazivač, i forma bi trebalo da promeni poziciju i isprati pokret korisnika.

  1. Pokrenite Delphi i kreirajte novi projekat. Projekat nazovite "BEZNASLOVA.DPR".
  2. Podesite osobine forme na sledeći način:
    • AutoScroll - False
    • BorderStyle - bsSingle
    • Name - Forma bez naslova
  3. Dodajte na formu i dve kontrole label sa sledećim osobinama:
    • Label1
      Left                  14
      Top                    5
      Width             100
      Height              20
      Alignment  taCenter
      AutoSize        False
      
    • Label2
      Left                  14
      Top                  30
      Width            100
      Height            20
      Alignment  taCenter
      AutoSize       False
      
  4. Dodajte na formu i komponentu "PopupMenu", dvostruko kliknite na postavljenu komponentu i pojaviće vam se "Menu Designer". Na "Pop-up" meni dodajte samo dve stavke: "&Izlaz" i "&Ostani na vrhu"
  5. Unutar obrade događaja OnClick menija "Izlaz" dodajte sledeći programski kod:
    procedure TForm1.IzlazClick(Sender: TObject);
    begin
      Close;
    end;
    
  6. Unutar obrade događaja OnClick menija "Ostani na vrhu" dodajte sledeći kod:
    procedure TForm1.Ostaninavrhu1Click(Sender: TObject);
    begin
      Ostaninavrhu1.Checked := not(Ostaninavrhu1.Checked);
      if Ostaninavrhu1.Checked then
        FormStyle := fsStayOnTop
      else FormStyle := fsNormal;
    end;
    
  7. Zatvorite "dizajner menija". Za ovaj projekat potrebna nam je drugačija forma u odnosu na standardne koje nudi Delphi. Potrebno je da podesimo stil forme tako da "zaobiđemo" metod forme "CreateParams". U editoru koda deklarišite metod "CreateParams" u sekciji deklaracija:
    type
      TNoCapForm = class(TForm)
        Label1: TLabel;
        Label2: TLabel;
        PopupMenu1: TPopupMenu;
        Izlaz: TMenuItem;
        Ostaninavrhu: TMenuItem;
        procedure Timer1Timer(Sender: TObject);
        procedure IzlazClick(Sender: TObject);
        procedure Ostaninavrhu(Sender: TObject);
      private
        { Private declarations }
        procedure CreateParams(var Params: TCreateParams); override;
      public
        { Public declarations }
    end;
    
  8. Potom, u sekciju implementation dodajte naredni kod:
    implementation
    {$R *.DFM}
    procedure TForm1.CreateParams(var Params: TCreateParams);
    begin
      inherited CreateParams (Params);
      Params.Style := ws_Popup or ws_ClipChildren or ws_ClipSiblings or
    ws_Border;
    end;
    
  9. Preostalo nam je da podesimo da Windows tretira celu formu kao naslovnu liniju, i to odgovaranjem na sistemsku poruku wm—NCHitTest:
    private
        { Private declarations }
        procedure CreateParams(var Params: TCreateParams); override;
        procedure WMNCHitTest(var Msg: TMessage);  message WM_NCHITTEST;
      public
        { Public declarations }
      end;
    
  10. U sekciju implementacija dodaćemo kod za upravljanje sistemskom porukom:
    procedure TForm1.WMNCHitTest(var Msg: TMessage);
    begin
      if GetAsyncKeyState(VK_LBUTTON) < 0 then
        Msg.Result := HTCAPTION
      else
        Msg.Result := HTCLIENT;
    end;
    
  11. Na formu ćemo još dodati komponentu "Timer", iz koje ćemo iščitavati podatak o trenutnom vremenu.
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Label1.Caption := TimeToStr(Time);
      Label2.Caption := DateToStr(Date);
    end;
    
    Selektujte formu i pređite u "Object Inspector", na kartici "Events", kliknite u desno polje događaja "OnCreate", te iz liste izaberite "Timer1Timer".
  12. Iskompajlirajte i istestirajte projekat.

Preporučite ovaj članak

Članak još uvek nije ocenjen.