windows窗口和按钮Delphi为Windows窗 口标题栏添加新按钮
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
windows窗口和按钮:Delphi为Windows窗口标题栏添加新按钮
疯狂代码 / ĵ:http://Delphi/Article45154.html
张海航 ; ;
对于我们熟悉标准windows窗口来讲标题栏上般包含有3个按钮即最大化按钮最小化按钮和关闭按钮你想不想在Windows窗口标题栏上添加个新自定义按钮满足你个性化需求从而也使自己窗口更具特色呢?!
下面我们就讨论下在delphi中如何给窗口标题栏上添加新按钮
、实现起来要定义以下过程:
1、 定义DrawCaptButton过程这个过程功能是在指定位置画出按钮
在过程中要使用win32GetMetrics得到窗口大小和标题按钮大小;使用delphiBounds定义个矩形这个矩形就是新按钮位置;再定义个小矩形这个矩形是为了填写文本;最后就delphi中比较有用drawbuttonface把按钮画出来
2、 每次我们对窗口进行操作例如最大化操作或最小化操作新按钮就会消失为了解决这个问题我们对所有消息要进行处理给每个消息编写个过程对按钮进行重画
A、定义WMNCPa(var Msg:TWMNCPa)过程处理消息WM_NCPa
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
2、 具体源如下:
我们结合源来讲述过程实现从中可以看出对win32以及drawbuttonface使用思路方法
unit Main; ; ;
erface
uses
Windows, Buttons, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type
TForm1 = (TForm)
procedure FormResize(Sender: TObject);
private
CaptionBtn : TRect;
procedure DrawCaptButton;
procedure WMNCPa(var Msg : TWMNCPa); message WM_NCPa;
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 := GetMetrics(SM_CXFRAME);
yFrame := GetMetrics(SM_CYFRAME);
file://把窗口宽度置于变量xFrame,把窗口高度置于变量yFrame
xSize:= GetMetrics(SM_CXSIZE);
ySize:= GetMetrics(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://得到窗口句柄 ; ;
:= '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.WMNCPa(var Msg : TWMNCPa);
//WMNCPa过程具体实现该过程在绘制窗口时被
begin
inherited;//继承默认消息处理
DrawCaptButton;//对按钮进行重画
end;
procedure TForm1. (var Msg : TWMNCActivate);
// WMNCActivate过程和WMNCPa过程实现思路方法相同该过程在窗口非客户区要更改为激活状态或非激活状态时被
begin
inherited;
DrawCaptButton;
end;
procedure TForm1.WMSetText(var Msg : TWMSetText);
// WMSetText过程和WMNCPa过程实现思路方法相同该过程在设置窗口文本时被
begin
inherited;
DrawCaptButton;
end;
procedure TForm1.WMNCHitTest(var Msg : TWMNCHitTest);
file:// WMNCHitTest过程和WMNCPa过程实现思路方法相同该过程在光标移动或鼠标按钮被按下或鼠标按钮被释放时
begin
inherited;
with Msg do
PtInRect(CaptionBtn, Po(XPos - Left, YPos - Top)) then
Result := htCaptionBtn;//判断鼠标所在位置是否在新按钮矩形范围内如果在返回新按钮标识值
end;
procedure TForm1.WMNCLButtonDown(var Msg : TWMNCLButtonDown);
// WMNCLButtonDown过程和WMNCPa过程实现思路方法相同当光标处于窗口非客户区范围内鼠标左键被按下时该过程
begin
inherited;
(Msg.HitTest = htCaptionBtn) then
ShowMessage('你点击是标题栏上新按钮');
file://判断被点击是否是新按钮如果是显示上面信息在这里你可以按你需要编写代码
end;
procedure TForm1.FormResize(Sender: TObject);
begin
Perform(WM_NCACTIVATE, Word(Active), 0); ; ;
file://如果窗口大小改变则重画标题栏
end;
end.
; ;
3、 执行结果
如图1-1所示标题栏上出现个新按钮
通过以上举例过程相信你能根据自己具体要求利用Delphi设计出别具特色Windows窗口来! 2008-12-26 2:39:17
疯狂代码 /。