BCB中实现拖拽Panel 改变位置和大小的代码
//--------------------------------------------------------------------------- #ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <AppEvnts.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TPanel *Panel1;
TApplicationEvents *ApplicationEvents1;
void __fastcall FormCreate(TObject *Sender);
void __fastcall Panel1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y);
private: // User declarations
void __fastcall MyWndProc(Messages::TMessage &Message);
TWndMethod oldProc;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//--------------------------------------------------------------------------- #include <vcl.h>
#pragma hdrstop #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1; void __fastcall TForm1::MyWndProc(Messages::TMessage &Message)
{
HWND hWnd = Panel1->Handle;
switch(Message.Msg)
{
case WM_NCHITTEST:
{
TPoint pt;
GetCursorPos(&pt);
pt = Panel1->ScreenToClient(pt);
TRect rcClient = Panel1->ClientRect; if (pt.x <= && pt.y <= )//左上角,判断是不是在左上角,就是看当前坐标是不是即在左边拖动的范围内,又在上边拖动的范围内,其它角判断方法类似
{
Message.Result = HTTOPLEFT;
}else if (pt.x>rcClient.right- && pt.y<rcClient.top+)//右上角
{
Message.Result = HTTOPRIGHT; }else if (pt.x<rcClient.left+ && pt.y>rcClient.bottom-)//左下角
{
Message.Result = HTBOTTOMLEFT;
}else if (pt.x>rcClient.right- && pt.y>rcClient.bottom-)//右下角
{
Message.Result = HTBOTTOMRIGHT; }else if (pt.x<rcClient.left+)
{
Message.Result = HTLEFT;
}else if (pt.x>rcClient.right-)
{
Message.Result = HTRIGHT;
}else if (pt.y<rcClient.top+)
{
Message.Result = HTTOP;
}
else if (pt.y > rcClient.Bottom - )
{
Message.Result = HTBOTTOM;
}
else
{
oldProc(Message);
}
}
break;
case WM_SIZE: //要让窗体能够随着缩放改变,要响应WM-SIZE消息
{
RECT rcClient = { };
::GetClientRect(hWnd, &rcClient);
InvalidateRect(hWnd,&rcClient,FALSE);
}
break;
default:
oldProc(Message);
}
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{ }
//--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender)
{
oldProc = Panel1->WindowProc;
Panel1->WindowProc = MyWndProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
WORD SC_DragMove = 0xF012 ;
ReleaseCapture();
((TWinControl*)Sender)->Perform(WM_SYSCOMMAND,SC_DragMove,);
}
//---------------------------------------------------------------------------


BCB中实现拖拽Panel 改变位置和大小的代码的更多相关文章
- Android中GridView拖拽的效果【android进化三十六】
最 近看到联想,摩托罗拉等,手机launcher中有个效果,进入mainmenu后,里面的应用程序的图标可以拖来拖去,所以我也参照网上给的代码,写了 一个例子.还是很有趣的,实现的流畅度没有人家的 ...
- Android中GridView拖拽的效果
最 近看到联想,摩托罗拉等,手机launcher中有个效果,进入mainmenu后,里面的应用程序的图标可以拖来拖去,所以我也参照网上给的代码,写了 一个例子.还是很有趣的,实现的流畅度没有人家的那么 ...
- Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值
Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值,去属性表中设置这时候会提示你去属性表中更改返回类型. 其实存储过程返回的也是一张表,只不过有时候存储过程有点复杂或者写法不规范的话不能 ...
- iOS开发拓展篇—xib中关于拖拽手势的潜在错误
iOS开发拓展篇—xib中关于拖拽手势的潜在错误 一.错误说明 自定义一个用来封装工具条的类 搭建xib,并添加一个拖拽的手势. 主控制器的代码:加载工具条 封装工具条以及手势拖拽的监听事件 此时运行 ...
- iOS - xib中关于拖拽手势的潜在错误
iOS开发拓展篇—xib中关于拖拽手势的潜在错误 一.错误说明 自定义一个用来封装工具条的类 搭建xib,并添加一个拖拽的手势. 主控制器的代码:加载工具条 封装工具条以及手势拖拽的监听事件 此时运行 ...
- iPhone手机解锁效果&&自定义滚动条&&拖拽--Clone&&窗口拖拽(改变大小/最小化/最大化/还原/关闭)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- react 可拖拽改变位置和大小的弹窗
一 目标 最近,项目上需要一个可以弹出一个可以移动位置和改变大小的窗口,来显示一下对当前页面的一个辅助内容 二 思路 1.之前写过一个antd modal的可移动弹窗但是毕竟不如自己写的更定制化,比如 ...
- Delphi中运行时改变panel的位置及大小(WM_SysCommand消息配合参数使用,很奇妙) good
procedure TForm1.pnl1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Inte ...
- Delphi中运行时改变panel的位置及大小(通过wm_SysCommand来实现)
procedure TForm1.pnl1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Int ...
随机推荐
- VR定制 AR定制 就找北京动软VR开发团队(VR案例 AR案例)
我们长期承接丰交互软件.游戏项目外包: VR/AR内容应用定制.VR.AR游戏项目外包(有主流测试硬件设备) VR全景应用.视频外包 请提供贵公司的信息,我们将提供高大上的VR案例欢迎联系我们给您提供 ...
- MariaDB Galera Cluster部署手册
MariaDB Galera Cluster部署手册 galara保证双主数据库的同步及一致性 1.环境准备 基于新部署.最小化安装centos6.5 1> yum install opens ...
- USVN
我们最近将快盘上的东西迁移到了svn上,因为快盘总是不会不小心删掉或者修改了某些文件.为了能保留历史记录我们统一迁移到svn上.为了方便权限管理,我对比了几个svn的权限管理工具,最后觉得还是usvn ...
- React JSX语法说明
原文:http://my.oschina.net/leogao0816/blog/379487 什么是JSX? 在用React写组件的时候,通常会用到JSX语法,粗看上去,像是在Javascript代 ...
- Java数组在内存中是如何存放的
阅读目录 一维数组 二维数组 数组对象及其引用存放在内存中的哪里? Java中有两种类型的数组: 基本数据类型数组: 对象数组: 当一个对象使用关键字“new”创建时,会在堆上分配内存空间,然后返回对 ...
- thinkphp关闭调试模式(APP_DEBUG => false),导致程序出错
thinkphp关闭调试模式(APP_DEBUG => false),导致程序出错,开启调试模式,不报错,怎么解决? 查看Logs日志记录: [ --29T09::+: ] 113.108.11 ...
- mysql on Mac OS
在新买的macbook pro15上安装了mysql,发现2个问题 一个是workbench基本无法正常退出,都要force quit 第二是我正常通过workbench连接后,查看系统log,会发现 ...
- LAMP_03_Win下Apache+PHP+MySQL整合
文件: Apache : 首先修改Apache的配置文件,让Apache支持解析PHP文件.Apache配置文件在Apache安装目录的conf目录下的httpd.conf.1. 让Apache可以 ...
- 转 nutch网页快照乱码解决方法
修改apache-tomcat-7.0.55\webapps\nutch-1.2下的cached.jsp 将content = new String(bean.getContent(details)) ...
- delphi.指针.PChar
此文是delphi.指针.应用姊妹篇,想细化一下PChar应用,所以有了此文. 注意: 1:此文讲的是PChar与字符串相关操作,其它方法暂不多讲. 2:由于D分开Ansi/Unicode的两种完全不 ...