delphi界面美化.doc_第1页
delphi界面美化.doc_第2页
delphi界面美化.doc_第3页
delphi界面美化.doc_第4页
delphi界面美化.doc_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Delphi界面美化界面的美观和用户亲和性是应用软件成功的首要条件,因此界面往往是程序员最费心的地方。在这个专辑中,将向读者全面介绍Delphi中界面设计的原则和技巧 窗体设计制作固定大小的Form 固定的Form像一个对话框,何不试试下面的语句 巧用Delphi制作溅射屏幕 精心编写的WINDOWS程序显示启动注意事项,称之为溅射屏幕(splash screen)。利用一点儿小小的内容,即可给程序的显示添加不少色彩LED数码管仿真显示程序在电子设备上广泛地使用LED数码管显示数据,在许多应用软件中也经常模拟LED数码管显示数据,使程序画面看起来很有特色 菜单设计DELPHI中自适应表单的实现我们知道,屏幕分辨率的设置影响着表单布局,假设你的机器上屏幕分辨率是800*600,而最终要分发应用的机器分辨率为640*480,或1024*768,这样你原先设计的表单在新机器上势必会走样作非常规程序菜单掌握delphi高级秘籍大家可能见过诸如金山毒霸,瑞星杀毒,以及五笔输入法等等在系统托盘(即右下角有时间和输入法图标的地方)在的控制菜单,而在正常的任务栏(即屏幕最下方的“开始”按钮的右边的各式各样)中却不出现按钮的程序,即我们常说的在后台运行的程序用Delphi制作动态菜单所谓动态菜单是指菜单项随着程序的操作变化而变化。现在,我们用Delphi来实现这一功能,具体步骤如下 工具栏和状态条 为Windows窗口标题栏添加新按钮对于我们熟悉的标准windows窗口来讲,标题栏上一般包含有3个按钮,即最大化按钮,最小化按钮和关闭按钮。你想不想在Windows的窗口标题栏上添加一个新的自定义按钮用Delphi4实现风Word97格的工具栏用过Word97的人对它的工具栏印象很深刻,因为它的风格很“酷”,同样IE4.0的工具栏也有类似的风格,Win98的出现,使这种风格的工具栏得到了推广如何隐藏和显示Windows的任务条如果隐藏和显示Windows的任务条?仅仅调用以下的函数就可以. 其他技巧Delphi利用Windows GDI实现文字倾斜在Delphi开发环境中,文字的输出效果一般都是头上脚下的正统字符,如何输出带有一定倾斜角度的文字以达到特殊的显示效果呢Delphi之三十六计之界面篇设置状态栏面板对象的Style为OwnerDraw,并在状态栏对象的DrawPanel事件中书写以下代码利用COM技术实现外壳扩展的属性页当用户在资源管理器中调用右键菜单时,会显示一个属性菜单项,点击属性菜单项会显示一个属性页,用户可以获得甚至修改文件信息制作固定大小的Form 固定的Form像一个对话框,何不试试下面的语句? C+ Builder 请参照Delphi的例子 Delphi 您可以覆写 CreateParams() 这个 TWinControl 的虚拟程序, 改变 form的 wc.Stylee, 将 WS_SYSMENU 这个旗标解除, 这样, 就不会有左上角的 SystemMenuBox 了. 至於不能移动.缩小/放大, 可以自已拦下 WM_NCHITTEST, 然後一概回应滑鼠点在视窗 Client 区域, 相信这个视窗就呆呆的不会动了. 详情可以查一下 Win32API Help 的 CreateWindow() 与 WM_NCHITTEST 的说明. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private Private declarations procedure WMNCHitTest(var Msg: TMessage); message WM_NCHITTEST; protected procedure CreateParams(var Params: TCreateParams); override; public Public declarations end; var Form1: TForm1; implementation $R *.DFM 巧用Delphi制作溅射屏幕 精心编写的WINDOWS程序显示启动注意事项,称之为溅射屏幕(splash screen)。利用一点儿小小的内容,即可给程序的显示添加不少色彩。 由于工程本身创建程序的主窗口,且启动溅射屏幕必须在创建主窗口之前出现,所以工程文件必须创建自己的启动屏幕。这意味着用户必须修改源代码来创建工程文件,而这通常在DELPHI编程中是不需要的。下面的过程介绍了溅射屏幕的建立过程。 1、开始一个新的工程。将窗体命名为MainForm,同时将其Caption属性设置为SplashinDemo。把这个工程保存在一个目录中,如C:ProjectsSplashin。把MainForm的单元命名为Main,把工程文件命名为Splashin。 2、在MainForm中插入一个Button组件。将Button的Name属性改为ExitButton,而将其Caption属性改为Exit。为ExitButton的OnClick事件创建一个处理器,在过程的begin和end关键词之间插入Close;语句。 3、选取File|New Form命令,或者单击New Form速度按钮。添加一个新的窗体。 4、将这个窗体的Name属性改变为SplashForm,删除其Caption属性。此外,将其BorderStyle属性改变为bsnone,同时将BorderIcons下的三个子值设置为False。 5、保存这个工程。当Delphi提示读者提供单元文件名时,要确信当前目录为正确的目录。为SplashForm的单元文件名输入Splash。 6、将SplashForm的Enabled属性设置为False。这里不想让用户能够给窗口提供键盘和鼠标命令,这是极少见的情况之一。在这个例子中,我们想让程序对SplashForm的显示拥有完全的控制权。 7、由于窗口没有轮廓,所以从Additional组件类中插入一个Bevel组件对象。这有助于定义窗口的边缘。将Bevel1的Align属性设置为alClient。同时,将对象的Shape属性改变为bsFrame,将其Style属性改变为bsRaised。这些值由使用者来确定。 8、在SplashForm中插入想使用的组件,在这里不要插入任何按钮或者其他相互作用的控件。应用程序本身显示和去除启动溅射对话框。 9、选择Project菜单。高亮显示Splash工程个弹出式菜单。选择Options命令。在所产生的Project Options对话框中,选取Forms页标签。注意,MainForm和SplashForm位于自动创建的窗体列表中。高亮显示每个窗体并单击鼠标右按钮来将其移动到Available窗体。所有的Delphi窗体在运行时都是在内存中自动创建的,这要消耗内存和系统资源。在这样的一个案例中,程序是在运行时创建窗体的,读者应该从自动创建的列表中删除窗体。关闭ProjectOptions窗口。 10、接下来,修改工程的源代码,以便在显示主窗口之前显示溅射对话框。这里需要在工程文件中插入语句,以便与Splash.dpr工程文件相匹配。工程源代码如下:program Project3; uses Forms, main in main.pas MainForm, splash in splash.pas SplashForm; $R *.RES begin SplashForm:=TSplashForm.Create(Application); SplashForm.Show; SplashForm.Update; Application.CreateForm(TMainForm,MainForm); SplashForm.Close; Application.Run; end.11、如果这时编译和运行程序,它就非常快速地显示和去除启动溅射对话框,以至用户可能没机会见到它。为了强迫对话框保持几秒钟的可见时间,请选取程序的MainForm。为窗体的OnCreate命令创建一个处理器。在关键词的前面添加一个名为stopTime的长整型变量。在begin和end之间插入两个语句:一个为对Windows GetTickCount函数的调用。来将stopTime设置为Windows已在运行的秒数;另一个语句为while语句,这个语句另外延迟2秒钟。程序清单如下:unit main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMainForm = class(TForm) Exitbutton: TButton; procedure ExitbuttonClick(Sender: TObject); procedure FormCreate(Sender: TObject); private Private declarations public Public declarations end; var MainForm: TMainForm; implementation $R *.DFM procedure TMainForm.ExitbuttonClick(Sender: TObject); begin close; end; procedure TMainForm.FormCreate(Sender: TObject); var stopTime:LongInt; begin stopTime:=GetTickCount div 1000; while (GetTickCount div 1000)(stopTime+2) do Sleep(1); end; end.12、按F9编译、运行程序。LED数码管仿真显示程序在电子设备上广泛地使用LED数码管显示数据,在许多应用软件中也经常模拟LED数码管显示数据,使程序画面看起来很有特色。使用Delphi 程序实现LED数码管的仿真显示非常容易,具体步骤如下: 1启动Delphi 4.0。在“Tools”工具菜单上选择Delphi的图象编辑器“Image Editor”,建立一个新的位图,并设定位图的尺寸,宽为:48,高为:64。设定位图的底色为紫红色,前景色为红色。在位图上选择适当宽度的线条画出一个正方的8字,并将方型8字的各个拐角处用斜线断开,这样可使图象模拟的更加真实。完成后按文件名bitmap_0.bmp存储。然后用此文件复制9个文件,文件名分别为bitmap_1-9。用图象编辑器将这些方形的8字位图按文件名序号的顺序分别修改成09的数字位图,存储后备用。 2建立一个新的工程,在窗体Form1上添加“面板”元件Panel1,设定“面板”元件的属性:bevelouter=bmRaised; bvevelInner=bvLowered; BorderWidth=4,设置后在Panel1元件上形成一个凸起的边框。在Panel1上添加一个“画板”元件PaintBox1,将PaintBox1的属性Hight 和Width设定为64和318,并适当调整Panel1面板的尺寸,使其正好包围画板元件。 3在窗体中添加一个“图象列表”元件ImageList1,在元件上双击鼠标,调出添加图象对话框,将先前制作好的位图bitmap_0至bitmap_9按顺序添加进图象列表元件中去,使图象列表中位图的序号与位图本身代表的数字相同,并注意将位图设定为不透明。 4转到单元编辑窗口,在Tform1的类说明部分添加一个显示LED的过程说明语句: procedure display_LED(number:integer); 。 在implementation语句下面添加一个全局变量和对应上面过程说明的过程体。内容如下: implementation $R *.DFMvardis_number:integer;procedure Tform1.display_LED(number:integer);varI:integer;digital:array0.5of integer;begin 限制显示位数小于6位if number999999 then number:=0;for I:=0 to 5 do digitalI:=0;分离数字位I:=0;while (number)0 dobegindigitalI:=number mod 10;number:=number div 10;I:=I+1;end;显示数字for I:=5 downto 0 doimagelist1.draw(paintbox1.canvas, (5-I)*54,0,digitalI);end;5在Form1窗体的OnCreated 事件中输入语句:dis_number:=0; ,使显示的初始值为0。在画板元件的On Paint 事件中输入语句:display_LED(dis_number); ,此语句非常重要,它可以在初始启动时显示初值0,在窗口本身被覆盖后又恢复到前台时仍可显示正常的数值。至此已完成了显示函数的程序编制。在需要显示数字的程序中调用display_LED 函数就能将数字显示在LED 的仿真显示板上?揪倮绦蛑幌允?位以下的数字。 6为了测试显示效果,我们在窗体上增加一个编辑框元件Edit1,和一个按钮元件button1。用鼠标双击按钮元件跳转到Click事件编辑窗口,输入如下语句: dis_number:=strTOint(Edit1.text);display_LED(dis_number); 完成后按F9键编译并运行程序。在运行窗口的编辑框中输入6位以下的整数数字,点击按钮,编辑框中的数字就显示在LED仿真显示板上。 DELPHI中自适应表单的实现 我们知道,屏幕分辨率的设置影响着表单布局,假设你的机器上屏幕分辨率是800*600,而最终要分发应用的机器分辨率为640*480,或1024*768,这样你原先设计的表单在新机器上势必会走样。这时你一定希望表单能自己适应不同的分辨率,下面就有两种方法可供你参考。一、根据新的分辨率自动重画表单及控件先在表单单元的Interface部分定义两个常量,表示设计时的屏幕的宽度和高度(以像素为单位)。在表单的Create事件中先判断当前分辨率是否与设计分辨率相同,如果不同,调用表单的SCALE过程重新能调整表单中控件的宽度和高度。ConstOrignwidth=800;Orignheight=600;procedureTForm1.FormCreate(Sender:TObject);beginscaled:=true;if(screen.widthorignwidth)thenbeginheight:=longint(height)*longint(screen.height)divorignheight;width:=longint(width)*longint(screen.width)divorignwidth;scaleby(screen.width,orignwidth);end;end;SCALE过程在调整控件宽度和高度的同时,也自动调整控件字体的大小,以适应新的分辨率, 但美中不足的是它并不改变控件的顶点坐标位置,也就是说,该过程不改变控件之间的相对位置关系。要想调整控件之间的选队相对位置,还需要自己编程实现,有兴趣的读者可试一试。二、将机器分辨率更改为设计时的分辨率这种方法不改变表单本身,而是将屏幕分辨率更改为与表单设计时用到的分辨率相同。它需要用到WINDOWSAPI函数EnumDisplaySettings和ChangeDisplaySettings,前者取当前显示模式信息,后者则更改显示设置,具体参数的含义请参见DELPHI帮助。设计时宽度常量和高度常量的定义如方法一。procedureTForm1.FormCreate(Sender:TObject);vardevmode:tDevicemode;beginifscreen.widthorignwidththenbeginifEnumDisplaySettings(nil,0,devmode)thenbegindevmode.dmfields:=dm_pelswidthORdm_pelsheight;devmode.dmpelswidth:=orignwidth;宽度devmode.dmpelsheight:=orignheight;高度ChangeDisplaySettings(devmode,0);更改设置end;end;end; 以上两种方法在WINDOWS95+DELPHI3.0环境下均已通过,二者相比,前者是主动适应,后者则是被动适应。作非常规程序菜单掌握delphi高级秘籍 大家可能见过诸如金山毒霸,瑞星杀毒,以及五笔输入法等等在系统托盘(即右下角有时间和输入法图标的地方)在的控制菜单,而在正常的任务栏(即屏幕最下方的“开始”按钮的右边的各式各样)中却不出现按钮的程序,即我们常说的在后台运行的程序。如果自己的程序中也能有这样的话,那种与众不同的感觉真棒.预备知识:1:向系统托盘中加入图标控制菜单:向系统托盘中加入图标控制菜单须用到函数Shell_NotifyIconA,而这个函数又有两个参数:TnotifyIconDataA结构的参数和一个消息参数即:Shell_NotifyIconA(dwMessage:DWORD;lpData:PNotifyIconDataA),第一个参数dwMessage可以是以下值:NIM_ADD:增加一个图标 ;NIM_MODIFY:修改一个已有的图标 ;NIM_DELETE:删除一个已有的图标 ;第二个参数的TnotifyIconDataA结构如下:TnotifyIconDataA=recordcbSize:DWORD; 表示该结构的长度Wnd:HWND; 是调用Shell_NotifyIconA函数的窗口的句柄即HandleiID:UINT; 是在下面的uCallbackMessage参数指定的消息中使用的一个自定义数值uFlags:UINT; 决定该结构中的有效部分,如有NIF_MESSAGE则 uCallbackMessage参数有效 ;若有NIF_ICON 则hIcon有效;有 NIF_TIP则 szTip参数有效,当然你可以让这三个参数都有效只须要在这个参数中写成NIF_MESSAGE+NIF_ICON+NIF_TIP即可uCallbackMessage:UNIT; 当添加的图标上有鼠标事件如右击等等时系统向Wnd参数所指定的窗口发送消息,这个消息的Msg参数是uCallbackMessage,这个消息的wParam参数是 uID,这个消息的lParam参数是鼠标事件的 Msg值Icon:HICON; 是出现在系统托盘中的图标的句柄即handleszTip:array0.63 of AnsiChar; 即delphi是常用的hint即当鼠标停留在托盘图标上时的提示,例如你可用这是我的第一个托盘图标菜单end;:在状态栏上隐藏程序;在一般情况下我们在打开一个窗口或是一个程序时都会在任务条上出现按钮如在IE中每打开一个新的窗口在任务条上就有一个新的按钮,在这里我们的程序是用在系统托盘中图标控制菜单,程序在后台运行,即希望我们的程序不在任务条上出现按钮;这个可用函数SetWindowLong来实现,在我们这个程序中的代码如下:procedure TForm1.FormCreate(Sender: TObject);beginform1.Width:=1; form1.Height:=1; 让窗口在运行时表现为一个像素长宽的点form1.Left:=screen.Width-1; 让窗口在运行时在屏幕的右上角而不影响我们的桌面的操作 form1.top:=1;form1.Brush.Style:=bsclear; 让窗口在运行时在表现为透明setwindowlong(application.handle,gwl_exstyle,ws_ex_toolwindow); 让窗口在运行时不在任务栏上出现按钮end;:在程序中控制光驱的打开和关闭;当我们不再用手动的打开关闭光驱门时,我们的光驱寿命也就会相应延长,我们在程序中可用函数function mciSendString(lpstrCommand,lpstrReturnString:PChar;uReturnLength :UINT;hWndCallback:HWND):MCIERROR;stdcall; 其中lpstrComman参数表示一个MCI命令行,如:set cdaudio door open wait,set cdaudio door closed wait等等你可以delphi中的mmSystem.pas中查看详细说明;而参数lpstrReturnString表示接收返回信息的缓冲区指针,如果不需要返回值这里可写为nil,参数uReturnLength表示接收返回信息的缓冲区的长度,若上面为nil这里为0,hWndCallback参数表示回调窗口的句柄,在这里可写为handle;在我们的程序中原代码如下:打开光驱门:procedure TForm1.N1Click(Sender: TObject);beginmcisendstring(set cdaudio door open wait,nil,0,handle);end;关闭关驱门:procedure TForm1.N2Click(Sender: TObject);beginmcisendstring(set cdaudio door closed wait,nil,0,handle);end;:在程序中控制重启电脑和关闭计算机;退出WINDOWS可用的函数有ExitWindows()和ExitWindowsEx()在本程序中的代码如下:重启:procedure TForm1.N8Click(Sender: TObject);beginshowmessage(请先关闭并保存正在运行的程序);exitwindowsex(ewx_force or ewx_reboot,0);end;关闭计算机:procedure TForm1.N9Click(Sender: TObject);beginshowmessage(请先关闭并保存正在运行的程序);exitwindowsex(ewx_shutdown or ewx_poweroff,0);end;:实现光驱的自动播放和更改光驱图标都需要更改注册表;要实现注册表的读写我们用以下代码:例如有var reg:tregistry;reg:=tregistry.Create;reg.RootKey:=hkey_local_machine; 这里是注册表的主键reg.OpenKey(softwaremicrosoftwindowscurrentversionexplorershell icons,true); 这里是注册表的子键reg.WriteString(11,mn); 这里对注册表进行写操作 关于注册表的相关知识大家可参考电脑爱好者出版的注册表完全精通一书还有一点应特别注意的是在更改光驱图标时不仅要在注册表中更改,还要把c:windowsshelliconcache文件删除,这相关的关于文件操作的知识以及后面一些有关程序中加入声音等等大家一定都会,这里也就不再多说.用Delphi制作动态菜单 所谓动态菜单是指菜单项随着程序的操作变化而变化。现在,我们用Delphi来实现这一功能,具体步骤如下:1首先,确定动态菜单的数据来源,即要确定动态菜单标题是来自Windows的系统注册表,还是来自一个数据库,或者是来自一个子目录,主要由程序的功能而定。这里假设主窗口名为MainForm,上面已有主菜单,其动态菜单的数据源是一个String(字符串)类型的变量,名称为SubMenuItemSource。2确定生成的动态菜单的功能,即定义动态菜单的OnClick()事件,例如,动态菜单标题来自一个磁盘文件名时,那么程序在响应OnClick()事件时,可能的操作是要打开选中的文件。因此,对菜单所在的主窗口模块的单元程序的数,据我们需要定义Type后添加一个自定义的事件MyClick()。 然后,需要编写如下MyClick()事件的具体内容:procedure TMainForm.MyClick(Sender: TObject);/动态菜单OnClick事件响应begin Show.Message(TMenuItem(Sender).Caption);/显示选中的动态菜单标题,end; 这里调用的ShowMessage标准例程(在Dialogs.pas中)显示TMenuItem(Sender).Caption,它就是选择的菜单项的Caption,类似用TMenuItem(Sender).Name则是选择菜单项的Name。3.编写程序将动态菜单标题添加到指定的菜单顶下,并将其与OnClick()事件联系起来。将以下程序段添加到MainForm的OnCreate事件过程中,可在程序启动时完成动态菜单的动态生成:procedure TMainForm.FormCreate(Sender: TObject);var addSubItem:TMenuItem;i:Integer;begin for i:=0 to N do /N等于要添加的动态菜单数目,需事先定义为数值型变量,并赋值 begin addSubItem:= TMenuItem.Create(Self); addSubItem.Name := A+IntToStr(i); addSubItem.Caption := SubMenuItemSource; / 步骤1的SubMenuItemSource应先赋值FileOpenItem.Add(addSubItem); /在名称为FileOpenItem的菜单项下添加子菜单addSubItem.OnClick:=MyClick; / 步骤2的MyClick(),自定义菜单要响应的事件 endend; 为Windows窗口标题栏添加新按钮 对于我们熟悉的标准windows窗口来讲,标题栏上一般包含有3个按钮,即最大化按钮,最小化按钮和关闭按钮。你想不想在Windows的窗口标题栏上添加一个新的自定义按钮,满足你的个性化需求,从而也使自己的窗口更具特色呢?!下面我们就讨论一下在delphi中如何给窗口的标题栏上添加新的按钮。一、实现起来要定义以下过程:1、定义DrawCaptButton过程,这个过程的功能是在指定的位置画出按钮。在过程中要使用win32函数GetSystemMetrics得到窗口的大小和标题按钮的大小;使用delphi函数Bounds定义一个矩形,这个矩形就是新按钮的位置;再定义一个小的矩形,这个矩形是为了填写文本;最后就调用delphi中比较有用的函数drawbuttonface把按钮画出来。2、每次我们对窗口进行操作,例如,最大化操作或最小化操作,新按钮就会消失,为了解决这个问题,我们对所有的消息要进行处理,给每个消息编写一个过程对按钮进行重画。A、定义WMNCPaint(var Msg:TWMNCPaint)过程,处理消息WM_NCPaint。B、定义WMNCActivate(var Msg :TWMNCActivate)过程,处理消息WM_NCACTIVATE。C、定义WMSetText(var Msg:TWMSetText)过程,处理消息WM_SETTEXT。D、定义WMNCHitTest(var Msg :TWMNCHitTest)过程,处理消息WM_NCHITTEST。 E、定义WMNCLButtonDown(var Msg : TWMNCLButtonDown)过程,处理消息WM_NCLBUTTONDOWN。二、具体的源程序如下:我们结合源程序来讲述过程的实现,从中可以看出程序对win32函数的调用,以及drawbuttonface函数的使用方法。unit Main; interfaceusesWindows, Buttons, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;typeTForm1 = class(TForm)procedure FormResize(Sender: TObject);privateCaptionBtn : 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;varForm1: TForm1;implementationconsthtCaptionBtn = htSizeLast + 1;$R *.DFMprocedure TForm1.DrawCaptButton;file:/drawcapbuttton过程的具体实现varxFrame,yFrame,xSize,ySize : Integer;R : TRect;beginxFrame := GetSystemMetrics(SM_CXFRAME);yFrame := GetSystemMetrics(SM_CYFRAME);file:/把窗口的宽度置于变量xFrame,把窗口的高度置于变量yFramexSize:= GetSystemMetrics(SM_CXSIZE);ySize:= GetSystemMetrics(SM_CYSIZE);/ 把标题栏按钮的宽度置于变量xSize,把标题栏按钮的高度置于变量ySizeCaptionBtn := Bounds(Width - xFrame - 4*xSize + 2,yFrame + 2, xSize - 2, ySize - 4);file:/定义出新的标题按钮的位置,值放在变量CaptionBtn中Canvas.Handle := GetWindowDC(Self.Handle);file:/得到窗口的句柄 Canvas.Font.Name := Symbol;Canvas.Font.Color := clBlue;Canvas.Font.Style := fsBold;Canvas.Pen.Color := clYellow;Canvas.Brush.Color := clBtnFace;file:/定义画布的字体、画笔、刷子等属性tryDrawButtonFace(Canvas, CaptionBtn, 1, bsAutoDetect, False, False, False);file:/在画布上画出定义的按钮R := Bounds(Width - xFrame - 4 * xSize + 2,yFrame + 3, xSize - 6, ySize - 7);file:/在新按钮上画出一个小矩形with CaptionBtn doCanvas.TextRect(R, R.Left + 2, R.Top - 1, W);file:/在上面画出的小矩形上填写一个字符w字符finallyReleaseDC(Self.Handle, Canvas.Handle);Canvas.Handle := 0;file:/容错处理,如果出现异常,把句柄释放掉end;end;procedure TForm1.WMNCPaint(var Msg : TWMNCPaint);/WMNCPaint过程的具体实现,该过程在绘制窗口时被调用begininherited;/继承默认的消息处理程序DrawCaptButton;/对按钮进行重画end;procedure TForm1. (var Msg : TWMNCActivate);/ WMNCActivate过程与WMNCPaint过程实现方法相同,该过程在窗口的非客户区要更改为激活状态或非激活状态时被调用begininherited;DrawCaptButton;end;procedure TForm1.WMSetText(var Msg : TWMSetText);/ WMSetText过程与WMNCPaint过程实现方法相同,该过程在设置窗口的文本时被调用begininherited;DrawCaptButton;end;procedure TForm1.WMNCHitTest(var Msg : TWMNCHitTest);file:/ WMNCHitTest过程与WMNCPaint过程实现方法相同,该过程在光标移动或鼠标按钮被按下或鼠标按钮被释放时调用begininherited;with Msg doif PtInRect(CaptionBtn, Point(XPos - Left, YPos - Top) thenResult := htCaptionBtn;/判断鼠标所在位置是否在新按钮的矩形范围内,如果在返回新按钮的标识值end;procedure TForm1.WMNCLButtonDown(var Msg : TWMNCLButtonDown);/ WMNCLButtonDown过程与WMNCPaint过程实现方法相同,当光标处于窗口非客户区范围内鼠标左键被按下时调用该过程begininherited;if (Msg.HitTest = htCaptionBtn) thenShowMessage(你点击的是标题栏上的新按钮);file:/判断被点击的是否是新按钮,如果是显示上面的信息,在这里你可以按你的需要编写程序代码end;procedure TForm1.FormResize(Sender: TObject);beginPerform(WM_NCACTIVATE, Word(Active), 0); file:/如果窗口大小改变则重画标题栏end;end.三、程序执行结果如图1-1所示标题栏上出现一个新按钮图1-1通过以上的示例过程,相信你能根据自己的具体要求,利用Delphi设计出别具特色的Windows窗口来!用Delphi4实现风Word97格的工具栏用过Word97的人对它的工具栏印象很深刻,因为它的风格很“酷”,同样IE4.0的工具栏也有类似的风格,Win98的出现,使这种风格的工具栏得到了推广。其实,用Delphi4很容易实现具有Word97风格的工具栏。在Delphi4的元件选项板Additional页中,新增了Controlbar元件,此元件和Win32页中的Toolbar、Coolbar配合使用,再辅以Imagelist、Mainmenu等元件,完全可以实现具有Word97风格的工具栏。下面以一个FORM中的工具栏为例,详细介绍设计步骤:1?从Additional页中选择Controlbar,将其放入FORM1中,设置其属性如下:Allign:=altopAutosize:=trueBevelkind:=bknone2?从Win32页中选择Toolbar,将其放于Controlbar上,调整Toolbar的位置,使其置于最左,再调整其宽度,设置属性Edgeborders:=,Flat:=TRUE。用鼠标右击Toolbar,在浮动菜单上选择Newbutton,重复若干次,设计好所需的按钮。3?从Win32页中选择Imagelist元件,为FORM1设计主菜单,主菜单的设计方法同Delphi2、Delphi3。设计好主菜单后,将其属性Automerge置为TRUE。4?最后为每一个按钮分配Tmenuitem的Name值,将每个按钮的Menuitem属性值设为所需菜单的Name值。按F9运行程序,便可发现,设计出的工具栏已经具有Word97的风格,用鼠标在各个按钮上移动,按钮自动上浮,单击鼠标,弹出相应的菜单。需要说明的是,Mainmenu的属性Automerge置为TRUE,是为了不让主菜单出现在FORM1的最上端。工具栏的设计必须将Controlbar与Toolbar结合使用,不然得不到与Word97外观一样的工具栏。如何隐藏和显示Windows的任务条如果隐藏和显示Windows的任务条?仅仅调用以下的函数就可以. procedure hideTaskbar; /隐藏 var wndHandle : THandle; wndClass : array0.50 of Char; begin StrPCopy(wndClass0, Shell_TrayWnd); wndHandle := FindWindow(wndClass0, nil); ShowWindow(wndHandle, SW_HIDE); End; procedure showTaskbar; var wndHandle : THandle; wndClass : array0.50 of Char; begin StrPCopy(wndClass0, Shell_TrayWnd); wndHandle := FindWindow(wndClass0, nil); ShowWindow(wndHandle, SW_RESTORE); end; Delphi利用Windows GDI实现文字倾斜 一、引言在Delphi开发环境中,文字的输出效果一般都是头上脚下的正统字符,如何输出带有一定倾斜角度的文字以达到特殊的显示效果呢?笔者在制作公章辅助设计软件过程中,通过Windows图形设备接口函数实现了文字呈辐射状分布的功能。Windows图形设备接口(Graphics Device Interface)是Wi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论