快速业务通道

深入C++ Builder之编写自己的元件-深入分析VCL继承、消息机制(2)

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
s
{
  void __fastcall PACKAGE Register() //包的注册函数
  {
   TComponentClass classes[1] = {__classid(TVecCanvas)};
   RegisterComponents("Draw Suite", classes, 0);
  }
}
//---------------------------------------------------------------------------
__fastcall TVecCanvas::~TVecCanvas()
{
  //TODO: Add your source code here
  delete ShapeList;
}
void __fastcall TVecCanvas::MouseDown(TMouseButton Button,
  Classes::TShiftState Shift, int X, int Y)
{
  //TODO: Add your source code here
  if(Button!=mbLeft)
   return;
  switch(FTool)
  {
   case ttLine:
    LastPos.x=X;
    LastPos.y=Y;
    NewPos.x=X;
    NewPos.y=Y;
    Down=true;
   case ttSelect:
   {
    int sh=ShapeAtPos(X,Y);
    if(sh!=-1)
     DoShapeSelected(sh);
    break;
   }
  }
  
}
void __fastcall TVecCanvas::MouseUp(TMouseButton Button,
  Classes::TShiftState Shift, int X, int Y)
{
  //TODO: Add your source code here
  Down=false;
  if(Button==mbLeft)
  {
   switch(FTool)
   {
    case ttLine:
     CShape* sh= new CLine();
     sh->Start=LastPos;
     sh->End=TPoint(X,Y);
     sh->Type=stLine;
     ShapeList->Add(sh);
     Canvas->MoveTo(LastPos.x,LastPos.y);
     Canvas->LineTo(X,Y);
     break;
   }
  }
}
void __fastcall TVecCanvas::MouseMove(Classes::TShiftState Shift,
  int X, int Y)
{
  //TODO: Add your source code here
  if(!Down)
  {
   int sh=ShapeAtPos(X,Y);
   if(sh!=-1)
    DoHoverShape(sh);
   return;
  }
  switch(FTool)
  {
   case ttLine:
    Canvas->Pen->Mode=pmNotXor;
    Canvas->MoveTo(LastPos.x,LastPos.y);
    Canvas->LineTo(NewPos.x,NewPos.y);
    NewPos=TPoint(X,Y);
    Canvas->MoveTo(LastPos.x,LastPos.y);
    Canvas->LineTo(NewPos.x,NewPos.y);
    Canvas->Pen->Mode=pmCopy;
    break;
  }
}
void __fastcall TVecCanvas::Paint() //简单重载了Paint函数
{
  //TODO: Add your source code here
  //Canvas->Brush->Color=Color;
  //Canvas->FillRect(this->ClientRect);
  for(int n=0;n<ShapeList->Count;n++)
  {
   CShape* sh=(CShape*)ShapeList->Items[n];
   sh->Draw(Canvas);
  }
}
void __fastcall TVecCanvas::DoHoverShape(int index)
{
  //处理自定义事件
  if(FOnHoverShape)
  {
   FOnHoverShape(this,index);
  }
}
int __fastcall TVecCanvas::ShapeAtPos(int x, int y)
{
  //TODO: Add your source code here
  for(int n=0;n<ShapeList->Count;n++)
  {
   CShape* sh=(CShape*)ShapeList->Items[n];
   if(sh->IsPartOf(TPoint(x,y)))
    return n;
  }
  return -1;
}
void __fastcall TVecCanvas::SetTool(ToolType value)
{
  //TODO: Add your source code here
  if(FTool!=value)
  {
   FTool=value;
  }
}
void __fastcall TVecCanvas::DoShapeSelected(int index)
{
  //TODO: Add your source code here
  if(FOnShapeSelected)
  {
   FOnShapeSelected(this,index);
  }
}

上面的代码基本上运用了上面的消息处理知识和绘制的知识,所以很容易看懂,注意

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号