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

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************************}
  2. {                                                                   }
  3. {       Almediadev Visual Component Library                         }
  4. {       DynamicSkinForm                                             }
  5. {       Version 5.60                                                }
  6. {                                                                   }
  7. {       Copyright (c) 2000-2003 Almediadev                          }
  8. {       ALL RIGHTS RESERVED                                         }
  9. {                                                                   }
  10. {       Home:  http://www.almdev.com                                }
  11. {       Support: support@almdev.com                                 }
  12. {                                                                   }
  13. {*******************************************************************}
  14. unit spMessages;
  15. interface
  16. uses Windows, SysUtils, Messages, Classes, Graphics, Controls, Forms,
  17.      DynamicSkinForm, SkinData, SkinCtrls, Dialogs, StdCtrls, ExtCtrls;
  18. type
  19.   TspMessageForm = class(TForm)
  20.   protected
  21.     procedure HelpButtonClick(Sender: TObject);
  22.   public
  23.     DSF: TspDynamicSkinForm;
  24.     Message: TspSkinStdLabel;
  25.     constructor Create(AOwner: TComponent); override;
  26.   end;
  27.   TspSkinMessage = class(TComponent)
  28.   protected
  29.     FSD: TspSkinData;
  30.     FCtrlFSD: TspSkinData;
  31.     FButtonSkinDataName: String;
  32.     FMessageLabelSkinDataName: String;
  33.     FDefaultFont: TFont;
  34.     FDefaultButtonFont: TFont;
  35.     FUseSkinFont: Boolean;
  36.     FAlphaBlend: Boolean;
  37.     FAlphaBlendAnimation: Boolean;
  38.     FAlphaBlendValue: Byte;
  39.     procedure SetDefaultFont(Value: TFont);
  40.     procedure SetDefaultButtonFont(Value: TFont);
  41.     procedure Notification(AComponent: TComponent;  Operation: TOperation); override;
  42.   public
  43.     function MessageDlg(const Msg: string; DlgType: TMsgDlgType;
  44.       Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
  45.     constructor Create(AOwner: TComponent); override;
  46.     destructor Destroy; override;
  47.   published
  48.     property AlphaBlend: Boolean read FAlphaBlend write FAlphaBlend;
  49.     property AlphaBlendAnimation: Boolean
  50.       read FAlphaBlendAnimation write FAlphaBlendAnimation;
  51.     property AlphaBlendValue: Byte read FAlphaBlendValue write FAlphaBlendValue;
  52.     property SkinData: TspSkinData read FSD write FSD;
  53.     property CtrlSkinData: TspSkinData read FCtrlFSD write FCtrlFSD;
  54.     property ButtonSkinDataName: String
  55.       read FButtonSkinDataName write FButtonSkinDataName;
  56.     property MessageLabelSkinDataName: String
  57.       read FMessageLabelSkinDataName write FMessageLabelSkinDataName;
  58.     property DefaultFont: TFont read FDefaultFont write SetDefaultFont;
  59.     property DefaultButtonFont: TFont read FDefaultButtonFont write SetDefaultButtonFont;
  60.     property UseSkinFont: Boolean read FUseSkinFont write FUseSkinFont;
  61.   end;
  62. implementation
  63.    Uses spConst;
  64. var
  65.   ButtonNames: array[TMsgDlgBtn] of string = (
  66.     'Yes', 'No', 'OK', 'Cancel', 'Abort', 'Retry', 'Ignore', 'All', 'NoToAll',
  67.     'YesToAll', 'Help');
  68.   ButtonCaptions: array[TMsgDlgBtn] of string = (
  69.     SP_MSG_BTN_YES, SP_MSG_BTN_NO, SP_MSG_BTN_OK, SP_MSG_BTN_CANCEL, SP_MSG_BTN_ABORT,
  70.     SP_MSG_BTN_RETRY, SP_MSG_BTN_IGNORE, SP_MSG_BTN_ALL,
  71.     SP_MSG_BTN_NOTOALL, SP_MSG_BTN_YESTOALL, SP_MSG_BTN_HELP);
  72.   Captions: array[TMsgDlgType] of string = (SP_MSG_CAP_WARNING, SP_MSG_CAP_ERROR,
  73.     SP_MSG_CAP_INFORMATION, SP_MSG_CAP_CONFIRM, '');
  74.   ModalResults: array[TMsgDlgBtn] of Integer = (
  75.     mrYes, mrNo, mrOk, mrCancel, mrAbort, mrRetry, mrIgnore, mrAll, mrNoToAll,
  76.     mrYesToAll, 0);
  77.   IconIDs: array[TMsgDlgType] of PChar = (IDI_EXCLAMATION, IDI_HAND,
  78.     IDI_ASTERISK, IDI_QUESTION, nil);
  79. const
  80.    MSGFORMBUTTONWIDTH = 40;
  81. function CreateMessageDialog(const Msg: string; DlgType: TMsgDlgType;
  82.   Buttons: TMsgDlgButtons; ASkinData, ACtrlSkinData: TspSkinData;
  83.   AButtonSkinDataName: String;  AMessageLabelSkinDataName: String;
  84.   ADefaultFont: TFont; ADefaultButtonFont: TFont; AUseSkinFont: Boolean;
  85.   AAlphaBlend, AAlphaBlendAnimation: Boolean; AAlphaBlendValue: Byte): TspMessageForm;
  86. var
  87.   BI, ButtonWidth,
  88.   ButtonHeight, ButtonSpacing, ButtonCount, ButtonGroupWidth, X, Y: Integer;
  89.   B, DefaultButton, CancelButton: TMsgDlgBtn;
  90.   IconID: PChar;
  91. begin
  92.   Result := TspMessageForm.Create(Application);
  93.   with Result do
  94.   begin
  95.     with DSF do
  96.     begin
  97.       SkinData := ASkinData;
  98.       MenusSkinData := ACtrlSkinData;
  99.       AlphaBlend := AAlphaBlend;
  100.       AlphaBlendAnimation := AAlphaBlendAnimation;
  101.       AlphaBlendValue := AAlphaBlendValue;
  102.     end;
  103.     ButtonWidth := 60;
  104.     //
  105.     if (ACtrlSkinData <> nil) and (not ACtrlSkinData.Empty)
  106.     then
  107.       begin
  108.         BI := ACtrlSkinData.GetControlIndex(AButtonSkinDataName);
  109.         if (BI <> -1) and
  110.            (TspDataSkinControl(ACtrlSkinData.CtrlList.Items[BI]) is TspDataSkinButtonControl)
  111.         then
  112.           begin
  113.             with TspDataSkinButtonControl(ACtrlSkinData.CtrlList.Items[BI]) do
  114.              ButtonHeight := SkinRect.Bottom - SkinRect.Top;
  115.           end
  116.         else
  117.           ButtonHeight := 25;
  118.       end
  119.     else
  120.       ButtonHeight := 25;
  121.     //
  122.     ButtonSpacing := 10;
  123.     ButtonCount := 0;
  124.     for B := Low(TMsgDlgBtn) to High(TMsgDlgBtn) do
  125.       if B in Buttons then Inc(ButtonCount);
  126.     ButtonGroupWidth := 0;
  127.     if ButtonCount <> 0 then
  128.       ButtonGroupWidth := ButtonWidth * ButtonCount +
  129.         ButtonSpacing * (ButtonCount - 1);
  130.     Left := (Screen.Width div 2) - (Width div 2);
  131.     Top := (Screen.Height div 2) - (Height div 2);
  132.     if DlgType <> mtCustom
  133.     then Caption := Captions[DlgType]
  134.     else Caption := Application.Title;
  135.     // add label
  136.     Result.Message := TspSkinStdLabel.Create(Result);
  137.     with Result.Message do
  138.     begin
  139.       Font := ADefaultFont;
  140.       DefaultFont := ADefaultFont;
  141.       UseSkinFont := AUseSkinFont;
  142.       SkinDataName := AMessageLabelSkinDataName;
  143.       SkinData := ACtrlSkinData;
  144.       Name := 'Message';
  145.       Parent := Result;
  146.       AutoSize := True;
  147.       Caption := Msg;
  148.       Left := 50;
  149.       Top := 15;
  150.       X := Left + Width;
  151.     end;
  152.     IconID := IconIDs[DlgType];
  153.     with TImage.Create(Result) do
  154.       begin
  155.         Name := 'Image';
  156.         Parent := Result;
  157.         Picture.Icon.Handle := LoadIcon(0, IconID);
  158.         Y := Result.Message.Top + Result.Message.Height div 2 - 16;
  159.         if Y < 10 then Y := 10;
  160.         SetBounds(5, Y, 32, 32);
  161.       end;
  162.     ClientHeight := 50 + ButtonHeight + Result.Message.Height;
  163.     if ButtonGroupWidth < X
  164.     then
  165.       ClientWidth := X + 40
  166.     else
  167.       ClientWidth := ButtonGroupWidth + 40;
  168.     if Width > Result.DSF.GetMaxWidth
  169.     then
  170.       Width := Result.DSF.GetMaxWidth
  171.     else
  172.     if Width < Result.DSF.GetMinWidth
  173.     then
  174.       Width := Result.DSF.GetMinWidth;
  175.     // add buttons
  176.     if mbOk in Buttons then DefaultButton := mbOk else
  177.       if mbYes in Buttons then DefaultButton := mbYes else
  178.         DefaultButton := mbRetry;
  179.     if mbCancel in Buttons then CancelButton := mbCancel else
  180.       if mbNo in Buttons then CancelButton := mbNo else
  181.         CancelButton := mbOk;
  182.     X := (ClientWidth - ButtonGroupWidth) div 2;
  183.     for B := Low(TMsgDlgBtn) to High(TMsgDlgBtn) do
  184.       if B in Buttons then
  185.         with TspSkinButton.Create(Result) do
  186.         begin
  187.           Parent := Result;
  188.           Name := ButtonNames[B];
  189.           CanFocused := True;
  190.           Caption := ButtonCaptions[B];
  191.           ModalResult := ModalResults[B];
  192.           if B = DefaultButton then Default := True;
  193.           if B = CancelButton then Cancel := True;
  194.           DefaultHeight := ButtonHeight;
  195.           SetBounds(X, Result.ClientHeight - ButtonHeight - 10,
  196.             ButtonWidth, ButtonHeight);
  197.           DefaultFont := ADefaultButtonFont;
  198.           UseSkinFont := AUseSkinFont;
  199.           Inc(X, ButtonWidth + ButtonSpacing);
  200.           if B = mbHelp then
  201.             OnClick := Result.HelpButtonClick;
  202.           SkinDataName := AButtonSkinDataName;
  203.           SkinData := ACtrlSkinData;
  204.         end;
  205.   end;
  206. end;
  207. constructor TspMessageForm.Create(AOwner: TComponent);
  208. begin
  209.   inherited CreateNew(AOwner);
  210.   Position := poScreenCenter;
  211.   BorderStyle := bsDialog;
  212.   KeyPreview := True;
  213.   DSF := TspDynamicSkinForm.Create(Self);
  214.   DSF.BorderIcons := [];
  215.   DSF.SizeAble := False;
  216. end;
  217. procedure TspMessageForm.HelpButtonClick(Sender: TObject);
  218. begin
  219.   Application.HelpContext(HelpContext);
  220. end;
  221. constructor TspSkinMessage.Create;
  222. begin
  223.   inherited Create(AOwner);
  224.   FAlphaBlend := False;
  225.   FAlphaBlendAnimation := False;
  226.   FAlphaBlendValue := 200;
  227.   FButtonSkinDataName := 'button';
  228.   FMessageLabelSkinDataName := 'stdlabel';
  229.   FDefaultFont := TFont.Create;
  230.   FDefaultButtonFont := TFont.Create;
  231.   FUseSkinFont := True;
  232.   with FDefaultFont do
  233.   begin
  234.     Name := 'Arial';
  235.     Style := [];
  236.     Height := 14;
  237.   end;
  238.   with FDefaultButtonFont do
  239.   begin
  240.     Name := 'Arial';
  241.     Style := [];
  242.     Height := 14;
  243.   end;
  244. end;
  245. destructor TspSkinMessage.Destroy;
  246. begin
  247.   FDefaultFont.Free;
  248.   FDefaultButtonFont.Free;
  249.   inherited;
  250. end;
  251. procedure TspSkinMessage.SetDefaultButtonFont;
  252. begin
  253.   FDefaultButtonFont.Assign(Value);
  254. end;
  255. function TspSkinMessage.MessageDlg;
  256. begin
  257.   with CreateMessageDialog(Msg, DlgType, Buttons,
  258.        FSD, FCtrlFSD, FButtonSkinDataName,
  259.        FMessageLabelSkinDataName, FDefaultFont, FDefaultButtonFont, FUseSkinFont,
  260.        FAlphaBlend, FAlphaBlendAnimation, FAlphaBlendValue) do
  261.     try
  262.       Result := ShowModal;
  263.     finally
  264.       Free;
  265.     end;
  266. end;
  267. procedure TspSkinMessage.SetDefaultFont;
  268. begin
  269.   FDefaultFont.Assign(Value);
  270. end;
  271. procedure TspSkinMessage.Notification;
  272. begin
  273.   inherited Notification(AComponent, Operation);
  274.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  275.   if (Operation = opRemove) and (AComponent = FCtrlFSD) then FCtrlFSD := nil;
  276. end;
  277. end.