导航
  • 主页
  • Windows SDK/API
  • 基础类
  • ActiveX
  • 数据库及相关技术
  • 网络及通讯开发
  • VCL组件使用和开发
  • 问答

求助,动行态改变控件大小

yuanque 2002-09-07 10:42:18
关于动态改变控件大小,我看到网上有不少人讨论这个问题,谁能帮助我们做一个类似CB开发状态下的控件大小、移动调整程序,感激不尽!
...全文
16 点赞 收藏 21
写回复
21 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Libran 2002-09-11
看一下,呵呵
http://61.132.74.87/libran/Project1.exe
还没完成,等出差回来再说
回复
yuanque 2002-09-10
写得太差。望大家指教一下我这个CB新手,谢谢
回复
yuanque 2002-09-10
/**
* 功能:从控件上松开按键时的事件处理
* 输入:
* 输出:
* 提示:
* 创建日期:
* 创建人:
**/
void __fastcall TWinDesignTimeForm::Up(TObject * Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
//MoveSize1->ActionControl=(TControl *)Sender;
if(mbLeft==Button&&m_bMoving)
{
Screen->Cursor=crDefault;
TControl *self=(TControl *)Sender;

Repaint();
int iX=((TControl *)Sender)->Left+X-m_iStartX;
int iY=((TControl *)Sender)->Top+Y-m_iStartY;
((TControl *)Sender)->Left=iX;
((TControl *)Sender)->Top=iY;
m_bMoving=false;
if (hintLabel)
{
delete hintLabel;
hintLabel=NULL;
}
}


//参数意义:
//0xF000 SC_SIZE ( No Effect )
//
//0xF001 右边不动,向左边扩大或缩小
//0xF002 左边不动,向右边扩大或缩小
//0xF003 下边不动,向上边扩大或缩小
//0xF004 下边及右边不动,向上边及左边扩大或缩小
//0xF005 下边及左边不动,向上边及右边扩大或缩小
//0xF006 上边不动,向下边扩大或缩小
//0xF007 上边及右边不动,向下边及左边扩大或缩小
//0xF008 上边及左边不动,向下边及右边扩大或缩小
//0xF009 移动
//
//0xF010 SC_MOVE ( No Effect )
//
//0xF011-0xF019 移动
}

回复
yuanque 2002-09-10
我写的移动与改变大小的程序,请大家指教一下
(没有画八个RECT)

/**
* 功能:从控件上按下按键时的事件处理
* 输入:
* 输出:
* 提示:
* 创建日期:
* 创建人:
**/
void __fastcall TWinDesignTimeForm::Down(TObject * Sender,TMouseButton Button, TShiftState Shift, int X, int Y)
{
//MoveSize1->ActionControl=(TControl *)Sender;
TCursor OldCursor=Screen->Cursor;
/*up-left*/
if( X > 0 && X < 20
&& Y > 0 && Y < 20)
{
Screen->Cursor=crSizeNWSE;
ReleaseCapture();
((TControl *)Sender)->Perform(WM_SYSCOMMAND,0xF004,0);
}

/*down-right*/
else if((X > ((TControl *)Sender)->Width-20)
&& (X < ((TControl *)Sender)->Width)
&& (Y > ((TControl *)Sender)->Height-20)
&& (Y < ((TControl *)Sender)->Height))
{
Screen->Cursor=crSizeNWSE;
ReleaseCapture();
((TControl *)Sender)->Perform(WM_SYSCOMMAND,0xF008,0);
}

/*up-center*/
else if((X > ((TControl *)Sender)->Width/2-10)
&& (X < ((TControl *)Sender)->Width/2+10)
&& (Y>0) && (Y<20))
{
Screen->Cursor=crSizeNS;
ReleaseCapture();
((TControl *)Sender)->Perform(WM_SYSCOMMAND,0xF003,0);
}

/*down-center*/
else if((X > ((TControl *)Sender)->Width/2-10)
&& (X < ((TControl *)Sender)->Width/2+10)
&& (Y > ((TControl *)Sender)->Height-20)
&& (Y < ((TControl *)Sender)->Height))
{
Screen->Cursor=crSizeNS;
ReleaseCapture();
((TControl *)Sender)->Perform(WM_SYSCOMMAND,0xF006,0);
}

/*down-left*/
else if((X > 0)
&& (X < 5)
&& (Y > ((TControl *)Sender)->Height-20)
&& (Y < ((TControl *)Sender)->Height))
{
Screen->Cursor=crSizeNESW;
ReleaseCapture();
((TControl *)Sender)->Perform(WM_SYSCOMMAND,0xF007,0);
}

/*up-right*/
else if((X > ((TControl *)Sender)->Width-20)
&& (X < ((TControl *)Sender)->Width)
&& (Y > 0)
&& (Y < 5))
{
Screen->Cursor=crSizeNESW;
ReleaseCapture();
((TControl *)Sender)->Perform(WM_SYSCOMMAND,0xF005,0);
}
/*mid-left*/
else if((X > 0)
&& (X < 5)
&& (Y > ((TControl *)Sender)->Height/2-10)
&& (Y < ((TControl *)Sender)->Height/2+10))
{
Screen->Cursor=crSizeWE;
ReleaseCapture();
((TControl *)Sender)->Perform(WM_SYSCOMMAND,0xF001,0);
}

/*mid-right*/
else if((X > ((TControl *)Sender)->Width-10)
&& (X < ((TControl *)Sender)->Width)
&& (Y > ((TControl *)Sender)->Height/2-10)
&& (Y < ((TControl *)Sender)->Height/2+10))
{
Screen->Cursor=crSizeWE;
ReleaseCapture();
((TControl *)Sender)->Perform(WM_SYSCOMMAND,0xF002,0);
}
else
{
TControl *self=(TControl *)Sender;
self->BringToFront();
controlWidth=self->Width;
controlHeight=self->Height;

selectedControl=self;
//m_MovingControl=self;

SetControlRect(TRect((self->Left-1),(self->Top-1),(self->Left+self->Width+1),(self->Top+self->Height+1)));

if(mbLeft==Button)
{
m_bMoving=true;
m_iStartX=X;
m_iStartY=Y;
if(hintLabel!=NULL)
{
delete hintLabel;
}
hintLabel=new TStaticText(this);
hintLabel->Parent=this;
hintLabel->BorderStyle=sbsSunken;
hintLabel->Caption=IntToStr(self->Left)+","+IntToStr(self->Top);
hintLabel->Left=self->Left+X;
hintLabel->Top=self->Top+Y+20;
hintLabel->Color=clInfoBk;
}
}
}

/**
* 功能:控件移动
* 输入:
* 输出:
* 提示:
* 创建日期:
* 创建人:
**/
void __fastcall TWinDesignTimeForm::Move(TObject *Sender, TShiftState Shift,
int X, int Y)
{
//MoveSize1->ActionControl=(TControl *)Sender;
TCursor OldCursor=Screen->Cursor;
/*up-left*/
if( X > 0 && X < 10
&& Y > 0 && Y < 10)
{
Screen->Cursor=crSizeNWSE;
}

/*down-right*/
else if((X > ((TControl *)Sender)->Width-10)
&& (X < ((TControl *)Sender)->Width)
&& (Y > ((TControl *)Sender)->Height-10)
&& (Y < ((TControl *)Sender)->Height))
{
Screen->Cursor=crSizeNWSE;
}

/*up-center*/
else if((X > ((TControl *)Sender)->Width/2-5)
&& (X < ((TControl *)Sender)->Width/2+5)
&& (Y>0) && (Y<10))
{
Screen->Cursor=crSizeNS;
}

/*down-center*/
else if((X > ((TControl *)Sender)->Width/2-5)
&& (X < ((TControl *)Sender)->Width/2+5)
&& (Y > ((TControl *)Sender)->Height-10)
&& (Y < ((TControl *)Sender)->Height))
{
Screen->Cursor=crSizeNS;
}

/*down-left*/
else if((X > 0)
&& (X < 10)
&& (Y > ((TControl *)Sender)->Height-10)
&& (Y < ((TControl *)Sender)->Height))
{
Screen->Cursor=crSizeNESW;
}

/*up-right*/
else if((X > ((TControl *)Sender)->Width-10)
&& (X < ((TControl *)Sender)->Width)
&& (Y > 0)
&& (Y < 10))
{
Screen->Cursor=crSizeNESW;
}
/*mid-left*/
else if((X > 0)
&& (X < 10)
&& (Y > ((TControl *)Sender)->Height/2-5)
&& (Y < ((TControl *)Sender)->Height/2+5))
{
Screen->Cursor=crSizeWE;
}

/*mid-right*/
else if((X > ((TControl *)Sender)->Width-10)
&& (X < ((TControl *)Sender)->Width)
&& (Y > ((TControl *)Sender)->Height/2-5)
&& (Y < ((TControl *)Sender)->Height/2+5))
{
Screen->Cursor=crSizeWE;
}
else
{
Screen->Cursor=crDefault;
TControl *self=(TControl *)Sender;
int iX=self->Left+X-m_iStartX;
int iY=self->Top+Y-m_iStartY;
if (m_bMoving)
{
Repaint();
SetControlRect(TRect(iX-1,iY-1,iX+controlWidth+1,iY+controlHeight+1));
hintLabel->Caption=IntToStr(iX)+","+IntToStr(iX);
hintLabel->Left=iX+m_iStartX;
hintLabel->Top=iY+m_iStartY+20;
}
}



}
}



回复
gfh21cn 2002-09-10
我的那个很简单的
在memo中动态创建image,然后当鼠标点击在image上的时候
把这个image四周画个框,把其他的恢复。
拖动image是通过处理image的onmousemove和onmousedown以及onmouseup事件
来处理的

windows系统本身就是画出来的
在什么样的情况下画什么样的效果
这就由你自己定了。




回复
xue_fg 2002-09-09
我觉得呢,还是把他做在控件内部不错,直接在Canvas上画选中的效果,那样的效果很好,基本上像word 、cb中的效果了
回复
yuanque 2002-09-09
比较急了,帮帮我!!!
回复
yuanque 2002-09-09
以前是讨论过,而且我收集了,无非是用perform函数,做得不好,不像cb自己的开发界面一样好用。
回复
huang_jihua 2002-09-09
你收索一下吧,以前在这里讨论过的
回复
soloxiao 2002-09-09
好像可以设定控件的 Anchors 属性
将[akLeft,akTop,akRight,akBottom]都设定为true
可能我没有听懂你的问题...
回复
vixkywx 2002-09-07
修改大小改height,width
移动改left,top
如果还要加点东西的话,就困难了
回复
gfh21cn 2002-09-07
你用Splitter控件可以实现的

如果更深的话
你要处理消息
判断是否在控件边缘然后显示可以拖动的CURSOR
当鼠标按下时,判断是否在边缘,然后记录
根据鼠标移动的情况来处理

这是我的理解
回复
annkie 2002-09-07
期待中。。。。
没有就自己写了,我也有这个问题,觉得很麻烦。
什么分辨率啊,字体啊,很难说换了地方还能保证原貌
回复
e_board 2002-09-07
最好能根据窗口自动调节,
回复
yuanque 2002-09-07
to gfh21cn(葛凤华):
选中、移动效果用Image来画是个好办法,能不能给我们展示一下你的源代码,感激不尽!
回复
gfh21cn 2002-09-07
我也作个拖动的程序
我是用image,处理鼠标事件的时候
在image上画出被选中等效果

我想通过一般的可视控件(image、panel)和作一些处理(画)
来达到你的效果
回复
yuanque 2002-09-07
应该不只是画出来的,CB在开发态拖动的控件应该已经是真正的控件了,而不是只是画个图片在上面(比如你可以设置控件在开发态的某些响应)。
用友的票据通不知大家看见过没有,好像就实现了控件的拖动,改变大小等操作,做得蛮好的,可惜看不到源程序。
回复
gfh21cn 2002-09-07
CB里那些效果可能是画出来的


回复
coolpony 2002-09-07
我也期待有这样的控件。。
有的话麻烦给我发一个。。
谢谢了。
回复
yuanque 2002-09-07
我认为,最好是把这些改变大小,拖动等处理写成一个非可视的控件,使之影响到所有的控件。
期待中……………
回复
发动态
发帖子
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
社区公告
暂无公告