简单的delphi实例

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档