delphi的精美界面设计.docx
《delphi的精美界面设计.docx》由会员分享,可在线阅读,更多相关《delphi的精美界面设计.docx(39页珍藏版)》请在冰豆网上搜索。
delphi的精美界面设计
Delphi界面设计专辑
[前言:
]界面的美观和用户亲和性是应用软件成功的首要条件,因此界面往往是程序员最费心的地方。
在这个专辑中,将向读者全面介绍Delphi中界面设计的原则和技巧
窗体设计
制作固定大小的Form
固定的Form像一个对话框,何不试试下面的语句
巧用Delphi制作溅射屏幕
精心编写的WINDOWS程序显示启动注意事项,称之为溅射屏幕(splashscreen)。
利用一点儿小小的内容,即可给程序的显示添加不少色彩
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利用WindowsGDI实现文字倾斜
在Delphi开发环境中,文字的输出效果一般都是头上脚下的"正统"字符,如何输出带有一定倾斜角度的文字以达到特殊的显示效果呢
Delphi之三十六计之界面篇
设置状态栏面板对象的Style为OwnerDraw,并在状态栏对象的DrawPanel事件中书写以下代码
利用COM技术实现外壳扩展的属性页
当用户在资源管理器中调用右键菜单时,会显示一个"属性"菜单项,点击属性菜单项会显示一个属性页,用户可以获得甚至修改文件信息
制作固定大小的Form
固定的Form像一个对话框,何不试试下面的语句?
C++Builder
请参照Delphi的例子
Delphi
您可以覆写CreateParams()这个TWinControl的虚拟程序,改变form的wc.Stylee,将WS_SYSMENU这个旗标解除,这样,就不会有左上角的
SystemMenuBox了.
至於不能移动.缩小/放大,可以自已拦下WM_NCHITTEST,然後一概回应滑鼠点在视窗
Client区域,相信这个视窗就呆呆的不会动了.
详情可以查一下Win32APIHelp的CreateWindow()与WM_NCHITTEST的说明.
unitUnit1;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,
Forms,Dialogs,StdCtrls;
type
TForm1=class(TForm)
Button1:
TButton;
procedureButton1Click(Sender:
TObject);
private
{Privatedeclarations}
procedureWMNCHitTest(varMsg:
TMessage);messageWM_NCHITTEST;
protected
procedureCreateParams(varParams:
TCreateParams);override;
public
{Publicdeclarations}
end;
var
Form1:
TForm1;
implementation
{$R*.DFM}
巧用Delphi制作溅射屏幕
精心编写的WINDOWS程序显示启动注意事项,称之为溅射屏幕(splashscreen)。
利用一点儿小小的内容,即可给程序的显示添加不少色彩。
由于工程本身创建程序的主窗口,且启动溅射屏幕必须在创建主窗口之前出现,所以工程文件必须创建自己的启动屏幕。
这意味着用户必须修改源代码来创建工程文件,而这通常在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|NewForm命令,或者单击NewForm速度按钮。
添加一个新的窗体。
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命令。
在所产生的ProjectOptions对话框中,选取Forms页标签。
注意,MainForm和SplashForm位于自动创建的窗体列表中。
高亮显示每个窗体并单击鼠标右按钮来将其移动到Available窗体。
所有的Delphi窗体在运行时都是在内存中自动创建的,这要消耗内存和系统资源。
在这样的一个案例中,程序是在运行时创建窗体的,读者应该从自动创建的列表中删除窗体。
关闭ProjectOptions窗口。
10、接下来,修改工程的源代码,以便在显示主窗口之前显示溅射对话框。
这里需要在工程文件中插入语句,以便与Splash.dpr工程文件相匹配。
工程源代码如下:
programProject3;
uses
Forms,
mainin‘main.pas‘{MainForm},
splashin‘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之间插入两个语句:
一个为对WindowsGetTickCount函数的调用。
来将stopTime设置为Windows已在运行的秒数;另一个语句为while语句,这个语句另外延迟2秒钟。
程序清单如下:
unitmain;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,
StdCtrls;
type
TMainForm=class(TForm)
Exitbutton:
TButton;
procedureExitbuttonClick(Sender:
TObject);
procedureFormCreate(Sender:
TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
end;
var
MainForm:
TMainForm;
implementation
{$R*.DFM}
procedureTMainForm.ExitbuttonClick(Sender:
TObject);
begin
close;
end;
procedureTMainForm.FormCreate(Sender:
TObject);
var
stopTime:
LongInt;
begin
stopTime:
=GetTickCountdiv1000;
while((GetTickCountdiv1000)<(stopTime+2))do
Sleep
(1);
end;
end.
12、按F9编译、运行程序。
LED数码管仿真显示程序
在电子设备上广泛地使用LED数码管显示数据,在许多应用软件中也经常模拟LED数码管显示数据,使程序画面看起来很有特色。
使用Delphi程序实现LED数码管的仿真显示非常容易,具体步骤如下:
1.启动Delphi4.0。
在“Tools”工具菜单上选择Delphi的图象编辑器“ImageEditor”,建立一个新的位图,并设定位图的尺寸,宽为:
48,高为:
64。
设定位图的底色为紫红色,前景色为红色。
在位图上选择适当宽度的线条画出一个正方的8字,并将方型8字的各个拐角处用斜线断开,这样可使图象模拟的更加真实。
完成后按文件名bitmap_0.bmp存储。
然后用此文件复制9个文件,文件名分别为bitmap_1-9。
用图象编辑器将这些方形的8字位图按文件名序号的顺序分别修改成0-9的数字位图,存储后备用。
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的过程说明语句:
proceduredisplay_LED(number:
integer);。
在implementation语句下面添加一个全局变量和对应上面过程说明的过程体。
内容如下:
implementation
{$R*.DFM}
var
dis_number:
integer;
procedureTform1.display_LED(number:
integer);
var
I:
integer;
digital:
array[0..5]ofinteger;
begin
{限制显示位数小于6位}
ifnumber>999999thennumber:
=0;
forI:
=0to5dodigital[I]:
=0;
{分离数字位}
I:
=0;
while(number)>0do
begin
digital[I]:
=numbermod10;
number:
=numberdiv10;
I:
=I+1;
end;
{显示数字}
forI:
=5downto0do
imagelist1.draw(paintbox1.canvas,(5-I)*54,0,digital[I]);
end;
5.在Form1窗体的OnCreated事件中输入语句:
dis_number:
=0;,使显示的初始值为0。
在画板元件的OnPaint事件中输入语句:
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过程重新能调整表单中控件的宽度和高度。
Const
Orignwidth=800;
Orignheight=600;
procedureTForm1.FormCreate(Sender:
TObject);
begin
scaled:
=true;
if(screen.width<>orignwidth)then
begin
height:
=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);
var
devmode:
tDevicemode;
begin
ifscreen.width<>orignwidththen
begin
ifEnumDisplaySettings(nil,0,devmode)then
begin
devmode.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=record
cbSize:
DWORD;{表示该结构的长度}
Wnd:
HWND;{是调用Shell_NotifyIconA函数的窗口的句柄即Handle}
iID:
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;{是出现在系统托盘中的图标的句柄即handle}
szTip:
array[0..63]ofAnsiChar;{即delphi是常用的hint即当鼠标停留在托盘图标上时的提示,例如你可用‘这是我的第一个托盘图标菜单’}
end;
2:
在状态栏上隐藏程序;
在一般情况下我们在打开一个窗口或是一个程序时都会在任务条上出现按钮如在IE中每打开一个新的窗口在任务条上就有一个新的按钮,在这里我们的程序是用在系统托盘中图标控制菜单,程序在后台运行,即希望我们的程序不在任务条上出现按钮;这个可用函数SetWindowLong来实现,在我们这个程序中的代码如下:
procedureTForm1.FormCreate(Sender:
TObject);
begin
form1.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;
3:
在程序中控制光驱的打开和关闭;
当我们不再用手动的打开关闭光驱门时,我们的光驱寿命也就会相应延长,我们在程序中可用函数
functionmciSendString(lpstrCommand,lpstrReturnString:
PChar;uReturnLength:
UINT;hWndCallback:
HWND):
MCIERROR;stdcall;
其中lpstrComman参数表示一个MCI命令行,如:
’setcdaudiodooropenwait‘,‘setcdaudiodoorclosedwait’等等你可以delphi中的mmSystem.pas中查看详细说明;而参数'lpstrReturnString'表示接收返回信息的缓冲区指针,如果不需要返回值这里可写为'nil',参数'uReturnLength'表示接收返回信息的缓冲区的长度,若上面为'nil'这里为'0','hWndCallback'参数表示回调窗口的句柄,在这里可写为'handle';
在我们的程序中原代码如下:
打开光驱门:
procedureTForm1.N1Click(Sender