程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> DELPHI中利用API函數實現多態FORM(3)

DELPHI中利用API函數實現多態FORM(3)

編輯:Delphi

以下將測試的FORM的整個源代碼列出,在FORM上添加了四個按鈕分別控制實 現:橢圓形,圓角矩形,等邊多邊形和星形;一個Tpanel控件為了演示 TWINcontrol類的後裔的區域定義和控制;一個SpinEdit控件定義多邊形和星形 的頂點連接數目。

源程序:

  unit form_statue;
   interface
   uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   StdCtrls, ExtCtrls, Spin;
   type
   TForm1 = class(TForm)
     Button1: TButton;
     SpinEdit1: TSpinEdit;
     Panel1: TPanel;
     Button2: TButton;
     Button3: TButton;
     Button4: TButton;
   procedure DrawRndRectRegion(wnd : HWND; rect : TRect);
   procedure DrawEllipticRegion(wnd : HWND; rect : TRect);
   procedure DrawPolygonRegion(wnd : HWND; rect : TRect; NumPoints : Integer; DOStarShape : Boolean);
     procedure Button1Click(Sender: TObject);
     procedure Button4Click(Sender: TObject);
     procedure Button3Click(Sender: TObject);
     procedure Button2Click(Sender: TObject);
   private
     { Private declarations }
     rgn : HRGN;
     rect : TRect;
   public
     { Public declarations }
   end;
   var
   Form1: TForm1;
   implementation
   {$R *.DFM}
   procedure TForm1.DrawRndRectRegion(wnd : HWND; rect : TRect);
   begin
   rgn := CreateRoundRectRgn(rect.left, rect.top, rect.right, rect.bottom, 30, 30);
   SetWindowRgn(wnd, rgn, TRUE);
   end;
   procedure TForm1.DrawEllipticRegion(wnd : HWND; rect : TRect);
   begin
   rgn := CreateEllipticRgn(rect.left, rect.top, rect.right, rect.bottom);
   SetWindowRgn(wnd, rgn, TRUE);
   end;
   procedure TForm1.DrawPolygonRegion(wnd : HWND; rect : TRect; NumPoints : Integer; DOStarShape : Boolean);
   const
   RadConvert = PI/180;
   Degrees  = 360;
   MaxLines = 100;
   var
   x, y,
   xCenter,
   yCenter,
   radius,
   pts,
   I   : Integer;
   angle,
   rotation: Extended;
   arPts : Array[0..MaxLines] of TPoint;
   begin
   xCenter := (rect.Right - rect.Left) div 2;
   yCenter := (rect.Bottom - rect.Top) div 2;
   if DOStarShape then
     begin
     rotation := Degrees/(2*NumPoints);
     pts := 2 * NumPoints;
     end
     else
     begin
   rotation := Degrees/NumPoints; //得到每個頂點的度數
   pts := NumPoints ;
     end;
   radius := yCenter;
   for I := 0 to pts - 1 do begin
     if DOStarShape then
     if (I mod 2) = 0 then
       radius := Round(radius/2)
     else
       radius := yCenter;
     angle := ((I * rotation) + 90) * RadConvert;
     x := xCenter + Round(cos(angle) * radius);
     y := yCenter - Round(sin(angle) * radius);
     arPts[I].X := x;
     arPts[I].Y := y;
   end;
   rgn := CreatePolygonRgn(arPts, pts, WINDING);
   SetWindowRgn(wnd, rgn, TRUE);
   end;
   procedure TForm1.Button1Click(Sender: TObject);
   begin
   DrawRndRectRegion(Form1.Handle, Form1.ClIEntRect);
   end;
   procedure TForm1.Button4Click(Sender: TObject);
   begin
   DrawPolygonRegion(Panel1.Handle, Panel1.BoundsRect, SpinEdit1.Value, True);
   end;
   procedure TForm1.Button3Click(Sender: TObject);
   begin
   DrawEllipticRegion(Form1.Handle, Form1.ClIEntRect);
   end;
   procedure TForm1.Button2Click(Sender: TObject);
   begin
   DrawPolygonRegion(Panel1.Handle, Panel1.BoundsRect, SpinEdit1.Value, False);
   end;
   end.

源程序在PWIN98+Delphi5環境下調試成功,可以直接引用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved