Frame.pas
上传用户:fh681027
上传日期:2022-07-23
资源大小:1959k
文件大小:4k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit Frame;
  2. interface
  3. uses
  4.   Windows, Classes, Graphics, Forms, Messages,
  5.   Controls, Child, Child2, Menus, SysUtils, Dialogs,
  6.   ExtCtrls, StdActns, ActnList;
  7. type
  8.   TMainForm = class(TForm)
  9.     MainMenu1: TMainMenu;
  10.     Window1: TMenuItem;
  11.     New1: TMenuItem;
  12.     File1: TMenuItem;
  13.     N1: TMenuItem;
  14.     Exit1: TMenuItem;
  15.     Cascade1: TMenuItem;
  16.     Tile1: TMenuItem;
  17.     ArrangeIcons1: TMenuItem;
  18.     New2: TMenuItem;
  19.     Tile2: TMenuItem;
  20.     CloseAll1: TMenuItem;
  21.     Count1: TMenuItem;
  22.     Image1: TImage;
  23.     ActionList1: TActionList;
  24.     WindowArrange1: TWindowArrange;
  25.     WindowCascade1: TWindowCascade;
  26.     WindowClose1: TWindowClose;
  27.     WindowMinimizeAll1: TWindowMinimizeAll;
  28.     WindowTileHorizontal1: TWindowTileHorizontal;
  29.     WindowTileVertical1: TWindowTileVertical;
  30.     Close1: TMenuItem;
  31.     MinimizeAll1: TMenuItem;
  32.     N2: TMenuItem;
  33.     procedure New1Click(Sender: TObject);
  34.     procedure Exit1Click(Sender: TObject);
  35.     procedure New2Click(Sender: TObject);
  36.     procedure CloseAll1Click(Sender: TObject);
  37.     procedure Count1Click(Sender: TObject);
  38.     procedure FormCreate(Sender: TObject);
  39.     procedure FormDestroy(Sender: TObject);
  40.   private
  41.     { Private declarations }
  42.     Count: Integer;
  43.     OutCanvas: TCanvas;
  44.     OldWinProc, NewWinProc: Pointer;
  45.     procedure NewWinProcedure (var Msg: TMessage);
  46.   public
  47.     { Public declarations }
  48.   end;
  49. var
  50.   MainForm: TMainForm;
  51. implementation
  52. {$R *.DFM}
  53. procedure TMainForm.New1Click(Sender: TObject);
  54. var
  55.   ChildForm: TCircleChildForm;
  56. begin
  57.   Inc (Count);
  58.   ChildForm := TCircleChildForm.Create (Self);
  59.   ChildForm.Caption := ChildForm.Caption + ' ' +
  60.     IntToStr (Count);
  61.   ChildForm.Show;
  62. end;
  63. procedure TMainForm.Exit1Click(Sender: TObject);
  64. begin
  65.   Close;
  66. end;
  67. procedure TMainForm.New2Click(Sender: TObject);
  68. var
  69.   ChildForm: TBounceChildForm;
  70. begin
  71.   Inc (Count);
  72.   ChildForm := TBounceChildForm.Create (Self);
  73.   ChildForm.Caption := ChildForm.Caption + ' ' +
  74.     IntToStr (Count);
  75.   ChildForm.Show;
  76. end;
  77. procedure TMainForm.CloseAll1Click(Sender: TObject);
  78. var
  79.   I: Integer;
  80. begin
  81.   for I := 0 to MDIChildCount - 1 do
  82.     MDIChildren [I].Close;
  83. end;
  84. procedure TMainForm.Count1Click(Sender: TObject);
  85. var
  86.   NBounce, NCircle, I: Integer;
  87. begin
  88.   NBounce := 0;
  89.   NCircle := 0;
  90.   for I := 0 to MDIChildCount - 1 do
  91.     if MDIChildren [I] is TBounceChildForm then
  92.       Inc (NBounce)
  93.     else
  94.       Inc (NCircle);
  95.   MessageDlg (
  96.     Format ('There are %d child forms.'#13 +
  97.       '%d are Circle child windows and ' +
  98.       '%d are Bouncing child windows',
  99.       [MDIChildCount, NCircle, NBounce]),
  100.     mtINformation, [mbOk], 0);
  101. end;
  102. procedure TMainForm.FormCreate(Sender: TObject);
  103. begin
  104.   NewWinProc := MakeObjectInstance (NewWinProcedure);
  105.   OldWinProc := Pointer (SetWindowLong (
  106.     ClientHandle, gwl_WndProc, Cardinal (NewWinProc)));
  107.   OutCanvas := TCanvas.Create;
  108. end;
  109. procedure TMainForm.NewWinProcedure (var Msg: TMessage);
  110. var
  111.   BmpWidth, BmpHeight: Integer;
  112.   I, J: Integer;
  113. begin
  114.   // default processing first
  115.   Msg.Result := CallWindowProc (OldWinProc,
  116.     ClientHandle, Msg.Msg, Msg.wParam, Msg.lParam);
  117.   // handle background repaint
  118.   if Msg.Msg = wm_EraseBkgnd then
  119.   begin
  120.     BmpWidth := MainForm.Image1.Width;
  121.     BmpHeight := MainForm.Image1.Height;
  122.     if (BmpWidth <> 0) and (BmpHeight <> 0) then
  123.     begin
  124.       OutCanvas.Handle := Msg.wParam;
  125.       for I := 0 to MainForm.ClientWidth div BmpWidth do
  126.         for J := 0 to MainForm.ClientHeight div BmpHeight do
  127.           OutCanvas.Draw (I * BmpWidth,
  128.             J * BmpHeight, MainForm.Image1.Picture.Graphic);
  129.     end;
  130.   end;
  131. end;
  132. procedure TMainForm.FormDestroy(Sender: TObject);
  133. begin
  134.   OutCanvas.Free;
  135. end;
  136. end.