Splshwnd.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:5k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1996 AO ROSNO                   }
  6. {         Copyright (c) 1997, 1998 Master-Bank          }
  7. {                                                       }
  8. {*******************************************************}
  9. unit SplshWnd;
  10. interface
  11. {$I RX.INC}
  12. uses SysUtils, {$IFDEF WIN32} Windows, {$ELSE} WinTypes, WinProcs, {$ENDIF}
  13.   Messages, Classes, Graphics, Controls, Forms, StdCtrls, ExtCtrls, 
  14.   Animate, VCLUtils;
  15. type
  16.   TSplashWindow = class(TForm)
  17.   private
  18.     { Private declarations }
  19.     FTextMessage: TLabel;
  20.     function GetMessageText: string;
  21.     procedure SetMessageText(const Value: string);
  22.   protected
  23.     procedure CreateParams(var Params: TCreateParams); override;
  24.   public
  25.     { Public declarations }
  26.     Image: TImage;
  27.     Animation: TAnimatedImage;
  28.     procedure CenterFor(Form: TCustomForm);
  29.     property MessageText: string read GetMessageText write SetMessageText;
  30.   end;
  31. function ShowSplashWindow(Graphic: TGraphic; const MsgText: string;
  32.   Animate: Boolean; AlignForm: TCustomForm): TSplashWindow;
  33. const
  34.   SplashStayOnTop: Boolean = True;  
  35. implementation
  36. uses MaxMin;
  37. const
  38.   defSplashHeight = 64;
  39.   defImageLeft = 16;
  40.   defImageTop = 16;
  41.   defTextWidth = 238;
  42.   defTextLeft = 56;
  43.   defTextRight = 16;
  44. function CreateSplashWindow: TSplashWindow;
  45. begin
  46. {$IFDEF CBUILDER}
  47.   Result := TSplashWindow.CreateNew(Application, 0);
  48. {$ELSE}
  49.   Result := TSplashWindow.CreateNew(Application);
  50. {$ENDIF}
  51.   with Result do begin
  52.     BorderIcons := [];
  53.     BorderStyle := bsNone;
  54.     if SplashStayOnTop then 
  55.       FormStyle := fsStayOnTop
  56.     else
  57.       FormStyle := fsNormal;
  58.     ClientHeight := defSplashHeight;
  59.     ClientWidth := defImageLeft + defTextRight + 32;
  60.     Enabled := False;
  61.     Font.Height := -11;
  62.     Font.Name := 'MS Sans Serif';
  63.     Font.Style := [];
  64.     Font.Color := clWindowText;
  65.     PixelsPerInch := 96;
  66.     Scaled := True;
  67.     Image := TImage.Create(Result);
  68.     Image.Parent := Result;
  69.     Image.Left := defImageLeft;
  70.     Image.Top := defImageTop;
  71.     Image.Width := 32;
  72.     Image.Height := 32;
  73.     Image.AutoSize := False;
  74.     Image.Stretch := True;
  75.     Image.Visible := False;
  76.     FTextMessage := TLabel.Create(Result);
  77.     FTextMessage.Parent := Result;
  78.     FTextMessage.Left := defTextLeft;
  79.     FTextMessage.Width := defTextWidth;
  80.     FTextMessage.AutoSize := False;
  81.     FTextMessage.Alignment := taCenter;
  82.     FTextMessage.WordWrap := True;
  83.     Animation := TAnimatedImage.Create(Result);
  84.     Animation.Parent := Result;
  85.     Animation.Left := defImageLeft;
  86.     Animation.Top := defImageTop;
  87.     Animation.Width := 32;
  88.     Animation.Height := 32;
  89.     Animation.Active := False;
  90.     Animation.AutoSize := False;
  91.     Animation.Stretch := True;
  92.     Animation.Visible := False;
  93.   end;
  94. end;
  95. function ShowSplashWindow(Graphic: TGraphic; const MsgText: string;
  96.   Animate: Boolean; AlignForm: TCustomForm): TSplashWindow;
  97. begin
  98.   Result := CreateSplashWindow;
  99.   with Result do begin
  100.     if Animate and (Graphic <> nil) then begin
  101.       Animation.Glyph := Graphic as TBitmap;
  102.       Animation.Visible := True;
  103. {$IFDEF RX_D3}
  104.       Animation.AsyncDrawing := True;
  105. {$ENDIF}
  106.       Animation.Active := True;
  107.     end
  108.     else if (Graphic <> nil) then begin
  109.       Image.Picture.Graphic := Graphic;
  110.       Image.Visible := True;
  111.     end
  112.     else begin
  113.       FTextMessage.Left := defImageLeft;
  114.     end;
  115.     FTextMessage.Caption := MsgText;
  116.     MessageText := MsgText;
  117.     CenterFor(AlignForm);
  118.     Show;
  119.     Update;
  120.   end;
  121. end;
  122. procedure TSplashWindow.CreateParams(var Params: TCreateParams);
  123. begin
  124.   inherited CreateParams(Params);
  125.   Params.Style := Params.Style or WS_DLGFRAME;
  126. end;
  127. function TSplashWindow.GetMessageText: string;
  128. begin
  129.   Result := FTextMessage.Caption;
  130. end;
  131. procedure TSplashWindow.SetMessageText(const Value: string);
  132. var
  133.   TextRect: TRect;
  134. {$IFNDEF WIN32}
  135.   C: array[0..255] of Char;
  136. {$ENDIF WIN32}
  137.   VertOff: Integer;
  138. begin
  139.   TextRect := Rect(FTextMessage.Left, 0, Max(Screen.Width div 2 - 64,
  140.     defTextWidth), 0);
  141.   DrawText(Canvas.Handle,
  142.     {$IFDEF WIN32} PChar(Value), {$ELSE} StrPCopy(C, Value), {$ENDIF WIN32}
  143.     -1, TextRect, DT_CALCRECT or DT_WORDBREAK);
  144.   VertOff := (ClientHeight div 2) - ((TextRect.Bottom - TextRect.Top) div 2);
  145.   if VertOff < 0 then VertOff := 10;
  146.   TextRect.Top := VertOff;
  147.   TextRect.Bottom := TextRect.Bottom + VertOff;
  148.   FTextMessage.BoundsRect := TextRect;
  149.   ClientWidth := Max(ClientWidth, TextRect.Right + defTextRight);
  150.   ClientHeight := Max(ClientHeight, VertOff * 2);
  151.   if Value <> FTextMessage.Caption then begin
  152.     FTextMessage.Caption := Value;
  153.     Update;
  154.   end;
  155. end;
  156. procedure TSplashWindow.CenterFor(Form: TCustomForm);
  157. var
  158.   NewLeft, NewTop: Integer;
  159.   DstRect: TRect;
  160. begin
  161.   if Form = nil then DstRect := Rect(0, 0, Screen.Width, Screen.Height)
  162.   else DstRect := Form.BoundsRect;
  163.   NewLeft := DstRect.Left + ((DstRect.Right - DstRect.Left) div 2) - (Width div 2);
  164.   NewTop := DstRect.Top + ((DstRect.Bottom - DstRect.Top) div 2) - (Height div 2);
  165.   SetBounds(NewLeft, NewTop, Width, Height);
  166. end;
  167. end.