我想实现下面的效果:类似vista侧边栏的搜索框。要求是圆角矩形窗体,宽度可变的,能输入搜索内容。
我试了很多方法都不行,不知道大家能不能帮帮忙呢?谢谢大家~

解决方案 »

  1.   

    CreateRgn
    其他你自己贴图 
      

  2.   

    用文字做窗体形状,其他的都类似,自己找找资料就明白了procedure TForm1.FormCreate(Sender: TObject);
      var
      rgn:HRGN;
      begin
        Self.Color := clRed;
        BeginPath(Canvas.Handle);
        SetBkMode(Canvas.Handle,TRANSPARENT   );
        Canvas.Font.Name:='宋体';
        Canvas.Font.Size:=100;
        Canvas.TextOut(20,20,'My Baby?');
        EndPath(Canvas.Handle);
        rgn:=   PathToRegion(Canvas.Handle);
        SetWindowRgn(Handle,rgn,true);
      end;
      

  3.   

    五角星窗体,摘自网络unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;  const   
            {An   array   of   points   for   the   star   region}   
            RgnPoints:array[1..10]   of   TPoint=   
            ((x:203;y:22),(x:157;y:168),(x:3;y:168),(x:128;y:257),   
            (x:81;y:402),(x:203;y:334),(x:325;y:422),(x:278;y:257),   
            (x:402;y:168),(x:249;y:168));//确定顶点   
            LinePoints:array[1..11]   of   Tpoint=   
            ((x:199;y:0),(x:154;y:146),(x:2;y:146),(x:127;y:235),   
            (x:79;y:377),(x:198;y:308),(x:320;Y:396),(x:272;y:234),   
            (x:396;y:146),(x:244;y:146),(x:199;Y:0));implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    var   Rgn:HRGN;
    begin
        Setwindowpos(Form1.Handle,HWND_TOPMOST,Form1.Left,form1.Top,Form1.Width,Form1.Height,0);
        Rgn:=CreatepolygonRgn(Rgnpoints,High(RgnPoints),ALTERNATE);
        SetWindowRgn(Handle,rgn,True);
        Form1.color:=clgreen;
    end;end.
      

  4.   

    以下是用Api实现透明窗体的代码,最的一次第三个参数为透明的程度,范围为0~255,0为完全透明,255完全不透明.具体可参考MSDN  SetWindowLong(self.Handle,GWL_EXSTYLE,
         GetWindowLong(Self.Handle,GWL_EXSTYLE) xor $80000);
      SetLayeredWindowAttributes(Self.Handle,0,100,LWA_ALPHA);
      

  5.   

    CreateRgn 函数。或者你用透明的PNG做窗体来搞,半透明效果也可以实现,楼主可以联系我。
      

  6.   

    我用了  SetWindowLong(self.Handle,GWL_EXSTYLE,
         GetWindowLong(Self.Handle,GWL_EXSTYLE) xor $80000);
      SetLayeredWindowAttributes(Self.Handle,0,100,LWA_ALPHA);
    ,透明效果出来了。可是我想把它嵌入桌面,但一加上ParentWindow:=FindWindow('Progman',Nil);透明效果就没了,是怎么回事呢?
      

  7.   

    Windows.SetParent(Handle, FindWindow('Progman',Nil)); 这样试试
      

  8.   


    Form的BorderStyle设成bsnone, formstyle设成fsStayOnTop
    加一个圆角图unit Unit1;interfaceuses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      jpeg, ExtCtrls;const  WS_EX_LAYERED = $80000;
      AC_SRC_OVER = $0;
      AC_SRC_ALPHA = $1;
      AC_SRC_NO_PREMULT_ALPHA = $1;
      AC_SRC_NO_ALPHA = $2;
      AC_DST_NO_PREMULT_ALPHA = $10;
      AC_DST_NO_ALPHA = $20;
      LWA_COLORKEY = $1;
      LWA_ALPHA = $2;
      ULW_COLORKEY = $1;
      ULW_ALPHA = $2;
      ULW_OPAQUE = $4;type  TForm1 = class(TForm)
        Image1: TImage;
      procedure FormCreate(Sender: TObject);
      private
      { Private declarations }
      public
      { Public declarations }
      end;  function SetLayeredWindowAttributes(hwnd:HWND; crKey:Longint; bAlpha:byte; dwFlags:longint ):longint; stdcall; external user32;//º¯ÊýÉùÃ÷var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);var l:longint;begin
      l:=getWindowLong(Handle, GWL_EXSTYLE);
      l := l Or WS_EX_LAYERED;
      SetWindowLong (handle, GWL_EXSTYLE, l);
      SetLayeredWindowAttributes (handle, 0, 180, LWA_ALPHA);
    end;end.
      

  9.   

    效果图
    [image]
    http://beta.hi.csdn.net/attachment/200909/2/83329_1251865884RLrl.jpg
    [/image]
      

  10.   

    用GDI做吧。
    参考
    弄两张图片就搞定了
      

  11.   

    @liangqingzhi:我这样写的procedure TForm1.Edit1DblClick(Sender: TObject);
    begin
      Windows.SetParent(Handle, FindWindow('Progman',Nil));
    end;可是双击edit1控件后窗口就消失了。。
      

  12.   

    @mjp1234airen4385:用GDI不能用VCL吧。。
      

  13.   

    @dinoalex:谢谢您~但是我想实现嵌入桌面中应该怎么实现呢?
      

  14.   

    GDI和VCL有关系吗?
    VCL可以独立运行,GDI是微软的一套图形接口,
    在VCL中引入GDI可以美化界面。
    你的界面,就是两张图就好了。
    最多输出文字和一条线。
    gdi方法。
    //装入背景图
    BPBack := TGPImage.Create(AppPath + 'Resources\bg.png');
    graph := TGPGraphics.Create(BPBack);
    //装入前景图
    BPTemp := TGPImage.Create(AppPath + 'Resources\detail.png');      
    graph.DrawImage(BPTemp, RectData, 0, 0, BPTemp.GetWidth, BPTemp.GetHeight, UnitPixel);
    //绘制数据
    graph.DrawString('搜索内容', -1, FontData,
                     MakeRect(RectData.X, RectData.Y, RectData.Width, RectData.Height),
                     StringFormat, brush);
    //绘制线条
    graph.DrawLine(TGPPen.Create(MakeColor(255, 255, 255, 255), 2), RectData.X, RectData.Y + 3, RectData.Width, RectData.Height);
      

  15.   

    三方空件 lMd控件 可以
      

  16.   

     l:=getWindowLong(Handle, GWL_EXSTYLE);
      l := l Or WS_EX_LAYERED;
      SetWindowLong (handle, GWL_EXSTYLE, l);
      SetLayeredWindowAttributes (handle, 0, 180, LWA_ALPHA);
    这样设置后,窗体可实现半透明,之后再用GDI+将你的PNG图片画到窗体上,这样就可以半透明了,但是控件也一起透明掉,所以可以考虑用窗体叠加的办法,即,用一窗体做背景,另一窗体上放置控件....., 当然另一个窗体上需要设置透明色,同时要处理鼠标之类的消息以达到两个窗体间的同步
      

  17.   

    看看这个桌面程序 www.ahjoe.com/prodesk.asp
      

  18.   

    实现方法有局限,在WindowsVista和Windows7下嵌入不了桌面