C++Builder下判断窗口移动

    由于需要判断窗口是否移动,如果移动后则执行一些操作,在网上查找了一些资料,可以加载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; // 鼠标弹起
	}
}
// ---------------------------------------------------------------------------



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值