您说的“Menu”是指什么?delphi的控件基本都可以拖动。
解决方案 »
- delphi 关于窗体继承的问题
- Windows关机函数ExitWindowsEx使用大全(适用Windows所有操作平台)
- 如何将Form封装成一个控件,程序调用此控件的函数能实现弹出、传递值等?
- 如何实现像winamp根据音乐频率跳动的竖线
- TRefType=class of Control;是什么意思?
- ??ActiveForm和Inf文件的困惑??
- 请问我应该如何做呢?
- 寻找扫描(免费)控件 急 求援
- 请问DbGrid中的ftLookUp列如何自动下拉菜单?
- 如何在Delphi中通过ODBC连ORACLE8.0.4
- 请问如何捕获驱动器增加的消息?
- 我也提个Access2000中的日期问题
用DELPHI实现窗体标题栏上的按钮 摘要:要在标题栏放置按钮(非系统按钮),用普通的方法是无法实现的,因为我们无法将DELPHI提供的按钮控件放置到标题栏上。DELPHI提供了一个很好用的函数DrawButtonFace,它允许用户在任何画布(canvas)上画出一个按钮,而标题栏也是画布,因此在标题栏上画出一个按钮也就不是很困难的事了,本文给出一个
示例,供感兴趣的朋友参考。 曾见到过一个软件在标题栏放置了按钮(非系统按钮),那么这种技术如何实现的呢?用普通的方法是无法实现的,因为我们无法将DELPHI提供的按钮控件放置到标题栏上。DELPHI提供了一个很好用的函数DrawButtonFace,它允许用户在任何画布(canvas)上画出一个按钮,而标题栏也是画布,因此在标题栏上画出一个按钮也就不是很困难的事了,本文给出一个示例,供感兴趣的朋友参考。 要在标题栏上画按钮,还有一些事情需要考虑,我们必须考虑各种消息事件,比如窗体从后台激活到前台时、窗体的Paint消息等,遇到这些消息就必须重画按钮,否则按钮将会消失,但这些不会对系统造成过多的负担。为方便大家使用,给出完整的源程序并给出注释。unit Unit1;interfaceuses
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;implementationconst
htCaptionBtn = htSizeLast + 1;
{$R *.DFM}procedure TForm1.DrawCaptButton;
var
xFrame,
yFrame,
xSize,
ySize : Integer;
R : TRect;
begin
//获取窗体的边框尺寸
xFrame := GetSystemMetrics(SM_CXFRAME);
yFrame := GetSystemMetrics(SM_CYFRAME);//获取标题按钮的尺寸
xSize := GetSystemMetrics(SM_CXSIZE);
ySize := GetSystemMetrics(SM_CYSIZE);//定义一个新的标题按钮(非系统按钮)
CaptionBtn := Bounds(Width - xFrame - 5*xSize + 2,
yFrame + 2, xSize + 2, ySize - 4);
//获取窗体画布的句柄
Canvas.Handle := GetWindowDC(Self.Handle); //定义画布的属性
Canvas.Font.Name := '宋体';
Canvas.Font.Color := clBlue;
Canvas.Pen.Color := clYellow;
Canvas.Brush.Color := clBtnFace;try
//画按钮
DrawButtonFace(Canvas, CaptionBtn, 1, bsAutoDetect, False, False, False);
//在按钮中定义一个范围用来输出按钮标题信息
R := Bounds(Width - xFrame - 5 * xSize + 2,
yFrame + 3, xSize +10, ySize - 7);
with CaptionBtn do
Canvas.TextRect(R, R.Left + 2, R.Top , '你好');
finally
ReleaseDC(Self.Handle, Canvas.Handle);
Canvas.Handle := 0;
end;
end;
//接收到Paint消息时重画按钮
procedure TForm1.WMNCPaint(var Msg : TWMNCPaint);
begin
inherited;
DrawCaptButton;
end;
//激活时重画
procedure TForm1.WMNCActivate(var Msg : TWMNCActivate);
begin
inherited;
DrawCaptButton;
end;
//接收到WM_SETTEXT消息时重画按钮
procedure TForm1.WMSetText(var Msg : TWMSetText);
begin
inherited;
DrawCaptButton;
end;
//捕获鼠标消息,检查是否按了按钮
procedure TForm1.WMNCHitTest(var Msg : TWMNCHitTest);
begin
inherited;
with Msg do
if PtInRect(CaptionBtn, Point(XPos - Left, YPos - Top)) then
Result := htCaptionBtn;
end;
//鼠标按下的相应操作,用户可添加各种代码,这里只显示一个对话框作例子
procedure TForm1.WMNCLButtonDown(var Msg : TWMNCLButtonDown);
begin
inherited;
if (Msg.HitTest = htCaptionBtn) then
ShowMessage('你好,你按的是标题栏上的按钮!');
end;//窗体改变大小时强制重画标题栏
procedure TForm1.FormResize(Sender: TObject);
begin
//Force a redraw of caption bar if form is resized
Perform(WM_NCACTIVATE, Word(Active), 0);
end;end. 用户可根据需要自己定义按钮的大小及用来输出按钮标题的范围。启动DELPHI,
用上面的代码替换缺省窗体FORM1中的UNIT1中的代码,运行就可以得到图1的界面,按一下“你好”按钮,看有没有反应。
toolbar可以放在form的任何位置(标题栏除外)