全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1215
推到 Plurk!
推到 Facebook!

请教各位大大,怎么实现如下效果的窗口?

尚未結案
whoawho
一般會員


發表:13
回覆:18
積分:6
註冊:2004-03-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-12 08:27:46 IP:61.51.xxx.xxx 未訂閱
用一个PNG的图像文件,带阴影效果,来做窗口界面,怎么才能实现其应有的透明? 突然嘴笨,有点说不清楚,大家看下面图片的效果。 图片中的窗口只是示例,本来的窗口倒不是这样简单。 求各位出招指点了。 發表人 - whoawho 於 2005/04/12 10:34:45
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-12 12:00:05 IP:221.226.xxx.xxx 未訂閱
方法一:在WINDOWS 2000以上平台,可以利用WINDOWS自带的透明特性,不写代码获得透明不规则窗口。    不用代码实现窗体和图像的双重透明,方法如下:    首先新建一个工程,然后放一个Image控件,并调入一个图片,将Autosize属性设定为True,将窗口的AutoSize、OldCreateOrder、TransparentColor也设定为True,再将窗口的TransparentColorValue设定为图片的背景色。最后把窗口的BorderStyle设置成BsNone,就是异形的透明窗口了。    方法二:这个方法适用与所有WINDOWS平台,包括9X系统。
//必须引用ExtCtrls单元;
{
在窗口上放上你做好的图片。    将该函数放到
    FormResize
    FormCreate
中即可。
}    procedure SetformTransparent;
var
  I: Integer;
  FullRgn,
  ClientRgn,
  ControlRgn: THandle;
  Margin,
  MarginX,
  MarginY,
  X,
  Y: Integer;
  W,H,S :Integer;
  bX,bY :Integer; 
  c     :TColor; 
begin
  Margin := (Width - ClientWidth) div 2; 
  FullRgn := CreateRectRgn(0, 0, Width, Height); 
  MarginX := Margin;
  MarginY := Height - ClientHeight - Margin;
  ClientRgn := CreateRectRgn(MarginX, MarginY, MarginX   ClientWidth, MarginY   ClientHeight); 
  CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF); 
  DeleteObject(ClientRgn); 
  for I:=0 to ControlCount-1 do
  begin
    X := MarginX   Controls[I].Left;
    Y := MarginY   Controls[I].Top;
    W:=Controls[I].Width;
    H:=Controls[I].Height;
    if controls[i] is timage then begin
      with controls[i] as tImage do begin
        c:=Picture.Bitmap.Canvas.Pixels[0,0];
        for bX:=0 to Picture.Bitmap.Width-1 do begin
          for bY:=0 to Picture.Bitmap.Height-1 do begin
            if Picture.Bitmap.Canvas.Pixels[bX,bY]<>c then begin
              ControlRgn := CreateRectRgn(X bX, Y bY, X   bX 1, Y   bY 1);
              CombineRgn(FullRgn, FullRgn, ControlRgn, RGN_OR);
              DeleteObject(ControlRgn);
            end;
          end;
        end;
      end;
    end else
    if controls[i] is tShape then begin
      if W < H then S := W else S := H; 
      if (Controls[i] as tshape).Shape in [stSquare, stRoundSquare, stCircle] then
      begin 
        Inc(X, (W - S) div 2); 
        Inc(Y, (H - S) div 2); 
        W := S;
        H := S; 
      end;
      Inc(W); Inc(H); Inc(S); 
      case (controls[i] as tshape).Shape of
        stRectangle, stSquare: 
          ControlRgn := CreateRectRgn(X, Y, X   W, Y   H); 
        stRoundRect, stRoundSquare: 
          ControlRgn := CreateRoundRectRgn(X, Y, X   W, Y   H, S div 4, S div 4);
        stCircle, stEllipse: 
          ControlRgn:=CreateEllipticRgn(X, Y, X   W, Y   H); 
      else 
        ControlRgn := CreateRectRgn(X, Y, X   W, Y   H);
      end; 
      CombineRgn(FullRgn, FullRgn, ControlRgn, RGN_OR);
      DeleteObject(ControlRgn);
    end else
    begin
      ControlRgn := CreateRectRgn(X, Y, X   W, Y   H);
      CombineRgn(FullRgn, FullRgn, ControlRgn, RGN_OR);
      DeleteObject(ControlRgn);
    end;
  end;
  SetWindowRgn(Handle, FullRgn, True);
  DeleteObject(FullRgn);
end;
还有就是用控件了,这种控件太多了,去网上搜索一下吧。 發表人 - Vicen 於 2005/04/12 12:05:21
whoawho
一般會員


發表:13
回覆:18
積分:6
註冊:2004-03-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-12 19:05:06 IP:61.51.xxx.xxx 未訂閱
谢谢Vicen:),那是单色透明的办法。 我在寻求如上图中的表达方式,一张已经存在并将作为窗口样式的图片中,有不同的Alpha区域,怎样将其完整的展现来实现如图所示的窗口。
whoawho
一般會員


發表:13
回覆:18
積分:6
註冊:2004-03-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-14 22:36:57 IP:61.51.xxx.xxx 未訂閱
已经找到解决问题的办法了。
系統時間:2024-07-07 12:46:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!