Delphi驿站
2000-08-14 11:48:30
实现一个无系统按钮和Caption的窗体
有时为了界面纯图形化的要求,应用程序需要一个设有最大(小)按钮、关闭按钮及标题栏的窗体,但是又要求窗体可以任意挪动位置和进行极大极小的切换,如何实现可参照下法进行:
1.先将窗体的BorderIcons集合型属性置为空,将BorderStyle属性置为bsNone,这样使得窗体如同白纸一样干净;
2.根据自己的需要放入Image作为窗体的背景图案,再放入各个控件完成界面的设计;
3.对窗体自行定义一种事件,该事件将会截获鼠标在本窗体内的一切动作所引发的Windows消息(包括鼠标移动、按动等),然后在事件响应过程中采用移花接木的技术,让操作系统认为鼠标在窗体内按下的位置是发生在窗体标题栏上,从而使得鼠标在窗体内部任意位置按下都可以像使用标题栏一样来移动窗体,程序代码如下:
…
private
procedure MoveForm(var M:TWMNCHitTest);message wm—NCHitTest;{对窗体声明一个自定义的事件}
{Private declarations}
…
implementation
…
procedure TForm1.MoveForm(var M:TWMNCHitTest);
begin
inherited;
if M.Result = HTCLIENT then begin
M.Result :=HTCAPTION;
end;
end;
4.安放一个小按钮,对其click事件增加application.minimize或者Form.
WindowState :=wsMinimized,用以实现窗体极小化。
●说明:Delphi不但封装和提供了丰富的各类控件事件让用户直接使用,还允许用户截获Windows消息进行自定义事件的处理。窗体类声明private段中定义了一个事件,它有4个要素:首先,它是一个事件执行过程的定义;其次,它有一个导引符message,表示它将截获Windows信息;再次是将截获Windows信息的种类,它紧跟在导引符message之后;最后是有一个结构变量,当信息被截获时,随信息一起而来的信息数据将赋给这个变量。因此,这个变量的类型定义必须要与所截获的信息类型相互对应(具体参阅Message record types的在线帮助)。该变量至少有4个域,每个域的值都可以在事件处理过程中更改,最常改动的域是.result。在上例中便是截获本窗体内的鼠标信息,将信息数据赋给对应类型的变量M,当M的Result域值为HTCLIENT,代表鼠标主键在窗体客户区(client area)按下时,将该域值改为HTCAPTION表示标题栏区,强迫Windows接受鼠标在本窗体标题栏内按下这一假象,那么接着移动窗体也就合情合理了。
如何使Form位于所有窗体最前
在设计程序界面时,有时要求某一窗体不能被任何其它窗体遮盖,即使它失去焦点。对于应用程序主窗体来说,可以通过在物体属性栏(Object Inspector)中设置窗体的FormStyle属性为fsStayOnTop来实现;但是对于多窗体应用程序(MDI)中主窗体产生的子窗体而言,这一方法的效果是相对有限的,因为此法只能使该子窗体位于本应用程序其它窗体的最前端,当Windows 95桌面上别的应用程序窗体获得焦点后仍可以将其遮盖。如果您需要应用程序子窗体拥有绝对的位于所有窗体最前的能力时,可以参照下法进行(假定由主窗体事件产生的子窗体为Form2,对应的程序组名为Unit2):
1.在Unit2中窗体类声明public段下定义一个处理过程:
procedure AppBringtoTop(Sender:TObject);
2.在Form2的oncreate事件中加入*句如下:
procedure Tform2.FormCreate(Sender:TObject);
begin
Application.OnDeactivate :=AppBringtoTop; //*
end;
3.编写AppBringtoTop过程程序如下:
procedure TForm2.AppBringtoTop(Seader:TObject);
begin
SetactiveWindow(Handle); //API函数,将本窗体提至最前
end;
●说明:Application是Delphi对用户创建的应用程序的封装,为TApplication类,如同TForm等一样,TApplication也有其自己的属性与事件定义,其中Application.OnDeactivate事件在用户开启其他应用程序而将会使本应用程序为Deactivate时产生,正确地对该事件编程即可实现本窗体(Form2)始终位于最前;另外由于TApplication是不可见控件,同时它的属性与事件均没有列入物体属性栏中,因而需要在程序段中编写代码来进行描述。编写TApplication的事件过程时要按下述原则进行:A在执行段implementation中编写好事件处理过程;B在interface段中声明该事件处理过程;C在该窗体的FormCreate事件中定义所需的Application事件响应为B中声明的过程名。
摘自《赛迪网》 马建国/文 |
404 Not Found
404 Not Found
nginx
|
|