我已经知道如何通过bmp图像来生成不规则窗体,但速度实在有些慢,而且使用BMP文件会使程序大小变大,窗体的大小还受图片大小限制。问:如何更有效的生成不规则窗体,能否不使用BMP文件?

解决方案 »

  1.   

    顺便再问一个问题:
    我的程序中的第二个窗体是手动创建的,不知如何手动释放其占用资源。创建(在一个按纽事件中):form2:=Tform2.create(application);用户对form2进行操作、数据传送完毕后便要释放其占用的资源,我在form2.close事件中加入:
    form2.free;运行后出错。这似乎可以理解,那么请问如何释放form2占用的资源呢?总不该是程序结束后才自动释放吧!
      

  2.   

    Up第二个问题:
    try
      form2:=Tform2.create(application);
      form2.Show;
    finally
      form2.Free;
    end;或:
    try
      form2:=Tform2.create(application);
      form2.ShowModal;
      form2.Free;
    except
      form2.Free;
    end;
      

  3.   

    行得通吗?
    我表示怀疑!
    而且我show了窗体后还要进行些操作才释放掉,这样子可以吗?
    free本身就有错,异常处理又Free,可以吗?
      

  4.   

    问题1:试试将合成后的rgn保存为二进制出数,用的时候直接加载
    问题2:不要在form2自身的事件里释放自己
      

  5.   

    try
      form2:=tform2.Create(self);
      form2.Showmodal ;
      finally
      freeandnil(form2);
      end;在form2 close事件中释放form2用到的动态资源
    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if assigned(list1) then freeandnil(list1);
    end;
      

  6.   

    只有动态生成的需要手工释放,如果你是在设计时拖上去的,那不用了,form释放时,那些空间可以自动释放
      

  7.   

    你没有看到大多数用BMP图片作为窗体的软件都不允许用户更改窗体的大小吗
      

  8.   

    但有的可以呀。
    例如:media player
      

  9.   

    http://www6.163.com/it/item/0,2186,5381,00.html
    文件很小,可以看看这个,我试了试,不知哪里不成功,如果谁做成功的话,讲讲吧
      

  10.   

    昏~~~完全可以不用代码实现的功能还要说的这么复杂。
    设定 TransparentColor=True。然后设置属性TransparentColorValue为某个图片的背景色。然后放一个Image,Align=alClient,设置Picture为指定的背景图片这样启动该窗体的时候,那个窗体的背景图片的背景色酒杯去掉了这样就形成了一个不规则窗体而不用一句代码。
      

  11.   

    如果不能移动就试试截获系统消息wm_nchittest
      

  12.   

    Win98下面不支持TransparentColor~使用一张标记图片,很好做了
      

  13.   

    我要,我要!!!
    我要,我要!!!我要,我要!!!我要,我要!!!
    我要,我要!!!
    我要,我要!!!
    我要,我要!!![email protected]
    太感谢了
      

  14.   

    用API函数在DELPHI中实现“非典型”窗体
    用API函数在DELPHI中实现“非典型”窗体
        现在的一些共享软件特别是一些多媒体播放器软件为了吸引用户,很注重程序界面的设计。实际上,我们使用API函数也可以实现那些好看又另类的效果。
        1.异形窗体
        窗体只能是方的吗?不是,还可以有其他形状。这要用到两个Win32 API函数。首先用CreateRoundRectRgn()函数在窗体内界定一个椭圆形区域。这里所指的区域(region)是一个特殊的API对象,我们可以在区域内部进行填充和剪裁等操作,从而定义窗体的外部特征。然后调用SetWindowRgn()函数绘制,更进一步还可以再用CombineRgn()函数来合并多个区域,例如在Delphi的单元文件中加入以下代码:
        procedure TForm1.FormCreate(Sender: TObject);
        var
          FRegion1:THandle;
          FRegion2:THandle;
        begin
          FRegion1:=CreateRoundRectRgn(20,20,200,200,300,300);//界定一个椭圆区域
          FRegion2:=CreateRectRgn(170,170,400,400);//界定一个矩形区域
          CombineRgn(FRegion1,FRegion1,FRegion2,RGN_OR);//将两个区域连接起来
          SetwindowRgn(handle,FRegion1,True);//对连接后的区域进行绘制
        end;
        程序段中的CreateRoundRectRgn()函数用来创建一个圆角矩形区域,它的原型为:
        HRGN CreateRoundRectRgn(
        int nLeftRect, // 左上角的X坐标 
        int nTopRect, // 左上角的Y坐标 
        int nRightRect, // 右下角的X坐标
        int nBottomRect, // 右下角的Y坐标
        int nWidthEllipse, //圆角所在椭圆的宽
        int nHeightEllipse  // 圆角所在椭圆的高 
        );
        其他图形如多边形、椭圆形等都有对应的API函数,它们的原型如下:
        HRGN CreateEllipticRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect)
        HRGN CreateEllipticRgnIndirect( CONST RECT *lprc)
        HRGN CreatePolygonRgn(CONST POINT *lppt,int cPoints, int fnPolyFillMode)
        HRGN CreatepolypolygonRgn(CONST POINT *lppt,CONST INT *lpPolyCounts,int nCount,int fnPolyFillMode)
        HRGN CreateRectRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect)
        HRGN CreateRectRgnIndirect(CONST RECT *lprc)
        以上函数的参数很好理解,用来说明图形内置矩形的坐标或指向该矩形。重点来看一下另外两个函数:
        函数原型:SetWindowRgn(
                  HWND hWnd,         //当前窗体的句柄
                  HRGN hRgn,          //当前区域的句柄 
                  BOOL bRedraw,      //重绘标志
                  )
        函数功能:该函数把已创建的区域的句柄作为参数传递给当前窗体的句柄,并在该区域范围内绘制窗体;
        函数原型:CombineRgn(
                  HRGN hrgnDest,  // 连接目的区域的句柄
                  HRGN hrgnSrc1,  // 第一个连接源区域的句柄 
                  HRGN hrgnSrc2,  // 第二个连接源区域的句柄 
                  int fnCombineMode  // 连接模式
                  ) 
        函数功能:该函数将两个区域合并为一个新的区域,其中连接模式可取以下值:
        参数值          作用
        RGN_AND         由区域1与区域2的共有部分即交集创建新的区域
        RGN_COPY        创建区域1的副本作为新的区域
        RGN_DIFF        连接属于区域1但不属于区域2的部分为新的区域
        RGN_OR          连接区域1和区域2的所有部分即并集
        RGN_XOR。     连接区域1和区域2的所有部分即并去掉共有部分
        2.空心窗体
        这种窗体的特点是好端端的一个窗体,中间被挖了一部分。例如在Delphi的单元文件中加入以下代码:
        procedure TForm1.FormCreate(Sender: TObject);
        var
          FRegion3:THandle;
        begin
          Canvas.Font.Name:='华文行楷';//设置字体 
          Canvas.Font.Size:=100;//设置字号
          BeginPath(Canvas.Handle); //得到vanvas上绘制的轮廓
          TextOut(form1.Canvas.Handle,0,20,'程序春秋',8);//将“程序春秋”四个字所占区域抠掉
          EndPath(Canvas.Handle);
          FRegion3:=PathToRegion(Canvas.Handle);//将以上区域赋给窗体
          SetwindowRgn(Handle,FRegion3,True);//开始绘制
        end;
        这里主要用到了三个API函数:
        函数原型:BOOL BeginPath(HDC hdc  //设备环境的句柄)
        函数功能:开始接收当前设备环境的路径轨迹;
        函数原型:BOOL EndPath(HDC hdc  //设备环境的句柄) 
        函数功能:停止接收并将已接收的路径轨迹赋给当前设备环境的句柄
        函数原型  BOOL TextOut(
                  HDC hdc, // handle of device context 
                  int nXStart, // 起始位置的X坐标  
                  int nYStart, // 起始位置的Y坐标 
                  LPCTSTR lpString, // 字符串地址
                  int cbString  //字符串所包含字符数(注意一个汉字占两个字符)
                  )
        函数功能:在指定位置绘制给定字符串。
      

  15.   

    我要!
    [email protected]
    太感谢了
      

  16.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormPaint(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
    //设置五角星区域顶点
    const
      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:409), (X:203;Y:334),
        (X:325;Y:409), (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:145), (X:1;Y:145),
        (X:124;Y:233), (X:79;Y:384), (X:199;Y:310),
        (X:320;Y:384), (X:273;Y:234),(X:396;Y:145),
        (X:244;Y:145), (X:199;Y:0));implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    //程序创建窗体时改变窗体外形为五角星
    var
      Rgn:HRGN;
    begin
      Rgn:= CreatePolygonRgn(RgnPoints, High(RgnPoints), ALTERNATE);
      //创建一个多边形的区域
      SetWindowRgn(Handle, Rgn, True);
      //绘制多边形窗体
      form1.color:=rgb(80,110,220);
      //设置窗体初始背景颜色
      SetWindowPos(Form1.Handle,HWND_TOPMOST,Form1.Left,Form1.Top,Form1.Width,Form1.Height,0);
      //使窗体始终保持在最前
    end;
    procedure TForm1.FormPaint(Sender: TObject);
    begin
      Canvas.Pen.Width := 1;
      //设定画笔大小
      Canvas.Polyline(LinePoints);
      //绘制多边形轮廓线
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      SetWindowPos(Form1.Handle,HWND_NOTOPMOST,Form1.Left,Form1.Top,Form1.Width,Form1.Height,0);
      //恢复窗体正常位置和显示属性
      form1.close;
      //关闭窗体
    end;
    end.
    看来来的有点迟了