delphi的精美界面设计

上传人:daj****de 文档编号:198428391 上传时间:2023-04-08 格式:DOCX 页数:42 大小:71.43KB
收藏 版权申诉 举报 下载
delphi的精美界面设计_第1页
第1页 / 共42页
delphi的精美界面设计_第2页
第2页 / 共42页
delphi的精美界面设计_第3页
第3页 / 共42页
资源描述:

《delphi的精美界面设计》由会员分享,可在线阅读,更多相关《delphi的精美界面设计(42页珍藏版)》请在装配图网上搜索。

1、Delphi界面设计专辑前言:界面的美观和用户亲和性是应用软件成功的首要条件,因此界面往往是程序员 最费心的地方。在这个专辑中,将向读者全面介绍Delphi中界面设计的原则和技巧窗体设计制作固定大小的Form固定的Form像一个对话框,何不试试下面的语句巧用Delphi制作溅射屏幕精心编写的WINDOWS程序显示启动注意事项,称之为溅射屏幕(splash screen)0利用一 点儿小小的内容,即可给程序的显示添加不少色彩LED数码管仿真显示程序在电子设备上广泛地使用LED数码管显示数据,在许多应用软件中也经常模拟LED数 码管显示数据,使程序画面看起来很有特色菜单设计DELPHI中自适应表单

2、的实现我们知道,屏幕分辨率的设置影响着表单布局,假设你的机器上屏幕分辨率是800*600,而 最终要分发应用的机器分辨率为640*480,或1024*768,这样你原先设计的表单在新机器上势 必会走样作非常规程序菜单掌握delphi高级秘籍大家可能见过诸如金山毒霸,瑞星杀毒,以及五笔输入法等等在系统托盘(即右下角有时 间和输入法图标的地方)在的控制菜单,而在正常的任务栏(即屏幕最下方的“开始”按钮的右 边的各式各样)中却不出现按钮的程序,即我们常说的在后台运行的程序用Delphi制作动态菜单所谓动态菜单是指菜单项随着程序的操作变化而变化。现在,我们用Delphi来实现这一 功能,具体步骤如下工

3、具栏和状态条为Windows窗口标题栏添加新按钮对于我们熟悉的标准windows窗口来讲,标题栏上一般包含有3个按钮,即最大化按钮, 最小化按钮和关闭按钮。你想不想在Windows的窗口标题栏上添加一个新的自定义按钮用Delphi4实现风Word97格的工具栏用过Word97的人对它的工具栏印象很深刻,因为它的风格很“酷”,同样IE4.0的工具栏也 有类似的风格,Win98的出现,使这种风格的工具栏得到了推广如何隐藏和显示Windows的任务条如果隐藏和显示Windows的任务条?仅仅调用以下的函数就可以.其他技巧Delphi利用Windows GDI实现文字倾斜在Delphi开发环境中,文字

4、的输出效果一般都是头上脚下的正统”字符,如何输出带有一 定倾斜角度的文字以达到特殊的显示效果呢Delphi之三十六计之界面篇设置状态栏面板对象的Style为OwnerDraw,并在状态栏对象的DrawPanel事件中书写以 下代码利用COM技术实现外壳扩展的属性页当用户在资源管理器中调用右键菜单时,会显示一个”属性”菜单项,点击属性菜单项会显示一个属性页,用户可以获得甚至修改文件信息 制作固定大小的Form 固定的Form像一个对话框,何不试试下面的语句?C+ Builder请参照Delphi的例子Delphi您可以覆写 CreateParams()这个TWinControl的虚拟程序,改变f

5、orm的wc.Stylee,将 WS_SYSMENU这个旗标解除,这样,就不会有左上角的SystemMenuBox 了.至於不能移动.缩小/放大,可以自已拦下WM_NCHITTEST,然废一概回应滑鼠点在视窗 Client区域,相信这个视窗就呆呆的不会动了.详情可以查一下 Win32API Help 的 CreateWindow()与 WM_NCHITTEST 的说明.unit Unitl;interfaceusesWindows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;typeTForml = cl

6、ass(TForm)Buttonl: TButton;procedure Button1Click(Sender: TObject);private( Private declarations procedure WMNCHitTest(var Msg: TMessage); message WM_NCHITTEST;protectedprocedure CreateParams(var Params: TCreateParams); override;public( Public declarations end;varForml: TForml;implementation$R *.DFM

7、巧用Delphi制作溅射屏幕精心编写的WINDOWS程序显示启动注意事项,称之为溅射屏幕(splash screen)0利用一 点儿小小的内容,即可给程序的显示添加不少色彩。由于工程本身创建程序的主窗口,且启动溅射屏幕必须在创建主窗口之前出现,所以工程 文件必须创建自己的启动屏幕。这意味着用户必须修改源代码来创建工程文件,而这通常在 DELPHI编程中是不需要的。下面的过程介绍了溅射屏幕的建立过程。l、开始一个新的工程。将窗体命名为MainForm,同时将其Caption属性设置为 SplashinDemo。把这个工程保存在一个目录中,如C:ProjectsSplashin。把MainForm

8、的单元命 名为Main,把工程文件命名为Splashin。2、在 MainForm中插入一个Button组件。将Button的Name属性改为ExitButton,而将 其Caption属性改为Exit。为ExitButton的OnClick事件创建一个处理器,在过程的begin和 end关键词之间插入Close;语句。3、选取FilelNew Form命令,或者单击New Form速度按钮。添加一个新的窗体。4、将这个窗体的 Name属性改变为SplashForm,删除其Caption属性。此外,将其 BorderStyle属性改变为bsnone,同时将Bordericons下的三个子值设置

9、为False。5、保存这个工程。当Delphi提示读者提供单元文件名时,要确信当前目录为正确的目录。 为SplashForm的单元文件名输入Splash。6、将SplashForm的Enabled属性设置为False。这里不想让用户能够给窗口提供键盘和 鼠标命令,这是极少见的情况之一。在这个例子中,我们想让程序对SplashForm的显示拥有完 全的控制权。7、由于窗口没有轮廓,所以从Additional组件类中插入一个Bevel组件对象。这有助于 定义窗口的边缘。将Bevel1的Align属性设置为alClient。同时,将对象的Shape属性改变为 bsFrame,将其Style属性改变为

10、bsRaised。这些值由使用者来确定。8、在SplashForm中插入想使用的组件,在这里不要插入任何按钮或者其他相互作用的 控件。应用程序本身显示和去除启动溅射对话框。9、选择Project菜单。高亮显示Splash工程个弹出式菜单。选择Options命令。在所产 生的Project Options对话框中,选取Forms页标签。注意,MainForm和SplashForm位于自动 创建的窗体列表中。高亮显示每个窗体并单击鼠标右按钮来将其移动到Available窗体。所 有的Delphi窗体在运行时都是在内存中自动创建的,这要消耗内存和系统资源。在这样的一 个案例中,程序是在运行时创建窗体

11、的,读者应该从自动创建的列表中删除窗体。关闭 ProjectOptions 窗口。10、接下来,修改工程的源代码,以便在显示主窗口之前显示溅射对话框。这里需要在工程文 件中插入语句,以便与Splash.dpr工程文件相匹配。工程源代码如下:program Project3;usesForms,main in main.pas (MainForm),splash in splash.pas (SplashForm);$R *.RESbeginSplashForm:=TSplashForm.Create(Application);SplashForm.Show;SplashForm.Update;

12、Application.CreateForm(TMainForm,MainForm);SplashForm.Close;Application.Run;end.11、如果这时编译和运行程序,它就非常快速地显示和去除启动溅射对话框,以至用户可 能没机会见到它。为了强迫对话框保持几秒钟的可见时间,请选取程序的MainForm。为窗体 的OnCreate命令创建一个处理器。在关键词的前面添加一个名为stopTime的长整型变量。 在begin和end之间插入两个语句:一个为对 Windows GetTickCount函数的调用。来将 stopTime设置为Windows已在运行的秒数;另一个语句为w

13、hile语句,这个语句另外延迟2秒 钟。程序清单如下:unit main;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;typeTMainForm = class(TForm)Exitbutton: TButton;procedure ExitbuttonClick(Sender: TObject);procedure FormCreate(Sender: TObject);private( Private declarations public( P

14、ublic declarations end;varMainForm: TMainForm;implementation$R *.DFMprocedure TMainForm.ExitbuttonClick(Sender: TObject);beginclose;end;procedure TMainForm.FormCreate(Sender: TObject);varstopTime:LongInt;beginstopTime:=GetTickCount div 1000;while (GetTickCount div 1000) 999999 then number:=0;for I:=

15、0 to 5 do digitalI:=0;分离数字位I:=0;while (number)0 dobegindigitalI:=number mod l0;number:=number div l0;I:=I+l;end;显示数字for I:=5 downto 0 doimagelistl.draw(paintboxl.canvas, (5-I)*54,0,digitalI);end;5. 在Forml窗体的OnCreated事件中输入语句:dis_number:=0;,使显示的初始值为0。 在画板元件的On Paint事件中输入语句:display_LED(dis_number);,此语句

16、非常重要,它可以 在初始启动时显示初值0,在窗口本身被覆盖后又恢复到前台时仍可显示正常的数值。至此已 完成了显示函数的程序编制。在需要显示数字的程序中调用display_LED函数就能将数字 显示在LED的仿真显示板上?揪倮口绦蛑幌允?位以下的数字。6. 为了测试显示效果,我们在窗体上增加一个编辑框元件Edit l,和一个按钮元件buttonl 0 用鼠标双击按钮元件跳转到Click事件编辑窗口,输入如下语句:dis_number:=strTOint(Edit1.text);display_LED(dis_number);完成后按F9键编译并运行程序。在运行窗口的编辑框中输入6位以下的整数数字

17、,点击 按钮,编辑框中的数字就显示在LED仿真显示板上。DELPHI中自适应表单的实现我们知道,屏幕分辨率的设置影响着表单布局,假设你的机器上屏幕分辨率是800*600,而 最终要分发应用的机器分辨率为640*480,或1024*768,这样你原先设计的表单在新机器上势 必会走样。这时你一定希望表单能自己适应不同的分辨率,下面就有两种方法可供你参考。一、根据新的分辨率自动重画表单及控件先在表单单元的Interface部分定义两个常量,表示设计时的屏幕的宽度和高度(以像素为 单位)。在表单的Create事件中先判断当前分辨率是否与设计分辨率相同,如果不同,调用表单 的SCALE过程重新能调整表单

18、中控件的宽度和高度。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

19、;end;SCALE过程在调整控件宽度和高度的同时,也自动调整控件字体的大小,以适应新的分 辨率,但美中不足的是它并不改变控件的顶点坐标位置,也就是说,该过程不改变控件之间的 相对位置关系。要想调整控件之间的选队相对位置,还需要自己编程实现,有兴趣的读者可试 一试。二、将机器分辨率更改为设计时的分辨率这种方法不改变表单本身,而是将屏幕分辨率更改为与表单设计时用到的分辨率相同。它需要用到 WINDOWSAPI 函数 EnumDisplaySettings 和 ChangeDisplaySettings,前者取当前 显示模式信息,后者则更改显示设置,具体参数的含义请参见DELPHI帮助。设计时宽度

20、常量 和高度常量的定义如方法一。procedureTForm1.FormCreate(Sender:TObject);vardevmode:tDevicemode;beginifscreen.widthorignwidththenbeginifEnumDisplaySettings(nil,0,devmode)thenbegindevmode.dmfields:=dm_pelswidthORdm_pelsheight;devmode.dmpelswidth:=orignwidth;宽度devmode.dmpelsheight:=orignheight; 高度ChangeDisplaySetti

21、ngs(devmode,0);更改设置end;end;end;以上两种方法在WINDOWS95+DELPHI3.0环境下均已通过,二者相比,前者是主动适应, 后者则是被动适应。作非常规程序菜单掌握delphi高级秘籍大家可能见过诸如金山毒霸,瑞星杀毒,以及五笔输入法等等在系统托盘(即右下角有时 间和输入法图标的地方)在的控制菜单,而在正常的任务栏(即屏幕最下方的“开始”按钮的右 边的各式各样)中却不出现按钮的程序,即我们常说的在后台运行的程序。如果自己的程序中 也能有这样的话,那种与众不同的感觉真棒.预备知识:1:向系统托盘中加入图标控制菜单:向系统托盘中加入图标控制菜单须用到函数Shell_

22、NotifyIconA,而这个函数又有两个参 数 :TnotifylconDataA 结构的参数和一个消息参数 即:Shell_NotifyIconA(dwMessage:DWORD;lpData:PNotifyIconDataA),第一个参数 dwMessage 可以是 以下值:NIM_ADD:增加一个图标 ;NIM_MODIFY:修改一个已 有的图 标;NIM_DELETE删除一个已有的图标;第二个参数的TnotifyIconDataA结构如下:TnotifyIconDataA=recordcbSize:DWORD; 表示该结构的长度Wnd:HWND; 是调用 Shell_NotifyIc

23、onA 函数的窗口的句柄即 HandleiID:UINT; 是在下面的uCallbackMessage参数指定的消息中使用的一个自定义数值 uFlags:UINT; 决定该结构中的有效部分,如有NIF_MESSAGE贝0 uCallbackMessage参数有 效;若有NIF_ICON则hIcon有效;有NIF_TIP则szTip参数有效,当然你可以让这三个参数 都有效只须要在这个参数中写成NIF_MESSAGE+NIF_ICON+NIF_TIP即可 uCallbackMessage:UNIT; 当添加的图标上有鼠标事件如右击等等时系统向Wnd参数所指定 的窗口发送消息,这个消息的Msg参数是

24、uCallbackMessage,这个消息的wParam参数是uID, 这个消息的lParam参数是鼠标事件的Msg值Icon:HICON; 是出现在系统托盘中的图标的句柄即handleszTip:array0.63 of AnsiChar; 即delphi是常用的hint即当鼠标停留在托盘图标上时的提示, 例如你可用这是我的第一个托盘图标菜单end;2 :在状态栏上隐藏程序;在一般情况下我们在打开一个窗口或是一个程序时都会在任务条上出现按钮如在IE中 每打开一个新的窗口在任务条上就有一个新的按钮,在这里我们的程序是用在系统托盘中图 标控制菜单,程序在后台运行,即希望我们的程序不在任务条上出现

25、按钮;这个可用函数 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_e

26、x_toolwindow); 让窗口在运行时不在 任务栏上出现按钮end;3 :在程序中控制光驱的打开和关闭;当我们不再用手动的打开关闭光驱门时,我们的光驱寿命也就会相应延长,我们在程序中 可用函数function mciSendString(lpstrCommand,lpstrReturnString:PChar;uReturnLength :UINT;hWndCallback:HWND):MCIERROR;stdcall;其中 lpstrComman 参数表示一个 MCI 命令行,如set cdaudio door open wait,set cdaudio door closed wai

27、f等等你可以delphi中的 mmSystem.pas中查看详细说明;而参数 lpstrReturnString表示接收返回信息的缓冲区指针,如果不需要返回值这里可写为nil,参数 uReturnLength表示接收返回信息的缓冲区的长度,若上面为ni l这里为0,hWndCallback参数 表示回调窗口的句柄,在这里可写为handle;在我们的程序中原代码如下:打开光驱门:procedure TForm1.N1Click(Sender: TObject);beginmcisendstring(set cdaudio door open wait,nil,0,handle);end;关闭关驱

28、门:procedure TForm1.N2Click(Sender: TObject);beginmcisendstring(set cdaudio door closed wait,nil,0,handle);end;4:在程序中控制重启电脑和关闭计算机;退出WINDOWS可用的函数有ExitWindows() 和ExitWindowsEx()在本程序中的代码如下:重启:procedure TForm1.N8Click(Sender: TObject);beginshowmessage(请先关闭并保存正在运行的程序);exitwindowsex(ewx_force or ewx_reboot

29、,0);end;关闭计算机:procedure TForm1.N9Click(Sender: TObject);beginshowmessage(请先关闭并保存正在运行的程序);exitwindowsex(ewx_shutdown or ewx_poweroff,0); end;5 :实现光驱的自动播放和更改光驱图标都需要更改注册表;要实现注册表的读写我们 用以下代码:例如有var reg:tregistry;reg:=tregistry.Create;reg.RootKey:=hkey_local_machine; (这里是注册表的主键reg.OpenKey(softwaremicrosof

30、twindowscurrentversionexplorershell icons,true); 这里是注 册表的子键reg.WriteString(11,mn); 这里对注册表进行写操作关于注册表的相关知识大家可参考电脑爱好者出版的VV注册表完全精通一 书还有一点应特别注意的是在更改光驱图标时不仅要在注册表中更改,还要把 c:windowsshelliconcache文件删除,这相关的关于文件操作的知识以及后面一些有关程序中 加入声音等等大家一定都会,这里也就不再多说.用Delphi制作动态菜单所谓动态菜单是指菜单项随着程序的操作变化而变化。现在,我们用Delphi来实现这一 功能,具体步骤

31、如下:1. 首先,确定动态菜单的数据来源,即要确定动态菜单标题是来自Windows的系统注册 表,还是来自一个数据库,或者是来自一个子目录,主要由程序的功能而定。这里假设主窗口名 为MainForm,上面已有主菜单,其动态菜单的数据源是一个String(字符串)类型的变量,名称为 SubMenultemSource。2. 确定生成的动态菜单的功能,即定义动态菜单的OnClick()事件,例如,动态菜单标题来 自一个磁盘文件名时,那么程序在响应OnClick()事件时,可能的操作是要打开选中的文件。因 此,对菜单所在的主窗口模块的单元程序的数,据我们需要定义Type后添加一个自定义的事 件 My

32、Click()。然后,需要编写如下MyClick()事件的具体内容:procedure TMainForm.MyClick(Sender: TObject);/动态菜单 OnClick 事件响应beginShow.Message(TMenuItem(Sender).Caption);/ 显示选中的动态菜单标题,end;这里调用的 ShowMessage 标准例程(在 Dialogs.pas 中)显示 TMenuItem(Sender).Caption, 它就是选择的菜单项的Caption,类似用TMenuItem(Sender).Name则是选择菜单项的Name。3. 编写程序将动态菜单标题添

33、加到指定的菜单顶下,并将其与OnClick()事件联系起来。 将以下程序段添加到MainForm的OnCreate事件过程中,可在程序启动时完成动态菜单的动态生成:procedure TMainForm.FormCreate(Sender: TObject);varaddSubItem:TMenuItem;i:Integer;beginfor i:=0 to N do /N等于要添加的动态菜单数目,需事先定义为数值型变量,并赋值beginaddSubItem:= TMenuItem.Create(Self);addSubItem.Name := A+IntToStr(i);addSubItem

34、.Caption := SubMenuItemSource; / 步骤 1 的 SubMenuItemSource 应先赋值 FileOpenItem.Add(addSubItem); /在名称为 FileOpenItem 的菜单项下添加子菜单 addSubItem.OnClick:=MyClick; /步骤2的MyClick(),自定义菜单要响应的事件 end end;为Windows窗口标题栏添加新按钮对于我们熟悉的标准windows窗口来讲,标题栏上一般包含有3个按钮,即最大化按钮, 最小化按钮和关闭按钮。你想不想在Windows的窗口标题栏上添加一个新的自定义按钮,满 足你的个性化需求

35、,从而也使自己的窗口更具特色呢?!下面我们就讨论一下在delphi中如何给窗口的标题栏上添加新的按钮。一、实现起来要定义以下过程:1、定义DrawCaptButton过程,这个过程的功能是在指定的位置画出按钮。在过程中要使用win32函数GetSystemMetrics得到窗口的大小和标题按钮的大小;使用 delphi函数Bounds定义一个矩形,这个矩形就是新按钮的位置;再定义一个小的矩形,这个矩 形是为了填写文本;最后就调用delphi中比较有用的函数drawbuttonface把按钮画出来。2、每次我们对窗口进行操作,例如,最大化操作或最小化操作,新按钮就会消失,为了解决 这个问题,我们

36、对所有的消息要进行处理,给每个消息编写一个过程对按钮进行重画。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 : TWMNCLBut

37、tonDown)过程,处理消息 WM_NCLBUTTONDOWN。二、具体的源程序如下:我们结合源程序来讲述过程的实现,从中可以看出程序对win32函数的调用,以及 drawbuttonface函数的使用方法。unit Main;interfaceusesWindows, Buttons, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;typeTForml = class(TForm)procedure FormResize(Sender: TObject);privateCaptionBtn : TRect;p

38、rocedure 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 WMN

39、CLButtonDown(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 := Get

40、SystemMetrics(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);fi

41、le:/定义出新的标题按钮的位置,值放在变量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, bsAut

42、oDetect, 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:/

43、容错处理,如果出现异常,把句柄释放掉end;end;procedure TForm1.WMNCPaint(var Msg : TWMNCPaint);/WMNCPaint过程的具体实现,该过程在绘制窗口时被调用begininherited;/继承默认的消息处理程序DrawCaptButton;/对 按钮进行重画end;procedure TForm1. (var Msg : TWMNCActivate);/ WMNCActivate过程与WMNCPaint过程实现方法相同,该过程在窗口的非客户区要更改 为激活状态或非激活状态时被调用begininherited;DrawCaptButton;e

44、nd;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(CaptionBt

45、n, Point(XPos - Left, YPos - Top) thenResult := htCaptionBtn;/判断鼠标所在位置是否在新按钮的矩形范围内,如果在返回新 按钮的标识值end;procedure TForm1.WMNCLButtonDown(var Msg : TWMNCLButtonDown);/ WMNCLButtonDown过程与WMNCPaint过程实现方法相同,当光标处于窗口非客户 区范围内鼠标左键被按下时调用该过程begininherited;if (Msg.HitTest = htCaptionBtn) thenShowMessage(你点击的是标题栏上的

46、新按钮);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的人对它的工具栏印象很

47、深刻,因为它的风格很“酷”,同样IE4.0的工具栏也 有类似的风格,Win98的出现,使这种风格的工具栏得到了推广。其实,用Delphi4很容易实现 具有Word97风格的工具栏。在Delphi4的元件选项板Additional页中,新增了 Controlbar元件,此元件和 Win32页中的 Toolbar、Coolbar配合使用,再辅以Imagelist Mainmenu等元件,完全可以实现具有Word97 风格的工具栏。下面以一个FORM中的工具栏为例,详细介绍设计步骤:1?从 Additional页中选择Controlbar,将其放入FORM1中,设置其属性如 下:Allign:=al

48、topAutosize:=trueBevelkind:=bknone2?从Win32页中选择Toolbar将其放于Controlbar上,调整Toolbar的位置,使其置于最左, 再调整其宽度,设置属性Edgeborders:=,Flat:=TRUE。用鼠标右击Toolbar,在浮动菜单上选择 Newbutton,重复若干次,设计好所需的按钮。3?从Win32页中选择Imagelist元件,为FORM1设计主菜单,主菜单的设计方法同 Delphi2、Delphi3。设计好主菜单后,将其属性Automerge置为TRUE。4?最后为每一个按钮分配Tmenuitem的Name值,将每个按钮的Men

49、uitem属性值设为所 需菜单的Name值。按F9运行程序,便可发现,设计出的工具栏已经具有Word97的风格,用鼠标在各个按钮上 移动,按钮自动上浮,单击鼠标,弹出相应的菜单。需要说明的是,Mainmenu的属性Automerge 置为TRUE,是为了不让主菜单出现在FORM1的最上端。工具栏的设计必须将Controlbar与 Toolbar结合使用,不然得不到与Word97外观一样的工具栏。如何隐藏和显示Windows的任务条如果隐藏和显示Windows的任务条?仅仅调用以下的函数就可以.procedure hideTaskbar; 隐藏varwndHandle : THandle;wnd

50、Class : array0.50 of Char;beginStrPCopy(wndClass0, Shell_TrayWnd);wndHandle := FindWindow(wndClass0, nil);ShowWindow(wndHandle, SW_HIDE);End;procedure showTaskbar;varwndHandle : THandle;wndClass : array0.50 of Char;beginStrPCopy(wndClass0, Shell_TrayWnd);wndHandle := FindWindow(wndClass0, nil);ShowW

51、indow(wndHandle, SW_RESTORE);end;Delphi利用Windows GDI实现文字倾斜在Delphi开发环境中,文字的输出效果一般都是头上脚下的正统”字符,如何输出带有一 定倾斜角度的文字以达到特殊的显示效果呢?笔者在制作公章辅助设计软件过程中,通过 Windows图形设备接口函数实现了文字呈辐射状分布的功能。Windows图形设备接口(Graphics Device Interface)是Windows系统中的图形核心模块, 以GDI.EXE形式提供给开发者使用o Windows中的图形基本上是由GDI.EXE中的函数来处 理的,它的主要特点是在输出设备上支持与

52、设备无关的图形。在GDI函数中,文本亦被视为一 种图形对象,但并非简单的几何方式绘制,因为文本的输出涉及到字体。根据Windows中字体所用的技术可以分为3类字体:光栅字体,矢量字体和TrueType字 体。其中,True Type字体的主要优点之一是可被任意放大或旋转,在任何尺寸上,都可以达到 较为满意的显示效果,尤其,其允许在显示器和打印机上使用相同的字体。Windows为应用程 序之所以能够提供设备无关性是通过采用让应用程序创建逻辑对象从而使用物理对象的方 法实现的,同样,对于字体的使用也是一样的:应用程序在使用字体时,首先创建逻辑字体,以便 Windows从设备中选择一种与之匹配的物理

53、字体,从而达到较为准确的输出效果。使用Windows GDI函数实现文字的倾斜效果的基本步骤如下:1. 取得设备描述表或图形设备的句柄:HDC GetDc(Thandle AWinHandle);2. 创建逻辑字体并设置文字的倾斜度:HFont CreateFontIndirect(LogFont Far *Iplf),其中,Iplf为tagLogFont结构体,通过设置其lfEscapement可设置文字的倾斜度(为实际 度数的10倍),例如:0度-正常字体,450度-左上45度倾斜,900度-正向左,等。3. 将逻辑字体选入设备列表,从而,Windows选择与之匹配的物理字体,并且新的字体

54、取代 旧的字体:HGDIOBJ SelectObject(HDC hdc,HGDIOBJ hgdiobj);注:在此之前现4. 使用当前设备的字体进行文字输出:BOOL TextOut(HDC hdc, int PosX, int PosY LPCTSTR OutStr, int StrLength);5. 释放不再使用的图形对象(这里为逻辑字体):BOOL DeleteObject(HGDIOBJ hObject);6. 释放设备描述表或图形设备的句柄,函数声明如下:ReleaseDc(THandle AWinHandle,HDC Dc);注:上述过程要求在窗口的Paint事件中编写重新绘画

55、或绘制文字的代码。二、程序实现在Delphi5.0中新建一个工程,在主窗体的Paint事件中编写如下代码:procedure TForm1.FormPaint(Sender: TObject);varFLogFont : tagLogFontA; file:/逻辑字体-结构体类型hTempFont, hPrevFont: HFONT; file:/字 体句柄hTempDC: HDC; file:/设备描述表或图形设备句柄TempString: string; file:/输出的文字beginFLogFont.lfHeight := 10; file:/字 高FLogFont.lfWidth :

56、= 10; file:/字 宽FLogFont.lfWeight := 1; file:/字 体笔划粗细程度FLogFont.lfUnderline := 0; file:/没 有下划线FLogFont.lfStrikeOut := 0; file:/没 有删除线FLogFont.lfItalic := 0; file:/斜 体效果否FLogFont.lfCharSet := GB2312_CHARSET; file:/字 符集FLogfont.lfEscapement := 450; file:/倾斜度FLogFont.lfOrientation := 450; file:/ 方向与倾斜度取

57、值同FLogFont.lfFaceName :=宋体;file:/字 体名称file:/创建逻辑字体hTempFont := CreateFontIndirect(FLogFont);TempString :=测试;file:/取得窗口的设备句柄hTempDC := GetDC(Handle);file:/取出窗口设备的当前字体,并替换为新字体hPrevFont := SelectObject(hTempDC, hTempFont);file:/设置设备窗口的文字色彩SetTextColor(hTempDc, clRed);file:/输出文字TextOut(hTempDc, 200 , 20

58、0, PChar(TempString), Length(TempString);file:/恢复原有的字体SelectObject(hTempDc, hPrevFont);file:/删除逻辑字体DeleteObject(hTempFont);file:/释放设备接口ReleaseDC(Handle, hTempDC);end;以上代码若不写在窗体的Paint事件,则当窗体接收到重绘消息时,默认的窗口绘制过程将重 新绘制窗口而使倾斜文字消失。三、结束语以上,只是Windows GDI接口函数使用的一个具体例子,希望能对广大读者起到抛砖引 玉的作用,利用Windows GDI接口函数编写出更为

59、丰富多彩的的文字效果。Delphi之三十六计之界面篇1. 为MDI窗体客户区填充位图在主窗体中添加Imagel控件/申明privateFClientInstance : TFarProc;FPrevClientPro 0 to ClientWidth div Imagel.Picture.Width doBitBlt(Dc,Col * Imagel.Picture.Width,Row * Imagel.Picture.Height,Imagel.Picture.Width,Imagel.Picture.Height,Imagel.Picture.Bitmap.Canvas.Handle,0,0,SRCCOPY);

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!