如何实现winamp吸附当前窗口标题栏的效果?解决后另有重谢!!!

windows2008 2004-09-19 11:03:25
大家在用winamp时有没有注意到当前活动窗口会出现目前播放的歌曲名字,演唱者等信息,另外还有4个按钮,单击可以实现对歌曲的控制(停止,播放,上一首,下一首),我想问一下这个效果是怎么实现的???解决后另有重谢!!!如有源代码可发到awz163@163.com,必有重谢!!!
...全文
347 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
vnet2004 2005-01-10
  • 打赏
  • 举报
回复
我给你发过去一个,试试!
windows2008 2004-10-25
  • 打赏
  • 举报
回复
谢谢 susandy(susandy)兄!不过那个代码并没有实现我说的那个功能啊~~~

各位高手都来支招啊~
susandy 2004-10-18
  • 打赏
  • 举报
回复
http://www.2ccc.com/article.asp?articleid=6
susandy 2004-10-12
  • 打赏
  • 举报
回复
to:windows2008兄:不好意思小弟有一段时间没上网了,今天上网才看到帖子,那个控件在盒子也有下载!windows2008兄可以去那找找!我把控件的名字也给忘了!如果windows2008兄不急的话,等我回家查到名字就把具体网址发给你!实在抱歉,让你等这摸久!!
reallike 2004-09-28
  • 打赏
  • 举报
回复
伴水兄最擅长这个了。
loestar 2004-09-27
  • 打赏
  • 举报
回复
不错!收藏!
welllove88 2004-09-27
  • 打赏
  • 举报
回复
钩子好像用不到!!可以考虑停靠
zdq801104 2004-09-27
  • 打赏
  • 举报
回复
转栽
Winamp的用户都知道,Winamp的播放列表或均衡器在被移动的时候,仿佛会受到一股磁力,每当靠近主窗口时就一下子被“吸附”过去,自动沿边对齐。我想让我的Winamp插件也具备这种奇妙特性,于是琢磨出了一种“磁化”窗口的方法。该法适用于Delphi的各个版本。为了演示这种技术,请随我来制作一个会被Winamp“吸引”的样板程序。
  先新建一应用程序项目,把主窗口Form1适当改小些,并将BorderStyle设为bsNone。放一个按钮元件,双击它并在OnClick事件中写“Close;”。待会儿就按它来结束程序。现在切换到代码编辑区,定义几个全局变量。
  var
   Form1: TForm1; //“磁性”窗口
   LastX, LastY: Integer; //记录前一次的坐标
   WinampRect:Trect; //保存Winamp窗口的矩形区域
   hwnd_Winamp:HWND; //Winamp窗口的控制句柄
  接着编写Form1的OnMouseDown和OnMouseMove事件。
  procedure TForm1.FormMouseDown(Sender: Tobject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
  const
   ClassName=‘Winamp v1.x’; //Winamp主窗口的类名
   //如果改成ClassName=‘TAppBuilder’,你就会发现连Delphi也有引力啦!
  begin
  //记录当前坐标
  LastX := X;
  LastY := Y;
  //查找Winamp
  hwnd_Winamp := FindWindow(ClassName,nil);
  if hwnd_Winamp>0 then //找到的话,记录其窗口区域
  GetWindowRect(hwnd_Winamp, WinampRect);
  end;
  procedure TForm1.FormMouseMove(Sender: Tobject; Shift: TShiftState; X,
   Y: Integer);
  var
   nLeft,nTop:integer; //记录新位置的临时变量
  begin
  //检查鼠标左键是否按下
   if HiWord(GetAsyncKeyState(VK_LBUTTON)) > 0 then
   begin
   //计算新坐标
   nleft := Left + X - LastX;
   nTop := Top + Y - LastY;
   //如果找到Winamp,就修正以上坐标,产生“磁化”效果
   if hwnd_Winamp>0 then
   Magnetize(nleft,ntop);
   //重设窗口位置
   SetBounds(nLeft,nTop,width,height);
   end;
  end;
  别急着,看Magnetize()过程,先来了解一下修正坐标的原理。根据对Winamp实现效果的观察,我斗胆给所谓“磁化”下一个简单的定义,就是“在原窗口与目标窗口接近到某种预定程度,通过修正原窗口的坐标,使两窗口处于同一平面且具有公共边的过程”。依此定义,我设计了以下的“磁化”步骤。第一步,判断目标窗口(即Winamp)和我们的Form1在水平及垂直方向上的投影线是否重叠。“某方向投影线有重叠”是“需要进行坐标修正”的必要非充分条件。判断依据是两投影线段最右与最左边界的差减去它们宽度和的值的正负。第二步,判断两窗口对应边界是否靠得足够近了。肯定的话就让它们合拢。
  好了,下面便是“神秘”的Magnetize过程了……
  procedure TForm1.Magnetize(var nl,nt:integer);
   //内嵌两个比大小的函数
   function Min(a,b:integer):integer;
   begin
   if a>b then result:=b else result:=a;
   end;
   function Max(a,b:integer):integer;
   begin
   if a    end;
  var
   H_Overlapped,V_Overlapped:boolean; //记录投影线是否重叠
   tw,ww,wh:integer; //临时变量
  const
   MagneticForce:integer=50; //“磁力”的大小。
   //准确的说,就是控制窗口边缘至多相距多少像素时需要修正坐标
   //为了演示,这里用一个比较夸张的数字――50。
   //一般可以用20左右,那样比较接近Winamp的效果
  begin
  //判断水平方向是否有重叠投影
  ww := WinampRect.Right-WinampRect.Left;
  tw := Max(WinampRect.Right,nl+Width)-Min(WinampRect.Left,nl);
  H_Overlapped := tw<=(Width+ww);
  //再判断垂直方向
  wh := WinampRect.Bottom-WinampRect.Top;
  tw := Max(WinampRect.Bottom,nt+Height)-Min(WinampRect.Top,nt);
  V_Overlapped := tw<=(Height+wh);
  //足够接近的话就调整坐标
  if H_Overlapped then
   begin
   if Abs(WinampRect.Bottom-nt)   
else if Abs(nt+Height-WinampRect.Top)   
end;
  if V_Overlapped then
   begin
   if Abs(WinampRect.Right-nl)   
else if Abs(nl+Width-WinampRect.Left)   
end;
  end;
  怎么样?运行后效果不错吧!
windows2008 2004-09-24
  • 打赏
  • 举报
回复
大家在用winamp时有没有注意到当前活动窗口会出现目前播放的歌曲名字,演唱者等信息,另外还有4个按钮,单击可以实现对歌曲的控制(停止,播放,上一首,下一首),我想问一下这个效果是怎么实现的???解决后另有重谢!!!如有源代码可发到awz163@163.com,必有重谢!!!
windows2008 2004-09-22
  • 打赏
  • 举报
回复
to:susandy(susandy):::我到http://www.torry.net/上去看了,全是E文啊~~~~~~~~呵呵,小弟E文不太好,找了好长时间也没找到~~~~~~~能不能告诉我具体的网址啊?
windows2008 2004-09-22
  • 打赏
  • 举报
回复
非常感谢各位大侠的参与!
to:questions_problems(questions_problems) ::
在标题栏画按钮的效果我已经实现了,在当前活动窗体上也能画,就是不能响应鼠标事件~~这是我最头疼的啊~~~~~~~
52768361(涵清V3.0)兄给我发了个源码,不过没有实现上面我说的效果啊~`我说的是能够自动吸附到当前活动窗体(或者是嵌入到,好像winamp是把当前窗口的标题栏给改了~~:( )然后那四个按钮还能响应鼠标事件(单击实现止,播放,上一首,下一首功能),望各位大侠不吝执教!我想这是一个高难度的问题吧!大侠们支招啊!!!
da18a 2004-09-21
  • 打赏
  • 举报
回复
应该可以实现
susandy 2004-09-21
  • 打赏
  • 举报
回复
http://www.torry.net/上有下载,你可以试试
susandy 2004-09-21
  • 打赏
  • 举报
回复
你可以去下个控件,有第三方控件可以实现!!
questions_problems 2004-09-21
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Buttons, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
procedure FormResize(Sender: TObject);
private
CaptionBtn: TRect;
procedure DrawCaptButton;
procedure WMNCPaint(var Msg: TWMNCPaint); message WM_NCPaint;
procedure WMNCActivate(var Msg: TWMNCActivate); message WM_NCACTIVATE;
procedure WMSetText(var Msg: TWMSetText); message WM_SETTEXT;
procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;
procedure WMNCLButtonDown(var Msg: TWMNCLButtonDown); message WM_NCLBUTTONDOWN;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

const
HTCaptionBtn = HTSIZELAST + 1;
{$R *.DFM}

procedure TForm1.DrawCaptButton;
var
xFrame,
yFrame,
xSize, ySize: Integer;
R: TRect;
begin
xFrame := GetSystemMetrics(SM_CXFRAME);
yFrame := GetSystemMetrics(SM_CYFRAME);

xSize := GetSystemMetrics(SM_CXSIZE);
ySize := GetSystemMetrics(SM_CYSIZE);

CaptionBtn := Bounds(Width - xFrame - 4 * xSize + 2,
yFrame + 2, xSize - 2, ySize - 4);

Canvas.Handle := GetWindowDC(Self.Handle);

Canvas.Font.Name := 'Arial';
Canvas.Font.Color := clRed;
Canvas.Font.Style := [fsBold];
Canvas.Pen.Color := clYellow;
Canvas.Brush.Color := clBtnFace;

try
DrawButtonFace(Canvas, CaptionBtn, 1, bsAutoDetect, False, False, False);

R := Bounds(Width - xFrame - 4 * xSize + 2,
yFrame + 3, xSize - 6, ySize - 7);

with CaptionBtn do
Canvas.TextRect(R, R.Left + 2, R.Top - 1, 'o');

finally
ReleaseDC(Self.Handle, Canvas.Handle);
Canvas.Handle := 0;
end;
end;

procedure TForm1.WMNCPaint(var Msg: TWMNCPaint);
begin
inherited;
DrawCaptButton;
end;

procedure TForm1.WMNCActivate(var Msg: TWMNCActivate);
begin
inherited;
DrawCaptButton;
end;

procedure TForm1.WMSetText(var Msg: TWMSetText);
begin
inherited;
DrawCaptButton;
end;

procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
inherited;
with Msg do
if PtInRect(CaptionBtn, Point(XPos - Left, YPos - Top)) then
Result := htCaptionBtn;
end;

procedure TForm1.WMNCLButtonDown(var Msg: TWMNCLButtonDown);
begin
inherited;
if (Msg.HitTest = htCaptionBtn) then
ShowMessage('Down');
end;

procedure TForm1.FormResize(Sender: TObject);
begin
Perform(WM_NCACTIVATE, Word(Active), 0);
end;

end.


可以实现在标题栏上画个按钮
Bellamy 2004-09-21
  • 打赏
  • 举报
回复
呵呵!
yueyixing 2004-09-21
  • 打赏
  • 举报
回复
http://dev.csdn.net/article/10/10591.shtm
lw549 2004-09-21
  • 打赏
  • 举报
回复
:)
yueyixing 2004-09-20
  • 打赏
  • 举报
回复
吸附功能应该是通过判断两个窗体之间的距离来实现的。
wfhlxl 2004-09-20
  • 打赏
  • 举报
回复
我这里有源码,不过你的付10元RMB
加载更多回复(4)
内容概要:本文档聚焦于基于Peng-Robinson状态方程的化工热力学计算研究,系统介绍了利用Matlab代码实现纯组分及多组分系统的压缩因子(z因子)和逸度系数的计算方法,并进一步拓展至泡点压力与露点压力的数值求解。资源涵盖了从状态方程推导、非线性方程求根、相平衡条件判断到迭代算法实现的完整技术路线,提供了可运行的Matlab程序代码,有助于深入理解实际工程中物性参数的计算原理与实现过程; 适合人群:具备化工热力学基础知识和一定Matlab编程能力的高校学生、科研人员及工程技术人员,尤其适合从事过程系统模拟、油气田开发、精馏设计及相关领域研究的专业人士; 使用场景及目标:① 掌握Peng-Robinson方程在真实气体物性计算中的应用;② 实现多组分混合体系的相平衡计算与泡/露点预测;③ 为Aspen Plus等商用流程模拟软件提供底层算法验证与教学参考;④ 支持科研论文复现、课程设计、毕业设计及工业过程优化中的热力学数据支撑需求; 阅读建议:建议读者结合经典化工热力学教材同步学习,重点理解立方型状态方程的根判别、迭代收敛策略与相平衡准则的数学表达,动手调试并运行所提供的Matlab代码以掌握算法细节,还可将其扩展应用于其他状态方程(如SRK、vdW)的对比分析研究。
内容概要:本文围绕列车-轨道-桥梁交互仿真研究,基于Matlab平台构建数值模型,系统分析列车运行过程中轨道与桥梁结构间的动态相互作用机制。研究涵盖多体动力学建模、耦合系统运动方程求解、边界条件设定及仿真结果可视化等关键环节,重点揭示高速行车条件下基础设施的振动传递规律与力学响应特征。该仿真方法可有效评估结构安全性、舒适性指标及疲劳寿命,为轨道交通工程的设计优化与运维管理提供理论支撑和技术路径。文中配套提供了完整的Matlab代码实现方案及操作说明,便于用户复现、验证和拓展相关研究。; 适合人群:具备Matlab编程基础和结构动力学、车辆动力学等相关专业知识的研究生、科研人员及从事铁路工程、桥梁工程与交通系统安全评估的工程技术人才,尤其适合开展轨道交通耦合振动课题的研究者。; 使用场景及目标:①用于高校与科研机构进行列车-轨道-桥梁耦合系统动力学特性的教学演示与科学研究;②支撑高速铁路桥梁的设计优化、运营安全性评估与减振降噪方案验证;③为复杂交通基础设施的多物理场耦合仿真提供建模思路与代码参考。; 阅读建议:建议读者结合所提供的Matlab代码逐模块深入研读,重点关注系统建模假设、质量-刚度-阻尼矩阵构建方法及数值积分算法的实现细节,同时可通过调整参数进行敏感性分析,进一步掌握仿真模型的适用范围与优化方向。

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧