当前位置:首页 > delphi界面美化
的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(),自定义菜单要响应的事件 end end;
为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; interface uses
Windows, Buttons, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type
TForm1 = class(TForm)
procedure FormResize(Sender: TObject); private
CaptionBtn : 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; var
Form1: TForm1; implementation const
htCaptionBtn = htSizeLast + 1; {$R *.DFM}
procedure TForm1.DrawCaptButton; file://drawcapbuttton过程的具体实现 var
xFrame, yFrame, xSize,
ySize : Integer; R : TRect; begin
xFrame := GetSystemMetrics(SM_CXFRAME); yFrame := GetSystemMetrics(SM_CYFRAME);
file://把窗口的宽度置于变量xFrame,把窗口的高度置于变量yFrame xSize:= GetSystemMetrics(SM_CXSIZE); ySize:= GetSystemMetrics(SM_CYSIZE);
// 把标题栏按钮的宽度置于变量xSize,把标题栏按钮的高度置于变量ySize CaptionBtn := 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://定义画布的字体、画笔、刷子等属性 try
DrawButtonFace(Canvas, CaptionBtn, 1, bsAutoDetect, False, False, False); file://在画布上画出定义的按钮
R := Bounds(Width - xFrame - 4 * xSize + 2, yFrame + 3, xSize - 6, ySize - 7);
file://在新按钮上画出一个小矩形 with CaptionBtn do
Canvas.TextRect(R, R.Left + 2, R.Top - 1, 'W');
file://在上面画出的小矩形上填写一个字符'w'字符 finally
ReleaseDC(Self.Handle, Canvas.Handle); Canvas.Handle := 0;
file://容错处理,如果出现异常,把句柄释放掉 end; end;
procedure TForm1.WMNCPaint(var Msg : TWMNCPaint);
//WMNCPaint过程的具体实现,该过程在绘制窗口时被调用 begin
inherited;//继承默认的消息处理程序 DrawCaptButton;//对按钮进行重画 end;
procedure TForm1. (var Msg : TWMNCActivate);
// WMNCActivate过程与WMNCPaint过程实现方法相同,该过程在窗口的非客户区要更改为激活状态或非激活状态时被调用 begin
inherited;
DrawCaptButton; end;
procedure TForm1.WMSetText(var Msg : TWMSetText);
// WMSetText过程与WMNCPaint过程实现方法相同,该过程在设置窗口的文本时被调用 begin
inherited;
DrawCaptButton; end;
procedure TForm1.WMNCHitTest(var Msg : TWMNCHitTest);
file:// WMNCHitTest过程与WMNCPaint过程实现方法相同,该过程在光标移动或鼠标按钮被按下或鼠标按钮被释放时调用 begin
inherited; with Msg do
if PtInRect(CaptionBtn, Point(XPos - Left, YPos - Top)) then
Result := htCaptionBtn;//判断鼠标所在位置是否在新按钮的矩形范围内,如果在返回新按钮的标识值 end;
procedure TForm1.WMNCLButtonDown(var Msg : TWMNCLButtonDown);
// WMNCLButtonDown过程与WMNCPaint过程实现方法相同,当光标处于窗口非客户区范围内鼠标左键被按下时调用该过程 begin
inherited;
if (Msg.HitTest = htCaptionBtn) then
ShowMessage('你点击的是标题栏上的新按钮');
file://判断被点击的是否是新按钮,如果是显示上面的信息,在这里你可以按你的需要编写程序代码
end;
procedure TForm1.FormResize(Sender: TObject); begin
Perform(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:=bknone
2?从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 : array[0..50] of Char; begin
StrPCopy(@wndClass[0], Shell_TrayWnd);
wndHandle := FindWindow(@wndClass[0], nil); ShowWindow(wndHandle, SW_HIDE); End;
procedure showTaskbar; var
wndHandle : THandle;
共分享92篇相关文档