請教如何製作不規則按鈕........ |
尚未結案
|
jojoboy
初階會員 發表:65 回覆:108 積分:34 註冊:2002-03-13 發送簡訊給我 |
請教各方前輩:
我想要將畫面上所製作的按鈕...呈現出圓型的形狀.......
經我努力後...真的是漫無頭緒......
我有找到以下的文章.......
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 發送簡訊給我 |
可以使用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 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
jojoboy
初階會員 發表:65 回覆:108 積分:34 註冊:2002-03-13 發送簡訊給我 |
剛剛前輩有提到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 發送簡訊給我 |
|
jojoboy
初階會員 發表:65 回覆:108 積分:34 註冊:2002-03-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |