由于需要判断窗口是否移动,如果移动后则执行一些操作,在网上查找了一些资料,可以加载Application->OnMessage事件实现。现在记录下来,留作备用和经验分享。
下面是具体实现C++Builder代码:
// --------Unit1.h-------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
// ---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
// ---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TMemo *Memo1;
private: // User declarations
// 判断窗口移动
int mouse_captured; // 判断鼠标是否被按下
int xoff; // 窗口左上角起始坐标
int yoff; // 窗口左上角起始坐标
int xlast; // 鼠标释放后,窗口左上角起始坐标
int ylast; // 鼠标释放后,窗口左上角起始坐标
// 处理消息的函数
void __fastcall AppMessage(tagMSG &Msg, bool &Handled);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
// ---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
// ---------------------------------------------------------------------------
#endif
// -------------------Unit1.cpp--------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
// 赋初值
mouse_captured = 0;
xoff = 0;
yoff = 0;
xlast = 0;
ylast = 0;
Application->OnMessage = AppMessage;
}
// ---------------------------------------------------------------------------
// 判断窗口是否移动
void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
if (Msg.message == WM_NCLBUTTONDOWN) // 在标题栏上按下鼠标左按钮
{
mouse_captured = 1; // 鼠标被按下
xoff = Left; // 窗口左上角起始坐标
yoff = Top; // 窗口左上角起始坐标
Memo1->Lines->Add("down,Left=" + IntToStr(Left) + ",Top=" + IntToStr(Top));
}
else if (Msg.message == WM_NCMOUSEMOVE) // 在标题栏上移动鼠标
{
xlast = Left; // 鼠标释放后,窗口左上角起始坐标
ylast = Top; // 鼠标释放后,窗口左上角起始坐标
// 如果鼠标被按下,并且窗口左上角起始坐标有变化,则执行相关操作
if (mouse_captured == 1 && (xoff != xlast || yoff != ylast))
{
Memo1->Lines->Add("move,Left=" + IntToStr(Left) + ",Top=" + IntToStr(Top));
Memo1->Lines->Add("执行相关操作");
}
mouse_captured = 0; // 鼠标弹起
}
}
// ---------------------------------------------------------------------------