创建Borland风格的漂浮式窗口

原创 2001年03月18日 22:58:00
 

创建Borland风格的漂浮式窗口<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

使用过Borland 系列开发工具产品(Delphi, C++Builder, Jbuilder)的朋友一定注意到Borland产品界面风格的特点,即屏弃了MDI(多文档界面),而采用分离的多窗口,特别是主窗口浮动于屏幕的最上方,当最大化时主窗口并不占满整个客户区,而是仍处在屏幕上方,使用户可以有更多的空间使用。那么如何才能实现类似于主窗口这样的效果呢?现在就在此介绍一下用Delphi实现的方法。

要实现上面所说的主窗口的效果,必须要做到三点:1、程序启动时使主窗口位于屏幕的最上方,且宽度充满整个屏幕;2、当用户拖动停靠工具条(Dockable ToolBar/CoolBar)时,窗口能自动调整大小;3、当用户点击最大化按钮时,窗口保持在屏幕最上方,且大小保持不变。

现在假设当前项目的主窗口(frmMain)中含有一个名为cbMainCoolBar(一般主窗口只包含菜单和工具条)。将TfrmMainAutosize属性设为False

具体步骤如下:

1、 为主窗口添加OnCreate事件,代码如下:

procedure TfrmMain.FormCreate(Sender: TObject);

begin

 Top:=0; //设定主窗口左上角到屏幕左上角

 Left:=0; //

 Width:=Screen.Width; //设定主窗口宽度为屏幕宽度

end;

Screen为系统预定义的类实例,对应与系统桌面,从其中可获取屏幕的一些参数。

 

2、 TfrmMain的定义部分添加私有成员:

private

   H:integer ;

为主窗口添加OnResize事件代码如下

procedure TfrmMain.FormResize(Sender: TObject);

begin

 ClientHeight:=cbMain.Height; //将窗口客户区高度设为CoolBar的高度

 H:=Height;     //将当前的窗口高度保存在变量H

end;

 

由于窗口初始化时或点击最大化按钮时都会触发OnResize事件,因此可以保证窗口高度始终正确。

 

3、 这是最关键的一步,我们必须改变Windows默认的最大化例程,来控制最大化后的窗口大小和位置。因此,我们重新映射响应WM_ GETMINMAXINFO的句柄。WM_GETMINMAXINFO消息在lparam中返回一个指向MINMAXINFO结构的指针,MINMAXINFO的结构如下:

tagMINMAXINFO =record 

    ptReserved : TPoint;                //系统保留

    ptMaxSize : TPoint;          //最大化后的大小

    ptMaxPosition : TPoint;                 //最大化后的位置

    ptMinTrackSize : TPoint;          //窗口的最小尺寸

    ptMaxTrackSize : TPoint;          //窗口的最大尺寸

End;

                     MINMAXINFO : tagMINMAXINFO;

 

针对我们的目的,只需要ptMaxSize,ptMaxPosition两个成员就够了。Windows在最大化窗口通过调用这个结构作为参数,来取代默认的最大化参数。

具体操作如下:

TfrmMain的定义部分添加私有成员定义:

   private

procedure FormMaximum(var Msg:TMessage);Message WM_GETMINMAXINFO;

以定义WM_GETMINMAXINFO的消息处理句柄。

Implementation部分添加实现代码:

procedure TfrmMain.FormMaximum(var Msg:TMessage);

var

    lpmmi:^tagMINMAXINFO;

begin

 lpmmi:=Pointer(Msg.LParam); //获取指向tagMINMAXINFO的指针

 lpmmi^.ptMaxSize:=Point(Screen.width,H); //设定窗口的长宽

 lpmmi^.ptMaxPosition:=Point(0,0); //设定窗口左上角的位置

end;

有一点要注意:lpmmi^.ptMaxSize:=Point(Screen.width,H);一句不能写成lpmmi^.ptMaxSize:=Point(Screen.width,frmMain.Height); 这是由于TformVCL控件,在此消息处理句柄中不可以直接引用Tform中的成员。

到此,大功告成了!其他一些细节,如是否允许用户改变窗口大小,是否可以拖动窗口,都可以通过简单调节而实现,就全看你的需要了。

Windows窗口风格~Windows Style

Windows窗口风格~Windows Style
  • u011430225
  • u011430225
  • 2015年07月01日 13:56
  • 1445

Object Pascal编程风格通则

Object Pascal Style Guide - By Charles Calvert(对象Pascal编码风格向导 - 译:Tommy Tong)概要:    这篇文章展现了一种格式化Delp...
  • TommyTong
  • TommyTong
  • 2001年12月01日 12:45
  • 1031

获取指定窗口窗口风格

API函数:LONG GetWindowLong(    HWND hWnd,  // handle of window    int nIndex  // offset of value to re...
  • lclai
  • lclai
  • 2008年11月10日 12:23
  • 2737

设置窗口风格

设置窗口风格      C++是一种面向对象的可视化编程工具,它提供的AppWizard能自动生成应用程序的标准框架,大大减轻了编 程的工作量。本文主要介绍如下的编程技巧:修改主...
  • wangjieest
  • wangjieest
  • 2011年11月10日 21:51
  • 3459

WIN32窗口类风格和窗口风格(备查询)

一.WNDCLASS typedef struct { UINT cbSize //这个结构体的长度,一般用sizeof(WNDCLASSEX)设置 UINT s...
  • jadeshu
  • jadeshu
  • 2017年04月22日 21:50
  • 682

获取指定窗口信息(坐标,窗口风格)

HWND hTheLol = FindWindowA( NULL ,"QQ"); //获取窗口坐标 ,窗口名称可以通过spy++抓取 LPRECT lprc = new RECT; GetWind...
  • qingzai_
  • qingzai_
  • 2015年03月06日 10:22
  • 561

MFC窗口风格的设置

1、 2、 3、 4、 5、 6、 7、 8、
  • wwkaven
  • wwkaven
  • 2014年10月11日 19:46
  • 1967

窗口扩展风格

WS_EX_ACCEPTFILES         窗口接受一个拖曳的文件 WS_EX_APPWINDOW 当窗口可见时,将一个顶层窗口放置到任务条上 WS_EX_CLIENTEDGE 指定窗...
  • a1009563517
  • a1009563517
  • 2016年06月22日 11:47
  • 989

win32程序窗口风格说明

参考:主要是罗云彬老师的《win32汇编程序设计》 一、注册窗口时,用到的窗口类结构 invoke RegisterClassEx,addr@stWndClass WNDCLASSEX   ...
  • ll2323001
  • ll2323001
  • 2012年07月03日 16:30
  • 2399

Win32 窗体风格说明

体风格是各种窗口开发的重要基础之一。它可以分为普通风格(WS_系列)和扩展风格(WS_EX_系列)。从其特点上来说,主要分两大类: 1、一类表明窗口和其他窗口的关系,如:WS_CHILD、WS_...
  • leehong2005
  • leehong2005
  • 2013年02月25日 14:35
  • 1822
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:创建Borland风格的漂浮式窗口
举报原因:
原因补充:

(最多只允许输入30个字)