BCB中实现拖拽Panel 改变位置和大小的代码

时间:2021-09-16 03:47:17
//---------------------------------------------------------------------------

#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 <= 20  && pt.y <= 20)//左上角,判断是不是在左上角,就是看当前坐标是不是即在左边拖动的范围内,又在上边拖动的范围内,其它角判断方法类似
            {
                Message.Result = HTTOPLEFT;
            }else if (pt.x>rcClient.right-20 && pt.y<rcClient.top+20)//右上角  
            {  
                Message.Result = HTTOPRIGHT;
                
            }else if (pt.x<rcClient.left+20 && pt.y>rcClient.bottom-20)//左下角  
            {  
                Message.Result = HTBOTTOMLEFT;
            }else if (pt.x>rcClient.right-20 && pt.y>rcClient.bottom-20)//右下角  
            {
                Message.Result = HTBOTTOMRIGHT;

            }else if (pt.x<rcClient.left+20)
            {  
                Message.Result = HTLEFT;
            }else if (pt.x>rcClient.right-20)  
            {
                Message.Result = HTRIGHT;
            }else if (pt.y<rcClient.top+20)
            {  
                Message.Result = HTTOP;
            }
            else if (pt.y > rcClient.Bottom - 20)
            {
                Message.Result = HTBOTTOM;
            }
            else
            {
                oldProc(Message);
            }
        }
        break;
        case WM_SIZE:   //要让窗体能够随着缩放改变,要响应WM-SIZE消息
        {
            RECT rcClient = { 0 };
            ::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,0);
}
//---------------------------------------------------------------------------

 

BCB中实现拖拽Panel 改变位置和大小的代码

 

BCB中实现拖拽Panel 改变位置和大小的代码