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

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************************}
  2. {                                                                   }
  3. {       Almediadev Visual Component Library                         }
  4. {       BusinessSkinForm                                            }
  5. {       Version 2.90                                                }
  6. {                                                                   }
  7. {       Copyright (c) 2000-2004 Almediadev                          }
  8. {       ALL RIGHTS RESERVED                                         }
  9. {                                                                   }
  10. {       Home:  http://www.almdev.com                                }
  11. {       Support: support@almdev.com                                 }
  12. {                                                                   }
  13. {*******************************************************************}
  14. unit bsMessages;
  15. {$WARNINGS OFF}
  16. {$HINTS OFF}
  17. interface
  18. uses Windows, SysUtils, Messages, Classes, Graphics, Controls, Forms,
  19.      BusinessSkinForm, bsSkinData, bsSkinCtrls, ExtCtrls,
  20.      Dialogs;
  21. type
  22.   TbsMessageForm = class(TForm)
  23.   protected
  24.     procedure HelpButtonClick(Sender: TObject);
  25.   public
  26.     BSF: TbsBusinessSkinForm;
  27.     Message: TbsSkinStdLabel;
  28.     constructor Create(AOwner: TComponent); override;
  29.   end;
  30.   TbsSkinMessage = class(TComponent)
  31.   protected
  32.     FSD: TbsSkinData;
  33.     FCtrlFSD: TbsSkinData;
  34.     FButtonSkinDataName: String;
  35.     FMessageLabelSkinDataName: String;
  36.     FDefaultFont: TFont;
  37.     FDefaultButtonFont: TFont;
  38.     FAlphaBlend: Boolean;
  39.     FAlphaBlendAnimation: Boolean;
  40.     FAlphaBlendValue: Byte;
  41.     FUseSkinFont: Boolean;
  42.     procedure SetDefaultFont(Value: TFont);
  43.     procedure SetDefaultButtonFont(Value: TFont);
  44.     procedure Notification(AComponent: TComponent;  Operation: TOperation); override;
  45.   public
  46.     function MessageDlg(const Msg: string; DlgType: TMsgDlgType;
  47.       Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
  48.     constructor Create(AOwner: TComponent); override;
  49.     destructor Destroy; override;
  50.   published
  51.     property AlphaBlend: Boolean read FAlphaBlend write FAlphaBlend;
  52.     property AlphaBlendAnimation: Boolean
  53.       read FAlphaBlendAnimation write FAlphaBlendAnimation;
  54.     property AlphaBlendValue: Byte read FAlphaBlendValue write FAlphaBlendValue;
  55.     property SkinData: TbsSkinData read FSD write FSD;
  56.     property CtrlSkinData: TbsSkinData read FCtrlFSD write FCtrlFSD;
  57.     property ButtonSkinDataName: String
  58.       read FButtonSkinDataName write FButtonSkinDataName;
  59.     property MessageLabelSkinDataName: String
  60.       read FMessageLabelSkinDataName write FMessageLabelSkinDataName;
  61.     property DefaultFont: TFont read FDefaultFont write SetDefaultFont;
  62.     property DefaultButtonFont: TFont read FDefaultButtonFont write SetDefaultButtonFont;
  63.     property UseSkinFont: Boolean read FUseSkinFont write FUseSkinFont;
  64.   end;
  65. implementation
  66. Uses bsUtils, bsConst;
  67. var
  68.   ButtonNames: array[TMsgDlgBtn] of string = (
  69.     'Yes', 'No', 'OK', 'Cancel', 'Abort', 'Retry', 'Ignore', 'All', 'NoToAll',
  70.     'YesToAll', 'Help');
  71.   ButtonCaptions: array[TMsgDlgBtn] of string = (
  72.     BS_MSG_BTN_YES, BS_MSG_BTN_NO, BS_MSG_BTN_OK, BS_MSG_BTN_CANCEL, BS_MSG_BTN_ABORT,
  73.     BS_MSG_BTN_RETRY, BS_MSG_BTN_IGNORE, BS_MSG_BTN_ALL,
  74.     BS_MSG_BTN_NOTOALL, BS_MSG_BTN_YESTOALL, BS_MSG_BTN_HELP);
  75.   Captions: array[TMsgDlgType] of string = (BS_MSG_CAP_WARNING, BS_MSG_CAP_ERROR,
  76.     BS_MSG_CAP_INFORMATION, BS_MSG_CAP_CONFIRM, '');
  77.   ModalResults: array[TMsgDlgBtn] of Integer = (
  78.     mrYes, mrNo, mrOk, mrCancel, mrAbort, mrRetry, mrIgnore, mrAll, mrNoToAll,
  79.     mrYesToAll, 0);
  80.   IconIDs: array[TMsgDlgType] of PChar = (IDI_EXCLAMATION, IDI_HAND,
  81.     IDI_ASTERISK, IDI_QUESTION, nil);
  82. const
  83.    MSGFORMBUTTONWIDTH = 40;
  84. function GetButtonCaption(B: TMsgDlgBtn; ASkinData: TbsSkinData): String;
  85. begin
  86.   if (ASkinData <> nil) and (ASkinData.ResourceStrData <> nil)
  87.   then
  88.     case B of
  89.       mbYes: Result := ASkinData.ResourceStrData.GetResStr('MSG_BTN_YES');
  90.       mbNo: Result := ASkinData.ResourceStrData.GetResStr('MSG_BTN_NO');
  91.       mbOK: Result := ASkinData.ResourceStrData.GetResStr('MSG_BTN_OK');
  92.       mbCancel: Result := ASkinData.ResourceStrData.GetResStr('MSG_BTN_CANCEL');
  93.       mbAbort: Result := ASkinData.ResourceStrData.GetResStr('MSG_BTN_ABORT');
  94.       mbRetry: Result := ASkinData.ResourceStrData.GetResStr('BS_MSG_BTN_RETRY');
  95.       mbIgnore: Result := ASkinData.ResourceStrData.GetResStr('MSG_BTN_IGNORE');
  96.       mbAll: Result := ASkinData.ResourceStrData.GetResStr('MSG_BTN_ALL');
  97.       mbNoToAll: Result := ASkinData.ResourceStrData.GetResStr('MSG_BTN_NOTOALL');
  98.       mbYesToAll: Result := ASkinData.ResourceStrData.GetResStr('MSG_BTN_YESTOALL');
  99.       mbHelp: Result := ASkinData.ResourceStrData.GetResStr('MSG_BTN_HELP');
  100.     end
  101.   else
  102.     Result := ButtonCaptions[B];
  103. end;
  104. function GetMsgCaption(DT: TMsgDlgType; ASkinData: TbsSkinData): String;
  105. begin
  106.   if (ASkinData <> nil) and (ASkinData.ResourceStrData <> nil)
  107.   then
  108.     case DT of
  109.       mtWarning: Result := ASkinData.ResourceStrData.GetResStr('MSG_CAP_WARNING');
  110.       mtError: Result := ASkinData.ResourceStrData.GetResStr('MSG_CAP_ERROR');
  111.       mtInformation: Result := ASkinData.ResourceStrData.GetResStr('MSG_CAP_INFORMATION');
  112.       mtConfirmation: Result := ASkinData.ResourceStrData.GetResStr('MSG_CAP_CONFIRM');
  113.       mtCustom: Result := '';
  114.     end
  115.   else
  116.     Result := Captions[DT];
  117. end;
  118. function CreateMessageDialog(const Msg: string; DlgType: TMsgDlgType;
  119.   Buttons: TMsgDlgButtons; ASkinData, ACtrlSkinData: TbsSkinData;
  120.   AButtonSkinDataName: String;  AMessageLabelSkinDataName: String;
  121.   ADefaultFont: TFont; ADefaultButtonFont: TFont; AUseSkinFont: Boolean;
  122.   AAlphaBlend, AAlphaBlendAnimation: Boolean; AAlphaBlendValue: Byte): TbsMessageForm;
  123. var
  124.   BI, ButtonWidth,
  125.   ButtonHeight, ButtonSpacing, ButtonCount, ButtonGroupWidth, X, Y: Integer;
  126.   B, DefaultButton, CancelButton: TMsgDlgBtn;
  127.   IconID: PChar;
  128. begin
  129.   Result := TbsMessageForm.Create(Application);
  130.   with Result do
  131.   begin
  132.     with BSF do
  133.     begin
  134.       SkinData := ASkinData;
  135.       MenusSkinData := ACtrlSkinData;
  136.       AlphaBlend := AAlphaBlend;
  137.       AlphaBlendAnimation := AAlphaBlendAnimation;
  138.       AlphaBlendValue := AAlphaBlendValue;
  139.     end;
  140.     ButtonWidth := 60;
  141.     //
  142.     if (ACtrlSkinData <> nil) and (not ACtrlSkinData.Empty)
  143.     then
  144.       begin
  145.         BI := ACtrlSkinData.GetControlIndex(AButtonSkinDataName);
  146.         if (BI <> -1) and
  147.            (TbsDataSkinControl(ACtrlSkinData.CtrlList.Items[BI]) is TbsDataSkinButtonControl)
  148.         then
  149.           begin
  150.             with TbsDataSkinButtonControl(ACtrlSkinData.CtrlList.Items[BI]) do
  151.              ButtonHeight := SkinRect.Bottom - SkinRect.Top;
  152.           end
  153.         else
  154.           ButtonHeight := 25;
  155.       end
  156.     else
  157.       ButtonHeight := 25;
  158.     //
  159.     ButtonSpacing := 10;
  160.     ButtonCount := 0;
  161.     for B := Low(TMsgDlgBtn) to High(TMsgDlgBtn) do
  162.       if B in Buttons then Inc(ButtonCount);
  163.     ButtonGroupWidth := 0;
  164.     if ButtonCount <> 0 then
  165.       ButtonGroupWidth := ButtonWidth * ButtonCount +
  166.         ButtonSpacing * (ButtonCount - 1);
  167.     Left := (Screen.Width div 2) - (Width div 2);
  168.     Top := (Screen.Height div 2) - (Height div 2);
  169.     if DlgType <> mtCustom
  170.     then Caption := GetMsgCaption(DlgType, ACtrlSkinData)
  171.     else Caption := Application.Title;
  172.     // add label
  173.     Result.Message := TbsSkinStdLabel.Create(Result);
  174.     with Result.Message do
  175.     begin
  176.       Font := ADefaultFont;
  177.       DefaultFont := ADefaultFont;
  178.       UseSkinFont := AUseSkinFont;
  179.       SkinDataName := AMessageLabelSkinDataName;
  180.       SkinData := ACtrlSkinData;
  181.       Name := 'Message';
  182.       Parent := Result;
  183.       AutoSize := True;
  184.       Caption := Msg;
  185.       Left := 50;
  186.       Top := 15;
  187.       X := Left + Width;
  188.     end;
  189.     IconID := IconIDs[DlgType];
  190.     with TImage.Create(Result) do
  191.       begin
  192.         Name := 'Image';
  193.         Parent := Result;
  194.         Picture.Icon.Handle := LoadIcon(0, IconID);
  195.         Y := Result.Message.Top + Result.Message.Height div 2 - 16;
  196.         if Y < 10 then Y := 10;
  197.         SetBounds(5, Y, 32, 32);
  198.       end;
  199.     ClientHeight := 50 + ButtonHeight + Result.Message.Height;
  200.     if ButtonGroupWidth < X
  201.     then
  202.       ClientWidth := X + 40
  203.     else
  204.       ClientWidth := ButtonGroupWidth + 40;
  205.     if Width > Result.BSF.GetMaxWidth
  206.     then
  207.       Width := Result.BSF.GetMaxWidth
  208.     else
  209.     if Width < Result.BSF.GetMinWidth
  210.     then
  211.       Width := Result.BSF.GetMinWidth;
  212.     // add buttons
  213.     if mbOk in Buttons then DefaultButton := mbOk else
  214.       if mbYes in Buttons then DefaultButton := mbYes else
  215.         DefaultButton := mbRetry;
  216.     if mbCancel in Buttons then CancelButton := mbCancel else
  217.       if mbNo in Buttons then CancelButton := mbNo else
  218.         CancelButton := mbOk;
  219.     X := (ClientWidth - ButtonGroupWidth) div 2;
  220.     for B := Low(TMsgDlgBtn) to High(TMsgDlgBtn) do
  221.       if B in Buttons then
  222.         with TbsSkinButton.Create(Result) do
  223.         begin
  224.           Parent := Result;
  225.           Name := ButtonNames[B];
  226.           CanFocused := True;
  227.           Caption := GetButtonCaption(B, ACtrlSkinData);
  228.           ModalResult := ModalResults[B];
  229.           if B = DefaultButton then Default := True;
  230.           if B = CancelButton then Cancel := True;
  231.           DefaultHeight := ButtonHeight;
  232.           SetBounds(X, Result.ClientHeight - ButtonHeight - 10,
  233.             ButtonWidth, ButtonHeight);
  234.           DefaultFont := ADefaultButtonFont;
  235.           UseSkinFont := AUseSkinFont;
  236.           Inc(X, ButtonWidth + ButtonSpacing);
  237.           if B = mbHelp then
  238.             OnClick := Result.HelpButtonClick;
  239.           SkinDataName := AButtonSkinDataName;
  240.           SkinData := ACtrlSkinData;
  241.         end;
  242.   end;
  243. end;
  244. constructor TbsMessageForm.Create(AOwner: TComponent);
  245. begin
  246.   inherited CreateNew(AOwner);
  247.   Position := poScreenCenter;
  248.   BorderStyle := bsDialog;
  249.   KeyPreview := True;
  250.   BSF := TbsBusinessSkinForm.Create(Self);
  251.   BSF.BorderIcons := [];
  252. end;
  253. procedure TbsMessageForm.HelpButtonClick(Sender: TObject);
  254. begin
  255.   Application.HelpContext(HelpContext);
  256. end;
  257. constructor TbsSkinMessage.Create;
  258. begin
  259.   inherited Create(AOwner);
  260.   FAlphaBlend := False;
  261.   FAlphaBlendAnimation := False;
  262.   FAlphaBlendValue := 200;
  263.   FButtonSkinDataName := 'button';
  264.   FMessageLabelSkinDataName := 'stdlabel';
  265.   FDefaultFont := TFont.Create;
  266.   FDefaultButtonFont := TFont.Create;
  267.   FUseSkinFont := True;
  268.   with FDefaultFont do
  269.   begin
  270.     Name := 'Arial';
  271.     Style := [];
  272.     Height := 14;
  273.   end;
  274.   with FDefaultButtonFont do
  275.   begin
  276.     Name := 'Arial';
  277.     Style := [];
  278.     Height := 14;
  279.   end;
  280. end;
  281. destructor TbsSkinMessage.Destroy;
  282. begin
  283.   FDefaultFont.Free;
  284.   FDefaultButtonFont.Free;
  285.   inherited;
  286. end;
  287. function TbsSkinMessage.MessageDlg;
  288. begin
  289.   with CreateMessageDialog(Msg, DlgType, Buttons,
  290.        FSD, FCtrlFSD, FButtonSkinDataName,
  291.        FMessageLabelSkinDataName, FDefaultFont, FDefaultButtonFont, FUseSkinFont,
  292.        FAlphaBlend, FAlphaBlendAnimation, FAlphaBlendValue) do
  293.   begin
  294.     try
  295.       Result := ShowModal;
  296.     finally
  297.       Free;
  298.     end;
  299.   end;
  300. end;
  301. procedure TbsSkinMessage.SetDefaultFont;
  302. begin
  303.   FDefaultFont.Assign(Value);
  304. end;
  305. procedure TbsSkinMessage.SetDefaultButtonFont;
  306. begin
  307.   FDefaultButtonFont.Assign(Value);
  308. end;
  309. procedure TbsSkinMessage.Notification;
  310. begin
  311.   inherited Notification(AComponent, Operation);
  312.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  313.   if (Operation = opRemove) and (AComponent = FCtrlFSD) then FCtrlFSD := nil;
  314. end;
  315. end.