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 ...
随机推荐
- 【转】libevent和基于libevent的网络编程
转自: http://www.cnblogs.com/nearmeng/p/4043548.html 1 libevent介绍和安装 介绍 libevent是一个轻量级的基于事件驱动的高性能的开源网络 ...
- 在eclipse运行程序
1.开始的时候由于另一个财务共享的项目,其中也应用了maven管理项目,因此就不用额外安装配置maven. 2.这里关键的一点就是需要通过maven和jetty配合运行lenmonOA. 3.jett ...
- 【python】遍历类的所有成员
# -*- coding: utf-8 -*- #sharejs.com提供代码,转载请注明出处 class Site(object): def __init__(self): self.title ...
- Add Digits, Maximum Depth of BinaryTree, Search for a Range, Single Number,Find the Difference
最近做的题记录下. 258. Add Digits Given a non-negative integer num, repeatedly add all its digits until the ...
- Turn off Debug Logging in Quartz .Net
Quartz.net uses Common.Logging, so something like this in your App.config/Web.config: <configSect ...
- UTF-8编码的字符串拆分成单字、获取UTF-8字符串的字符个数的代码及原理
一.字符编码简介 1. ASCII码 在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(by ...
- 通过Daffodil for VS使VS2010的IDE可以用VC6 VC7.1 VC9等编译器进行项目编译
本文内容中的部分资料和知识来源于网络,具体引用出处不明. VS的IDE从VC6到VS2010的变化可谓是天翻地覆,最新的VS2010有一个特性就是支持多显示器开发,这无疑为我们的开发带来很大的便利. ...
- Eclipse IDE for Java EE Developers 与 Eclipse Classic(Eclipse Standard)区别
Eclipse下载官网:http://www.eclipse.org/downloads/ 版本: 1.Eclipse classic(Eclipse Standard):Eclipse的标准版; 2 ...
- JAVA源码走读(二)二分查找与Arrays类
给数组赋值:通过fill方法. 对数组排序:通过sort方法,按升序.比较数组:通过equals方法比较数组中元素值是否相等.查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找 ...
- Ubuntu开启22端口
[http://blog.csdn.net/baple/article/details/39288817] 安装OpenSSH Ubuntu缺省没有安装SSH Server,使用以下命令安装: sud ...