用时钟控件实现QQ窗体的缩入伸出
技术与开发
读者宋科:腾讯OQ的窗体可以自动伸出或者缩入屏幕,它是如何实现的呢?
小编:其实该功能设计起来并不难,在Delphi非常容易办到,实现这样效果的关键有两点:一是如何获取窗体,二是在获取窗体后如何实时监控窗体在屏幕中的坐标并根据情况改变它的坐标。
设计思路:先获取程序窗体,然后通过获取窗体的Left和Top的值来确定窗体在屏幕中的位置,时钟控件不停地监控窗体在屏幕中的位置,根据实际情况来改变窗体的Left或Top值,使之伸出或缩入。
启动Delphi,在主窗体上放置两个Timer控件,并把两个Timer的Interval设置为50毫秒。
第一步 获取窗体
首先我们要获取QQ的窗体。GetCursorPos是一个可以获得鼠标指针在屏幕中的坐标的API函数,利用它与FindVCLWindow()的结合就可以获得鼠标指针下的VCL可视组件。我们自定义一个GetFormNameAt函数,输入代码。其中关键代码如下:
function TfrmMain.GetFormNameAt(const Pos: TPoint): string;
var
w: TWinControl;
begin
//得到鼠标指针下的VCL可视组件
w:= FindVclWindow(Pos);
if (w <> nil) then
begin
第二步 窗体伸出
判断窗体在屏幕中的位置可以通过获取窗体的Left和Top的值来确定,比如窗体的Left为0,Top为0,则表明窗体此时的位置是在屏幕的最左上角。根据此原理,我们的Timer控件通过扫描窗体的Left和Top的值来判断窗体的位置,并根据情况来改变窗体的Left和Top的值来实现窗体的伸出和缩入。
当获取了窗体后,使用两个Timer控件来实现窗体的伸出缩入功能。Timer1的作用是实现窗体的伸出功能:不断扫描窗体的Left和Top的值来判断“窗体区域是否超出屏幕可视范围”,如果窗体区域已经超出屏幕的可视范围则立即改变窗体的Left和Top的值,也就是改变窗体在屏幕中的位置,使窗体“伸出”屏幕。
这部分关键代码如下:
//得到当前鼠标指针的在屏幕上的坐标
GetCursorPos(winPos);
//当鼠标指针下的窗体的Name等于frmMain.name时
if frmMain.Name = GetFormNameAt(winPos) then
{在此我们可以为frmMain取一个特别的名称,以防有别的窗体名称与它相同}
第三步 窗体缩入
窗体的缩入功能是靠Timer2的实现:不断扫描窗体的Left和Top的值来判断窗体是否处于屏幕的最左端、最上端、最右端,如果是则立即改变窗体的Left值和Top值实现窗体的缩入。
procedure TfrmMain.Timer2Timer(Sender: TObject);
begin
//当top距屏幕上侧20像素时,窗体缩入
if frmMain.Top <= 20 then
begin
//将frmMain向上移,在屏幕上方露出3像素
frmMain.Top:= -(frmMain.Height - 3);
if (frmMain.Left + frmMain.Width > Screen.Width) then
frmMain.Left:= Screen.Width - frmMain.Width;
end
// 当 left 距屏幕右侧 20 像素时, 窗体缩入
else if frmMain.Left + frmMain.Width - Screen.Width >= -20 then
//将frmMain向右移,在屏幕右方露出4像素
frmMain.Left:= Screen.Width - 4
// 当 left 距屏幕左侧 20 像素时, 窗体缩入
else if frmmain.Left <= 20 then
frmMain.Left := 4 - frmMain.Width;
end;
第四步 控制窗体的最小尺寸
至此我们已经可以实现窗体的缩入伸出功能了,腾讯的QQ窗体还有一个功能是:允许用户拖动鼠标来调整QQ窗体的尺寸大小,但设定了窗体的最小宽度是205像素,最小高度是417像素。当用户拖动鼠标来改变QQ窗体的尺寸时,窗体永远不会小于设计的宽度和高度。
procedure TfrmMain.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
if NewWidth < 205 then
NewWidth:= 205;
if NewHeight < 417 then
NewHeight:= 417;
end;
编后:QQ窗体缩入伸出功能归纳起来是:首先获取窗体,然后扫描窗体的Left和Top的值,根据窗体坐标改变其Left和Top的值来实现。动态计算Left和Top值在提高用户体验和增强程序友好度方面非常重要,在实际软件开发中灵活运用控件的Left和Top的值,将大大提高我们的编程效率。比如著名的俄罗斯方块游戏,程序对每一个方块定位就需要提取方块的Left和Top的值。另外比如棋类游戏、华容道等游戏都可以通过获取控件的Left和Top的值来对控件进行定位和操作。