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

Delphi控件源码

开发平台:

Delphi

  1. unit MsgFrm;
  2. interface
  3. uses
  4.   Windows, Messages,SysUtils,Dialogs, Variants, Classes, Graphics, Forms, StdCtrls, ExtCtrls, ImgList, Controls,RealMessengerUnit,
  5.   BusinessSkinForm;
  6. type
  7.   TMsgForm = class(TForm)
  8.     lblMsg: TLabel;
  9.     lblTitle: TLabel;
  10.     Image1: TImage;
  11.     ImageList1: TImageList;
  12.     bsBusinessSkinForm1: TbsBusinessSkinForm;
  13.     procedure WMEraseBkgnd(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND;
  14.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  15.     procedure FormDestroy(Sender: TObject);
  16.     procedure FormClick(Sender: TObject);
  17.   protected
  18.     procedure DrawBk;
  19.     procedure CreateParams(var Params: TCreateParams); override;
  20.   private
  21.     iFlag:Integer;
  22.     iTop:integer;
  23.     AutoClose:boolean;
  24.     Bmp: TBitmap;
  25.     InDraw: Boolean;
  26.     ThreadHandle:THandle;
  27.   public
  28.   end;
  29.   TMsgKind = (mkInfo , mkError);
  30. {显示右下角的提示窗口}
  31. procedure ShowAlert(const title,Info: string;needAutoClose:boolean = true;MsgKind:TMsgKind = mkInfo);
  32. var
  33.   MsgFormList: TList;
  34. implementation
  35. {$R *.dfm}
  36. {使提示窗口从屏幕下方滑出}
  37. function ThreadFunc(Info: Pointer): Integer; stdcall;
  38. var
  39.   Form:TMsgForm;
  40. begin
  41. try
  42.   Form:=TMsgForm(Info);
  43.   with Form do
  44.   begin
  45.     while iFlag>=0 do
  46.     begin
  47.       iTop:=Top;
  48.       if iFlag=0 then begin
  49.         if Top>(Screen.WorkAreaHeight-Height) then begin
  50.           Dec(iTop,15);
  51.           Top:=iTop;
  52.         end else begin
  53.           Inc(iFlag);
  54.         end;
  55.       end
  56.       else if iFlag=1 then begin
  57.         if AutoClose then
  58.         begin
  59.           sleep(8000);
  60.           Inc(iFlag);
  61.         end
  62.         else
  63.           break;
  64.       end
  65.       else if iFlag=2 then begin
  66.         if Top<Screen.WorkAreaHeight then begin
  67.            Inc(iTop,15);
  68.            Top:=iTop;
  69.         end else begin
  70.            iFlag:=-1;
  71.         end;
  72.       end;
  73.       Sleep(30);
  74.     end; //while
  75.   end; //with
  76.   if Form.AutoClose then Form.Close;
  77. finally
  78.   ExitThread(4);
  79. end;
  80. end;
  81. procedure ShowAlert(const title,Info: string;needAutoClose:boolean = true;MsgKind:TMsgKind = mkInfo);
  82. var
  83.   MsgForm:TMsgForm;
  84.   ThreadId: DWORD;
  85. begin
  86.   MsgForm:=TMsgForm.Create(nil);
  87.   with MsgForm do
  88.   begin
  89.     AutoClose:=needAutoClose;
  90.     ParentWindow:=GetDesktopWindow;
  91.     Top := Screen.WorkAreaHeight+10;
  92.     Left:= Screen.WorkAreaWidth-Width-3;
  93.     Bmp := TBitmap.Create;
  94.     Bmp.PixelFormat := pf24Bit;
  95.     lblMsg.Caption := Info;
  96.     lblTitle.Caption := title;
  97.     ImageList1.GetIcon(Integer(MsgKind),Image1.Picture.Icon);
  98.     //以下三行隐藏任务栏图标
  99.     ShowWindow( Handle, SW_HIDE );
  100.     SetWindowLong( Handle, GWL_EXSTYLE,GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TOPMOST or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
  101.     ShowWindow( Handle, SW_SHOW );
  102.     SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOOWNERZORDER); // 窗体显示在任务栏后面
  103.     DrawBk;
  104.   end;
  105.   MsgForm.ThreadHandle:=CreateThread(nil, 0, @ThreadFunc, MsgForm , 0, ThreadId);
  106.   MsgFormList.Add(MsgForm);
  107. end;
  108. {设置窗口样式,无标题栏}
  109. procedure TMsgForm.CreateParams(var Params: TCreateParams);
  110. begin
  111.   inherited;
  112.   Params.Style := Params.Style or WS_BORDER;
  113.   Params.ExStyle := WS_EX_DLGMODALFRAME or WS_EX_TOPMOST;
  114. end;
  115. {处理EraseBkgnd}
  116. procedure TMsgForm.WMEraseBkgnd(var Msg: TWMEraseBkgnd);
  117. begin
  118.   Bitblt(Msg.DC, 0, 0, ClientWidth, ClientHeight, Bmp.Canvas.Handle, 0, 0,
  119.     SRCCOPY);
  120.   Msg.Result := 1; // 已处理
  121. end;
  122. {画渐变背影}
  123. procedure TMsgForm.DrawBk;
  124. type
  125.   PRGBArray = ^TRGBArray;
  126.   TRGBArray = array[Byte] of TRGBTriple;
  127. var
  128.   PLine: PRGBArray;
  129.   x, y: Integer;
  130.   ARect: TRect;
  131.   RowInc: Integer;
  132.   sr, sg, sb, er, eg, eb: Integer;
  133. begin
  134.   if InDraw then Exit;
  135.   InDraw := True;
  136.   Bmp.Width := ClientWidth;
  137.   Bmp.Height := ClientHeight;
  138.   sr := GetRValue(StartColor);
  139.   sg := GetGValue(StartColor);
  140.   sb := GetBValue(StartColor);
  141.   er := GetRValue(EndColor);
  142.   eg := GetGValue(EndColor);
  143.   eb := GetBValue(EndColor);
  144.   PLine := PRGBArray(Bmp.ScanLine[0]);
  145.   for x := 0 to Bmp.Width - 1 do
  146.   begin
  147.     PLine[x].rgbtRed := sr + (er - sr) * x div Bmp.Width;
  148.     PLine[x].rgbtGreen := sg + (eg - sg) * x div Bmp.Width;
  149.     PLine[x].rgbtBlue := sb + (eb - sb) * x div Bmp.Width;
  150.   end;
  151.   RowInc := (Bmp.Width * 3 + 3) div 4 * 4;
  152.   for y := 1 to Bmp.Height - 1 do
  153.     Move(PLine^, Bmp.ScanLine[y]^, RowInc);
  154.   ARect := Rect(0, 0, Width, Height);
  155.   Frame3D(Bmp.Canvas, ARect, $777777, $777777, 1);
  156.   InDraw := False;
  157.   Refresh;
  158. end;
  159. {onClose事件}
  160. procedure TMsgForm.FormClose(Sender: TObject; var Action: TCloseAction);
  161. begin
  162.     Action:=caFree;
  163. end;
  164. {onDestroy事件}
  165. procedure TMsgForm.FormDestroy(Sender: TObject);
  166. begin
  167.     TerminateThread(ThreadHandle,4);
  168.     MsgFormList.Remove(Self);
  169. end;
  170. procedure TMsgForm.FormClick(Sender: TObject);
  171. begin
  172.   TerminateThread(ThreadHandle,4);
  173.   while Top<(Screen.WorkAreaHeight) do
  174.   begin
  175.     Inc(iTop,15);
  176.     Top:=iTop;
  177.     Sleep(30);
  178.   end;
  179.   Close;
  180. end;
  181. end.