"网络蚂蚁"和"FlashGet"的悬浮窗口的实现

    最近有网友问道如何用 Delphi 实现"网络蚂蚁"和"FlashGet"的悬浮窗口,笔者对使用
到的相关技巧做了整理如下:

1.悬浮窗口
    Delphi 的 TForm.FormStyle 具有 fsStayOnTop 属性,但只是对其程序本身而言的,
也就是说只在此应用程序本身的窗口中是前端显示的,其他的程序的窗口仍然可以覆盖
此类型的窗口。这是应为此窗口的父窗口是 TApplication 。要让悬浮窗口独立的显示
在屏幕前端,应在创建窗口时将其父窗口设置为"桌面"。
   Form2 := TForm2.CreateParented(GetDesktopWindow);

数据挖掘研究院

2.允许 Client 区域拖动窗口
    这只要捕获窗口的 WM_NCHITTEST 消息,将客户区HitTest(HTCLIENT)变成标题栏
的HitTest(HTCAPTION)就可以了。 数据挖掘研究院

3.半透明
    Windows2000/XP 给窗口增加了WS_EX_LAYERED 属性,并通过 API
SetLayeredWindowAttributes(); 来设置此属性的详细信息。Delphi 6 的 Forms 单元
已经支持此窗口属性。
    property AlphaBlend default False;       // 是否使用半透明效果
    property AlphaBlendValue default 255;   // 透明度 0..255
    property TransparentColor default False;   // 是否使用穿透色
    property TransparentColorValue default 0;  // 穿透色
    (*此功能仅 Windows2000/XP 支持,不要在 Win9x 尝试此特效)

数据挖掘交友

4.接收来自 Shell 的鼠标拖拽
    这将使用到 ActiveX 单元的 IDropTarget 接口,并扩展你的 Form 类。
      TForm2 = class(TForm, IDropTarget)
       ....
      end;
并在窗口拥有句柄后,用 RegisterDragDrop() 注册成为 DragDrop 接受目标。


以下是实现的代码:

数据挖掘研究院

unit DropBin; 数据挖掘交友

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ExtCtrls, ActiveX, ComObj;

type
  TfrmDropBin = class(TForm, IDropTarget)
  private
    procedure WMNCHitTest(var Msg:TWMNCHitTest); message WM_NCHITTEST;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure CreateWnd; override;
    procedure DestroyWnd; override;
    procedure DoClose(var Action: TCloseAction); override;
    // DragDrop 支持
    function DragEnter(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall;
    function IDropTarget_DragOver(grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall;
    function IDropTarget.DragOver = IDropTarget_DragOver;  // 解决 IDropTarget.DragOver 与 TForm.DragOver 冲突问题
    function DragLeave: HResult; stdcall;
    function Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall;

数据挖掘交友


  public
    constructor Create(AOwner: TComponent); override;
  end; 数据挖掘工具

var
  frmDropBin: TfrmDropBin;

procedure ShowDropBin(Sender: TMenuItem);

数据挖掘工具

implementation 数据挖掘工具

{$R *.dfm}

type
  // 虽然 Delphi 的 Windows 单元定义了 SetLayeredWindowAttributes(); ( external "User32.dll" )
  // 但为了兼容 Win9x, 不能直接调用。
  TSetLayeredWindowAttributes = function (Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; stdcall;

var
  User32ModH: HMODULE;
  SetLayeredWindowAttributes: TSetLayeredWindowAttributes = nil; 数据挖掘实验室

procedure ShowDropBin(Sender: TMenuItem);
begin
  if Assigned(frmDropBin) then frmDropBin.Close
  else begin
    frmDropBin := TfrmDropBin.CreateParented(GetDesktopWindow);
  end;
end;

constructor TfrmDropBin.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Width := 32;
  Height := 32;
end; 数据挖掘研究院

procedure TfrmDropBin.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do begin
    Style := WS_POPUP or WS_CLIPSIBLINGS {or WS_BORDER};
    ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST;
  end;
end;

procedure TfrmDropBin.CreateWnd;
begin
  inherited CreateWnd;
  Visible := True;
  // 为 2000/XP 创建半透明、穿透效果
  if Assigned(SetLayeredWindowAttributes) then begin
    SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
    SetLayeredWindowAttributes(Handle, clWhite, 128, LWA_ALPHA or LWA_COLORKEY);
  end;
  // 设置为接受拖拽
  OleCheck(RegisterDragDrop(Handle, Self));
end;

procedure TfrmDropBin.DestroyWnd;
begin
  if HandleAllocated then RevokeDragDrop(Handle);
  inherited DestroyWnd;
end;

function TfrmDropBin.DragEnter(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall;
begin
  //
  // 也可以在此判断是否接受拖拽,修改 dwEffect 可以得到不同的效果 ...
  //
  dwEffect := DROPEFFECT_COPY;
  Result := S_OK;
end;

function TfrmDropBin.IDropTarget_DragOver(grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall;
begin
  dwEffect := DROPEFFECT_COPY;
  Result := S_OK;
end; 数据挖掘论坛

function TfrmDropBin.DragLeave: HResult; stdcall;
begin
  Result := S_OK;
end; 数据挖掘实验室

function TfrmDropBin.Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall;
begin
  //
  // 处理 dataObj 中包含的拖拽内容 ...
  //
  dwEffect := DROPEFFECT_NONE;
  Result := S_OK;
end;

procedure TfrmDropBin.DoClose(var Action: TCloseAction);
begin
  Action := caFree;
  frmDropBin := nil;
end; 数据挖掘交友

procedure TfrmDropBin.WMNCHitTest(var Msg:TWMNCHitTest);
begin
  // 通过 Client 区拖动窗口
  DefaultHandler(Msg);
  if Msg.Result = HTCLIENT then
  Msg.Result:= HTCAPTION;
end; 数据挖掘论坛

initialization
  OleInitialize(nil);
  // 为兼容 Win9x
  User32ModH := GetModuleHandle("User32.dll");
  if User32ModH <> 0 then @SetLayeredWindowAttributes := GetProcAddress(User32ModH, "SetLayeredWindowAttributes"); 数据挖掘交友

finalization
  OleUninitialize;
 
end.


作者主页: http://oopsware.delphibbs.com/ 数据挖掘实验室

 -----  End of File -----

[数据挖掘专家] [数据挖掘研究院] [数据挖掘论坛] [数据挖掘实验室]
上一篇:关于中文折行及相关问题的解决方法(taogou)
下一篇:用API做的ServerSocket例子
最新评论共有 0 位网友发表了评论 , 查看所有评论
发表评论( 不能超过250字,需审核,请自觉遵守互联网相关政策法规。 )
匿名?
数据挖掘网站导航 数据挖掘论坛导航
  • 数据挖掘工具
  • 数据挖掘论坛
  • DataCruncher - Cognos
  • MineSet - MathSoft
  • Intelligent Miner - GainSmarts
  • Sqlserver - SAS - Clementine
  • CART - Weka - WizSoft
  • NeuroShell - ModelQuest
  • data mining tools - Darwin
  • 数据挖掘交友
  • 数据挖掘博客
  • 数据挖掘工具
  • 数据挖掘资源
  • 数据挖掘技术算法
  • 数据挖掘相关期刊、会议
  • 研究院联盟合作专区
  • 数据挖掘基础与相关技术
  • 数据挖掘厂商与就业
  • 数据挖掘研究者乐园
  • 知名厂商数据挖掘工具资料
  • 国内数据挖掘实验室
  • Foreign Data Mining Lab
  • 热点关注
  • GDI+简介
  • COM与DCOM的区别与联系
  • 使用Delphi解析XML 文档
  • 如何设置delphi/cbuilder/BDE/MSSQL
  • BORLAND在“迫害”程序员?
  • 将image的图片保存为JPG格式图片方法
  • InstallShieldExpressfordelphi制作安装程
  • Real Programmers Use Pascal
  • 关于在COM中使用可选参数的研究
  • TStrings的AddObject方法应用
  • 论坛最新话题
  • Foundations of Statistical Natural Langu
  • Game Theory meet Data Mining: A Recent P
  • System Building: How does it help or hin
  • 数据挖掘与Clementine培训
  • 新手报到
  • 求 SASEM 客户流失预测分析
  • 数据挖掘工程师/搜索研究院—北京——无线
  • 数据挖掘入门介绍(如何着手数据挖掘)
  • Information Overload Survey Results
  • The INEX 2005 Workshop on Element Retrie
  • 相关资讯
  • BORLAND在“迫害”程序员?
  • 李维:我的回忆和一些有趣的事(精彩绝伦)
  • 李维看.net和DELPHI6(含李维照片)
  • 《代码大全》电子版1.01发布了
  • Real Programmers Use Pascal
  • Kylix安装手记
  • Borland与Microsoft关于Delphi的对话
  • InstallShieldExpressfordelphi制作安装程
  • 关于在COM中使用可选参数的研究
  • msagent经典用法
  • 数据挖掘实验室资料
  • 数据挖掘博客地址
  • 数据挖掘实验室网站地址
  • Prepare for Medicare audits by using dat
  • 注册成为SAS用户与爱好者俱乐部会员
  • 水南梅
  • 明日烟
  • 新人报道
  • 下载
  • 厦门服务器托管,450元/月—0592-5177319 高
  • 买空间送域名--0592-5177319 高静