BCB中利用鼠标拖放调整TControl的大小

原创 2004年07月02日 11:26:00

        对于继承自TWinControl的控件,如果要通过鼠标来调整其大小,只需要通过SetWindowLong在GWL_STYLE风格中添加WS_SIZEBOX即可。但是对于其他继承自TControl的对象,例如TGraphicControl,因为不是windows控件,所以无法使用这种方法。因此需要自己来进行处理。


以下给出BCB的示例代码(假定更改尺寸的对象是TBevel):

变量:


//定义枚举类型,判断鼠标从哪个位置进入到控件
enum TMoveInType{mtNone,mtLeft,mtTop,mtRight,mtBottom,mtTopLeft,mtTopRight,mtBottomLeft,mtBottomRight};
TMoveInType moveInType=mtNone;
TRect SizeRect;
bool SizeState =false;
const int SizeRange = 8;
__inline int Min(int a,int b){return (a__inline int Max(int a,int b){return (a>b) ? a : b;}

在控件的MouseMove、MouseUp事件中处理:

void __fastcall TForm1::Bevel1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
 TBevel *SdBevel;
 SdBevel = (TBevel *)Sender;
 //判断size开始的位置
 if(!SizeState)
 {
if (abs(Y -SdBevel->Height/2)<=SizeRange&&(abs(X)<=SizeRange))
 {
    moveInType=mtLeft;
    SdBevel->Cursor = crSizeWE;
 }
 else if (abs(Y -SdBevel->Height/2)<=SizeRange&&abs(SdBevel->Width -X<=SizeRange))
 {
    moveInType=mtRight;
    SdBevel->Cursor = crSizeWE;
 }
 else if (abs(X -SdBevel->Width/2)<=SizeRange&&(abs(Y)<=SizeRange))
 {
    moveInType=mtTop;
    SdBevel->Cursor = crSizeNS;
 }
 else if (abs(X -SdBevel->Width/2)<=SizeRange&&abs(SdBevel->Height - Y<=SizeRange))
 {
    moveInType=mtBottom;
    SdBevel->Cursor = crSizeNS;
 }
  else if ((abs(X)<= SizeRange)&&(abs(Y)<=SizeRange))
 {
    moveInType=mtTopLeft;
    SdBevel->Cursor = crSizeNWSE;
 }
 else if (abs(SdBevel->Width -X <= SizeRange)&&(abs(Y)<=SizeRange))
 {
    moveInType=mtTopRight;
    SdBevel->Cursor = crSizeNESW;
 }
  else if ((abs(X)<= SizeRange)&&abs(SdBevel->Height - Y<=SizeRange))
 {
    moveInType=mtBottomLeft;
    SdBevel->Cursor = crSizeNESW;
 }
  else if (abs(SdBevel->Width -X)<= SizeRange&&abs(SdBevel->Height - Y<=SizeRange))
 {
    moveInType=mtBottomRight;
    SdBevel->Cursor = crSizeNWSE;
 }
 else if (!SizeState)
 {
   SdBevel->Cursor = crArrow;
   moveInType=mtNone;
 }
}
if ((moveInType!=mtNone)&&(Shift.Contains(ssLeft)))
{
    SizeState =true;
    Canvas->Pen->Mode = pmNotXor;
    Canvas->Pen->Style = psDot;
    Canvas->Pen->Color = clDkGray;
    Canvas->Brush->Style = bsClear;
    //利用xor,将上次的 SizeRect抹去
    Canvas->Rectangle(SizeRect.Left,SizeRect.Top,SizeRect.Right,SizeRect.Bottom);

    TRect BRect;
    //可能Rect的Right>Left,Top>Bottom,所以利用临时的BRect做一些调整
    BRect = SdBevel->BoundsRect;

    switch (moveInType)
    {
      case mtLeft:
        BRect.Left += X;
        break;
      case mtRight:
        BRect.Right =BRect.Left + X;
        break;
      case mtTop:
        BRect.Top += Y;
        break;
      case mtBottom:
        BRect.Bottom = BRect.Top+Y;
        break;
      case  mtTopLeft:
        BRect.Left += X;
        BRect.Top += Y;
        break;
      case  mtTopRight:
        BRect.Right =BRect.Left + X;
        BRect.Top += Y;
        break;
      case  mtBottomLeft:
        BRect.Left += X;;
        BRect.Bottom = BRect.Top+Y;
        break;
      case  mtBottomRight:
        BRect.Right =BRect.Left + X;
        BRect.Bottom = BRect.Top+Y;
        break;
    }


    SizeRect.Left= Min(BRect.Left,BRect.Right);
    SizeRect.Right= Max(BRect.Left,BRect.Right);
    SizeRect.Top= Min(BRect.Top,BRect.Bottom);
    SizeRect.Bottom=Max(BRect.Top,BRect.Bottom);
    //画SizeRect
    Canvas->Rectangle(SizeRect.Left,SizeRect.Top,SizeRect.Right,SizeRect.Bottom);
}

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Bevel1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    if (SizeState)
    {
     //利用xor,将画的最后一个 SizeRect抹去
     Canvas->Rectangle(SizeRect.Left,SizeRect.Top,SizeRect.Right,SizeRect.Bottom);
     SizeState =false;
     ((TBevel *)Sender)->BoundsRect=SizeRect;
     SizeRect =Rect(0,0,0,0);
     //恢复初始的参数
     Canvas->Pen->Mode = pmCopy;
     Canvas->Brush->Style = bsSolid;
     Canvas->Pen->Width = 1;
     Canvas->Pen->Color = clBlack         ;
    }
}
//---------------------------------------------------------------------------

 

BCB 动态生成控件

窗体上的所有对象与窗体本身都成为一个类:TForm1,我们就是将类成员与类成员函数写到TForm1类中,程序运行时,实际上就是通过TForm1 类生成Form1对象, 所以,Unit1.cpp...
  • u014438664
  • u014438664
  • 2015年03月29日 23:46
  • 494

用BCB控件编写TCP/IP通讯程序的基础知识

最近在网上不断的看到有人问如何用BCB的TServerSocket和TClientSocket进行编程的问题,所以决定把我的一些编程经验告诉给大家,让大家能够尽快的掌握他们的用法。 首先要讲一下他们...
  • lixingshi
  • lixingshi
  • 2014年11月25日 15:26
  • 1176

BCB6使用ReportMachine创建报表

RM(Report Machine)是一个功能强大的Delphi 报表控件包。使用它可以制作出非常复杂的报表。下面讲述最简单的用法:  在Form上放上两个数据库控件:ADOConnection和A...
  • limuyun
  • limuyun
  • 2014年05月16日 17:08
  • 1796

Qt学习笔记-----拖放

拖放,拖动和释放(Drag and Drop),允许用户利用鼠标在不同组件之间或一个组件上进行数据的拖动。如果哪个组件支持拖放操作,就在该组件的设计上实现某些必要的函数。比如说,我们可能需要在Main...
  • sinat_35261315
  • sinat_35261315
  • 2017年02月08日 00:50
  • 512

qt拖放 控件之间拖放 自定义数据

很长时间没有来写博客了,前段时间一直在帮同学弄一个 spring-mvc 的项目,今天终于做完了,不过公司里面又要开始做 flex 4,估计还会忙一段时间吧! 接着上次的说,上次说到了拖放技术,今天...
  • zhangbinsijifeng
  • zhangbinsijifeng
  • 2016年06月03日 11:12
  • 1002

BCB如何加载字符串资源文件(语言资源文件)?

如何在软件.exe中嵌入语言资源呢。常规的想法是, 将语言字符串放到一个文件中, 然后在程序中去读取。 然而这样做存在一个问题: 最后发布的.exe必须依赖于语言字符串文件, 比如lang.txt. ...
  • stpeace
  • stpeace
  • 2015年07月26日 12:45
  • 1563

PyQt5教程-20-拖放事件

在PyQt5教程的这一部分,我们将讨论拖放操作。在电脑图形用户界面,拖放事件就是点击一个虚拟对象,并将其拖动到其他位置或到另一个虚拟物体的动作。在一般情况下,它可以被用于调用多种动作,或创建两个抽象对...
  • weiaitaowang
  • weiaitaowang
  • 2016年08月05日 17:27
  • 2210

常用的BCB 函数

文件: ActnList  CreateAction 函数 创建一个指定类型的Action,显示在action list editor中。  EnumRegisteredAction 过程 枚举已...
  • binnygoal
  • binnygoal
  • 2016年09月08日 16:17
  • 1235

c++builder如何通过鼠标拖动改变无边框窗体的大小(bsnone)

转自http://www.ccrun.com/article.asp?i=990&d=70jx1b 在C++Builder中,将Form的BorderStyle设为bsNone以后该窗体将没有边框,...
  • lz465350
  • lz465350
  • 2014年11月06日 10:02
  • 1065

BCB中的输入对话框和输出对话框(也就是消息对话框)

刚出去转了一下, 吹吹风, 回来继续写。 我们现在来说BCB中的输出对话框, 这个很常见: //--------------------------------------------...
  • stpeace
  • stpeace
  • 2015年07月26日 14:35
  • 1973
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BCB中利用鼠标拖放调整TControl的大小
举报原因:
原因补充:

(最多只允许输入30个字)