现在总结起来,有两种方法可以来处理:
第一:用Form的WndProc函数:
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
if(Message.Msg==WM_NCHITTEST)
{
Message.Result=HTCAPTION;
return;
}
TForm::WndProc(Message);
}
第二:用控件的OnMouseDown消息处理函数:
void __fastcall TForm1::xxxxMouseDown(....)
{
if(Button==mbLeft)
{
ReleaseCapture();
Perform(WM_NCLBUTTONDOWN,HTCAPTION,0);
}
}
综合两种方法:前一种结果是窗口右上角的三个(关闭,最小化,最大化)按钮
不起作用了,但是,窗体内的所有控件制药不接受鼠标事件就会拖动窗口,
比如,上面放个Image1,则拖动图片会产生同样的托动效果,Label空间也可以,
但是Button就不可以了。
后一种则要处理每一个相邀产生拖动效果的控件,即如果在窗体上有个Image
如果想在它上面产生效果,就要写她的OnMouseDown是键处理函数。
第三:以上两种方法在拖动的时候会有虚框的产生,去掉虚框可以用这个方法
class TForm1 : public TForm
{
__published: // IDE-managed Components
TImage *Image1;
void __fastcall Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y);
void __fastcall Image1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y);
private: // User declarations
int SaveX;
int SaveY;
bool LeftMouseButtonDown;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Button==mbLeft)
{
//ReleaseCapture();
//Perform(WM_NCLBUTTONDOWN,HTCAPTION,0);
SaveX=X;
SaveY=Y;
LeftMouseButtonDown=true;
}
else
LeftMouseButtonDown=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(LeftMouseButtonDown)
{
Form1->Left=Form1->Left+X-SaveX;
Form1->Top=Form1->Top+Y-SaveY;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if(LeftMouseButtonDown)
LeftMouseButtonDown=false;
}