線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2405
推到 Plurk!
推到 Facebook!

請教如何製作不規則按鈕........

尚未結案
jojoboy
初階會員


發表:65
回覆:108
積分:34
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-10 15:34:47 IP:61.220.xxx.xxx 未訂閱
請教各方前輩: 我想要將畫面上所製作的按鈕...呈現出圓型的形狀....... 經我努力後...真的是漫無頭緒...... 我有找到以下的文章....... http://forum.vclxx.org/topic.php?TOPIC_ID=23308&FORUM_ID=14&CAT_ID=3&Topic_Title=¡i¤ɡj¦b BCB ¤¤³Ыؤ£³W«h§Ϊ¬«ö¶s&Forum_Title=VCL 但..這是BCB的文章..而我是使用D5的...我..我看不太懂..無法將其翻成DELPHI的語法...... 所以想請教各方前輩...... 可否提供相關的方法供我研究...... Thanks
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-10 16:04:40 IP:210.61.xxx.xxx 未訂閱
可以使用CreateRectRgn api, 參考forum所提的辦法    不過如果您急著用, 以下可以讓您先套著用 (這一段是我在某個網路找到元件節錄出來的, 速度較快)    
procedure TForm1.Button1Click(Sender: TObject);
var region:THandle;
  function CreateBitmapRgn(Bitmap: TBitmap; TransparentColor: TColor): HRgn;
  var
    BitmapMask: TBitmap;
    RectList: TList;
    RgnData: PRgnData;
    I, Size: Integer;
    Rects: PRect;
      procedure FindRegionRectangles;
      var
        Mask: Byte;
        B: PByteArray;
        X, Y, Left, Right: Integer;
        ScanlineBytes, I: Integer;
        PR: PRect;
      begin
        B := BitmapMask.Scanline[0];
        ScanlineBytes := Integer(BitmapMask.Scanline[1]) - Integer(B);
        for Y := 0 to BitmapMask.Height-1 do
        begin
          Left := 0;
          Right := -1;
          I := 0;
          Mask := $80;
          for X := 0 to BitmapMask.Width-1 do
          begin
            if (Mask and B[I]) <> 0 then
            begin
              if Right >= Left then
              begin
                New(PR);
                PR^.Left := Left;
                PR^.Top := Y;
                PR^.Right := Right 1;
                PR^.Bottom := Y 1;
                RectList.Add(PR);
              end;
              Left := Right 2;
            end;
            Inc(Right);
            Mask := Mask shr 1;
            if Mask = 0 then
            begin
              Inc(I);
              Mask := $80;
            end;
          end;
          if Right >= Left then
          begin
            New(PR);
            PR^.Left := Left;
            PR^.Top := Y;
            PR^.Right := Right 1;
            PR^.Bottom := Y 1;
            RectList.Add(PR);
          end;
          Inc(Integer(B), ScanlineBytes);
        end;
      end;        begin
      RectList := TList.Create;
      BitmapMask := TBitmap.Create;
      try
        BitmapMask.Assign(Bitmap);
        BitmapMask.Mask(TransparentColor);
        BitmapMask.PixelFormat := pf1bit;
        FindRegionRectangles;
        Size := SizeOf(TRgnData)   (RectList.Count * SizeOf(TRect));
        GetMem(RgnData, Size);
        try
          with RgnData^.rdh do
          begin
            dwSize := SizeOf(TRgnDataHeader);
            iType := RDH_RECTANGLES;
            nCount := RectList.Count;
            nRgnSize := SizeOf(TRect);
            rcBound := Rect(0, 0, Bitmap.Width-1, Bitmap.Height-1);
          end;
          Rects := PRect(@RgnData^.Buffer);
          for I := 0 to RectList.Count-1 do
          begin
            Rects^ := PRect(RectList.Items[I])^;
            Dispose(PRect(RectList.Items[I]));
            Inc(Rects);
          end;
          Result := ExtCreateRegion(nil, Size, RgnData^)
        finally
          FreeMem(RgnData, Size);
        end;
      finally
        BitmapMask.Free;
        RectList.Free;
      end;
    end;
begin
  Height:=Image1.Height;
  Width:=Image1.Width;
  region:=CreateBitmapRgn(Image1.Picture.Bitmap,clBlack);
//  OffsetRgn(region,-1,12);
  SetWindowRgn(Button1.Handle,region,True);
//  bDrawRegion:=True;
end;
發表人 - pedro 於 2004/02/10 16:12:02
jojoboy
初階會員


發表:65
回覆:108
積分:34
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-10 16:26:42 IP:61.220.xxx.xxx 未訂閱
雖然有點看不懂....... 至少這是DELPHI的語法.....我會努力研究的 謝謝前輩的幫忙.......
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-10 17:35:27 IP:202.39.xxx.xxx 未訂閱
參考 Custom Shaped Buttons in Delphi: http://www.edgequest.com/Development/DelphiArtPerry.htm    --- Everything I say is a lie. --<-<-<@ 發表人 - hagar 於 2004/02/10 17:37:09
jojoboy
初階會員


發表:65
回覆:108
積分:34
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-10 17:37:25 IP:61.220.xxx.xxx 未訂閱
剛剛前輩有提到CreateRectRgn這個Key Word....... 我試著用這個方法去處理了....... 雖然形狀有改變了......但.......好像怪怪的........ 不知道原因出在那............ 以下是我實作的程式碼......望前輩有空時看看...... procedure Tmain.Button1Click(Sender: TObject); var Region1, Region2 : THandle; begin Region1:=Button1.Handle; Region2:=Button1.Handle; Region1 := CreateRoundRectRgn(20,20,200,200,300,300);// Region2 := CreateRectRgn(170,170,400,400); CombineRgn(Region1,Region1,Region2,RGN_OR); SetWindowRgn(Button1.Handle, Region1, True ); end;
jojoboy
初階會員


發表:65
回覆:108
積分:34
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-10 17:50:33 IP:61.220.xxx.xxx 未訂閱
啊.......我知道錯在那了........ 是我座標設錯了....... 努力研究中....... 待有結果時,再與各位分享
jojoboy
初階會員


發表:65
回覆:108
積分:34
註冊:2002-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-02-11 11:04:38 IP:61.220.xxx.xxx 未訂閱
搞定了...........改用這個方式 var Region1 : THandle; begin //CreateEllipticRgn(現在物件左上角X,現在物件左上角Y,寬度,高度); Region1:=Button1.Handle; Region1 := CreateEllipticRgn(4,4,Button1.Width-4,Button1.Height-4); SetWindowRgn(Button1.Handle, Region1, True ); end;
系統時間:2024-04-28 7:15:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!