我要设计一个无标题窗体,且始终在最屏幕的最前面,要可以改变宽度
我的设计
1、把窗体的BorderStyle:=bsNone;然后窗体用图片做了样式,设置了窗体的透明TransparentColor:=true和TransparentColorValue的值。
2、实现始终在屏幕的最前面
procedure TFmain.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_TOOLWINDOW or WS_EX_TOPMOST;
  Params.WndParent := GetDesktopWindow;
end;
3、可移动。在窗体背景图片的MouseDown里面写代码
procedure TFmain.MoveForm(Sender:TObject; Button: TMouseButton;
  Shift: TShiftState; X,Y: Integer);
begin
  if Button = mbLeft then
  begin
    ReleaseCapture;
    Perform(WM_SYSCOMMAND, $F012, 0);
  end;
end;4、只可以改变宽度--我翻遍了论坛,还是没有解决方法
下面的代码是查阅到的
override窗体的CreateParams...
  public
    { Public declarations }
    procedure CreateParams(var Params: TCreateParams); override;
...
procedure TMainForm.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := WS_THICKFRAME or WS_POPUP or WS_BORDER or WS_SIZEBOX;//此句是关键,这里的参数可以有很多
end;
如果用这个代码,窗体会有一个灰色的边框,很难看,无法和我的图片背景相融合。======================================
偶不素懒人,也研究了好多方法,请大家赐教。算是论坛里面窗体制作的总结帖吧。

解决方案 »

  1.   

    从Delphi.Super.Documents.2005.Kingron 上获得一段资料,希望对你有用;procedure TForm1.CreateParams(var Params:TCreateParams);
    begin
      inherited CreateParams(Params);
      Params.Style := WS_SIZEBOX or
                      WS_POPUP   or
                      WS_BORDER;
    end;*******************
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    borderstyle:=bsSizeable;
    setwindowlong(handle,gwl_style,getwindowlong(handle,gwl_style) and not ws_caption);
    clientheight:=height;
    end;
    ************************
    TForm1=class(TForm)
    ...
    public
      procedure CreateParams(var Params: TCreateParams); override;
    // 加入这一行
    end;
    // Copy 如下代码即可
    procedure TForm1.CreateParams(var Params: TCreateParams);
    begin
      inherited CreateParams(Params);
      with Params do
      begin
        Style := (Style or WS_POPUP) xor (ws_dlgframe);
    ///如果要凹下去的效果,则加入下面这行,否则去掉
        ExStyle := ws_ex_clientedge;
      end;
    end;
    ***************
    怎样可以不要Form的标题栏和边界但可以保留改变Form的大小的功能:
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
      private
        procedure WmNCHitTest(var Msg : TWMNCHitTest); message WM_NCHITTEST;    { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.WmNCHitTest(var Msg: TWMNCHitTest);
    const v=10; //border width
    var p:TPoint;
    begin
      p:=Point(Msg.XPos,Msg.YPos);
      p:=ScreenToClient(p);
      if PtInRect(Rect(0,0,v,v),p) then
        Msg.Result:=HTTOPLEFT
      else if PtInRect(Rect(Width-v,Height-v,Width,Height),p) then
        Msg.Result:=HTBOTTOMRIGHT
      else if PtInRect(Rect(Width-v,0,Width,v),p) then
        Msg.Result:=HTTOPRIGHT
      else if PtInRect(Rect(0,Height-v,v,Height),p) then
        Msg.Result:=HTBOTTOMLEFT
      else if PtInRect(Rect(v,0,Width-v,v),p) then
        Msg.Result:=HTTOP
      else if PtInRect(Rect(0,v,v,Height-v),p) then
        Msg.Result:=HTLEFT
      else if PtInRect(Rect(Width-v,v,Width,Height-v),p) then
        Msg.Result:=HTRIGHT
      else if PtInRect(Rect(v,Height-v,Width-v,Height),p) then
        Msg.Result:=HTBOTTOM;
      Inherited;
    end;end.
    *************************
    类似网络蚂蚁的悬浮窗体     
    源码:protected:
            virtual void __fastcall CreateParams(TCreateParams & Param);void __fastcall TForm2::CreateParams(TCreateParams & Param)
    {
      //调用基类
      TForm::CreateParams(Param);      //去掉窗口标题区
      Param.Style=Param.Style & ~WS_CAPTION;
      Param.Style=Param.Style | WS_POPUP;
      //设为总在最上面
      Param.ExStyle=Param.ExStyle | WS_EX_TOPMOST;
      //设Windows Owner为Desktop Window
      Param.WndParent=GetDesktopWindow();
    }注意:
      1、Windows Owner与Windows Parent不同,用::SetParent函数和设置Form?->Parent这能设置Windows Parent,不能设置Windows Owner,要实现FlashGet的悬浮窗必须要设置Windows Owner。
      2、Form的BorderStyle要设为bsToolWindow,不然在任务栏上会显示出这个窗口的标题,将Caption设为空也没有用。
      

  2.   

    procedure TFmain.ManipulateControl(Control: TControl; Shift: TShiftState;
      X, Y, Precision: integer);
    var
       SC_MANIPULATE: Word;
    begin
     //光标在控件的右下角**********************************************************
     if (X>=Control.Width-Precision) and (Y>=Control.Height-Precision)then
     begin
       SC_MANIPULATE  := $F008;
       Control.Cursor := crSizeNWSE;
     end
     //光标在控件的客户区(移动整个控件)******************************************
     else
       if (X>5) and (Y>5) and (X<Control.Width-5) and (Y<Control.Height-5)then
       begin
         SC_MANIPULATE  := $F009;
         Control.Cursor := crSizeAll;
       end
       else begin
         SC_MANIPULATE := $F000;
         Control.Cursor := crDefault;
       end;
      if Shift=[ssLeft] then
      begin
        ReleaseCapture;
        Perform(WM_SYSCOMMAND,SC_MANIPULATE,0)
      end;end;procedure TFmain.Img_RightMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      ManipulateControl((Sender as TControl), Shift, X, Y, 10);end;
      

  3.   

    to  S.F.(chinasf.cnblogs.com) :
    大哥,你消失了好久啦,我们的项目如何啦。