简单的delphi实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
unit mainfrm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Forms,
Dialogs, StdCtrls,Mybutton, Controls;
type
TFrmMain = class(TForm)
BtnAdd TButton;
BtnDelete TButton;
procedure BtnAddClick(Sender TObject);
procedure BtnDeleteClick(Sender TObject);
procedure FormCreate(Sender TObject);
private
procedure WMLBUTTONDOWN(var messageTMessage);message WM_LBUTTONDOWN;
procedure WMMOUSEMOVE(var messageTMessage);message WM_MOUSEMOVE;
procedure WMLBUTTONDBLCLK(var messageTMessage);message WM_LBUTTONDBLCLK;
procedure WMLBUTTONUP(var messageTMessage);message WM_LBUTTONUP;
procedure WMPAINT(var messageTMessage);message WM_PAINT;
procedure procBtnMsg(var messageTMessage);
procedure allBtnUnfocused(listTList);
procedure delbtn(listTList);
procedure addBtn(listTList);
public
multiFocusedinteger; 多选
CanDrawRectboolean; 是否启动复选矩形
focusedRectTRect; 多选的矩形框
msDownPosTPoint;
prePosTPoint; 鼠标上次移动的位置
multiFlaginteger;
mutiMoveboolean; 是否多选移动
btnListTList;
countinteger;
end;
var
FrmMain TFrmMain;
implementation
{$R .dfm}
主界面模块初始化创建,新建按钮链表,主界面上所有的按钮都放入该链表
procedure TFrmMain.FormCreate(Sender TObject);
begin
btnList=TList.Create;
count=0;
end;
添加按钮
procedure TFrmMain.BtnAddClick(Sender TObject);
begin
addBtn(btnList);
end;
主界面双击消息处理模块
procedure TFrmMain.WMLBUTTONDBLCLK(var message TMessage);
begin
procBtnMsg(message);
end;
鼠标按下时,进行复选预操作
procedure TFrmMain.WMLBUTTONDOWN(var message TMessage);
begin
inherited;
CanDrawRect=false; 鼠标按下不允许选中按钮
multiFlag=0;
mutiMove=false; 不允许多个按钮移动
procBtnMsg(message); 所以按钮都要发送鼠标按下消息
if(multiFlag=0)then 没有button被选中
begin
CanDrawRect=true; 允许画多选框,从而允许多选
multiFocused=0; 多选按钮数目设为0
allBtnUnfocused(btnList); 取消所有按钮的选中状态
msDownPos=Point(message.LParamLo,message.LParamHi);记录下按下的坐标,作为复选起点坐标
focusedRect=Rect(msDownPos,msDownPos); 初始化复选框,设置它的起终点都是按下的坐标
end;
end;
鼠标移动消息处理
procedure TFrmMain.WMMOUSEMOVE(var message TMessage);
var
tempbtnTMyButton;
begin
inherited;
if(CanDrawRect) then允许画多选框,则用链表中第一个按钮作为绘制边框
begin 并使用它来构建多选框,完成多选任务
tempbtn=TMybutton(btnList.Items[0]);
tempbtn.drawDragRect(focusedRect,clgreen);绘制第一个按钮边框,由它完成多选
获得多选框顶点按钮
focusedRect=tempbtn.getRect(msDownPos,Point(message.LParamLo,message.LParamHi));
tempbtn.drawDragRect(focusedRect,clgreen); 绘制多选框
end;
procBtnMsg(message); 向按钮传递消息
end;
procedure TFrmMain.WMLBUTTONUP(var message TMessage);
var
tempbtnTMybutton;
begin
inherited;
if(CanDrawRect) then 如何当前允许画矩形框
begin
tempbtn=TMybutton(btnList.Items[0]);
tempbtn.drawDragRect(focusedRect,clgreen);
CanDrawRect=false;
end;
procBtnMsg(message);
end;
如何使重绘消息,直接转发给按钮
procedure TFrmMain.WMPAINT(var message TMessage);
begin
inherited;
procBtnMsg(message);
end;
遍历发送消息,针对所有按钮
procedure TFrmMain.procBtnMsg(var message TMessage);
var
iinteger;
tempbtnTMybutton;
begin
for i=0 to btnList.Count-1 do
begin
tempbtn=TMybutton(btnList.Items[i]);
tempbtn.myWndProc(message);
end;