• 8127阅读
  • 0回复

在C++ Builder中客户区拖动窗口的实现 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2005-07-30
现在总结起来,有两种方法可以来处理:
第一:用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;
}
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个