实现控件的移动、改变大小(DELPHI实现)

原创 2001年09月27日 13:12:00

 

实现控件的移动,改变大小(DELPHI实现)

主要使用Perform方法
  function Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
 
只要能够使用类似于win32API的函数SendMessage(),本方法同样可在其他环境里应用。

用Delphi实现
首先,建立一个应用程序,在一个窗体里加入一个Panel1,保存为main.pas;
然后,分别在Panel1的鼠标移动、鼠标按下事件里添加代码;
鼠标移动:控制光标的形状
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if (x>=0)and(x<=3) then
  begin
    if (y>=0)and(y<=3) then Panel1.Cursor:=crSizeNWSE;
    if (y>3)and(y<Panel1.Height-3) then Panel1.Cursor:=crSizeWE;
    if (y>=Panel1.Height-3)and(y<=Panel1.Height) then Panel1.Cursor:=crSizeNESW;
  end
  else if (x>3)and(x<Panel1.Width-3) then
  begin
    if (y>=0)and(y<=3) then Panel1.Cursor:=crSizeNS;
    if (y>3)and(y<Panel1.Height-3) then Panel1.Cursor:=crArrow;
    if (y>=Panel1.Height-3)and(y<=Panel1.Width) then Panel1.Cursor:=crSizeNS;
  end
  else if (x>=Panel1.Width-3)and(x<=Panel1.Width) then
  begin
    if (y>=0)and(y<=3) then Panel1.Cursor:=crSizeNESW;
    if (y>3)and(y<Panel1.Height-3) then Panel1.Cursor:=crSizeWE;
    if (y>=Panel1.Height-3)and(y<=Panel1.Width) then Panel1.Cursor:=crSizeNWSE;
  end;
end;

鼠标按下:控制Panel的大小或位置
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  if (x>=0)and(x<=3) then
  begin
    file://左上角方向改变大小
    if (y>=0)and(y<=3) then Panel1.Perform(WM_SysCommand,$F004,0);
    file://左侧
    if (y>3)and(y<Panel1.Height-3) then Panel1.Perform(WM_SysCommand,$F001,0);
    file://左下角
    if (y>=Panel1.Height-3)and(y<=Panel1.Height) then Panel1.Perform(WM_SysCommand,$F007,0);
  end
  else if (x>3)and(x<Panel1.Width-3) then
  begin
    file://上侧
    if (y>=0)and(y<=3) then Panel1.Perform(WM_SysCommand,$F003,0);
    file://移动控件
    if (y>3)and(y<Panel1.Height-3) then Panel1.Perform(WM_SysCommand,$F012,0);
    file://下侧
    if (y>=Panel1.Height-3)and(y<=Panel1.Width) then Panel1.Perform(WM_SysCommand,$F006,0);
  end
  else if (x>=Panel1.Width-3)and(x<=Panel1.Width) then
  begin
    file://右上角
    if (y>=0)and(y<=3) then Panel1.Perform(WM_SysCommand,$F005,0);
    file://右侧
    if (y>3)and(y<Panel1.Height-3) then Panel1.Perform(WM_SysCommand,$F002,0);
    file://右下角
    if (y>=Panel1.Height-3)and(y<=Panel1.Width) then Panel1.Perform(WM_SysCommand,$F008,0);
  end;
end;
主要使用 Perform 方法为

附录1.全部代码如下:

unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  if (x>=0)and(x<=3) then
  begin
    if (y>=0)and(y<=3) then Panel1.Perform(WM_SysCommand,$F004,0);
    if (y>3)and(y<Panel1.Height-3) then Panel1.Perform(WM_SysCommand,$F001,0);
    if (y>=Panel1.Height-3)and(y<=Panel1.Height) then Panel1.Perform(WM_SysCommand,$F007,0);
  end
  else if (x>3)and(x<Panel1.Width-3) then
  begin
    if (y>=0)and(y<=3) then Panel1.Perform(WM_SysCommand,$F003,0);
    if (y>3)and(y<Panel1.Height-3) then Panel1.Perform(WM_SysCommand,$F012,0);
    if (y>=Panel1.Height-3)and(y<=Panel1.Width) then Panel1.Perform(WM_SysCommand,$F006,0);
  end
  else if (x>=Panel1.Width-3)and(x<=Panel1.Width) then
  begin
    if (y>=0)and(y<=3) then Panel1.Perform(WM_SysCommand,$F005,0);
    if (y>3)and(y<Panel1.Height-3) then Panel1.Perform(WM_SysCommand,$F002,0);
    if (y>=Panel1.Height-3)and(y<=Panel1.Width) then Panel1.Perform(WM_SysCommand,$F008,0);
  end;
end;

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if (x>=0)and(x<=3) then
  begin
    if (y>=0)and(y<=3) then Panel1.Cursor:=crSizeNWSE;
    if (y>3)and(y<Panel1.Height-3) then Panel1.Cursor:=crSizeWE;
    if (y>=Panel1.Height-3)and(y<=Panel1.Height) then Panel1.Cursor:=crSizeNESW;
  end
  else if (x>3)and(x<Panel1.Width-3) then
  begin
    if (y>=0)and(y<=3) then Panel1.Cursor:=crSizeNS;
    if (y>3)and(y<Panel1.Height-3) then Panel1.Cursor:=crArrow;
    if (y>=Panel1.Height-3)and(y<=Panel1.Width) then Panel1.Cursor:=crSizeNS;
  end
  else if (x>=Panel1.Width-3)and(x<=Panel1.Width) then
  begin
    if (y>=0)and(y<=3) then Panel1.Cursor:=crSizeNESW;
    if (y>3)and(y<Panel1.Height-3) then Panel1.Cursor:=crSizeWE;
    if (y>=Panel1.Height-3)and(y<=Panel1.Width) then Panel1.Cursor:=crSizeNWSE;
  end;
end;

附录2.API SendMessage()介绍
SendMessage === user32.lib
LRESULT SendMessage(

    HWND hWnd, // handle of destination window
    UINT Msg, // message to send
    WPARAM wParam, // first message parameter
    LPARAM lParam  // second message parameter
   );

 

             2001.9.27

Delphi实现控件的移动、改变大小

关键词:实现控件的移动、改变大小 实现控件的移动,改变大小(DELPHI实现) 主要使用Perform方法   function Perform(Msg: Cardinal; WPara...
  • delphi308
  • delphi308
  • 2013年08月08日 17:07
  • 663

如何实现一个无边框Form的移动和改变大小(二)

接着上文:这里写链接内容 我们来说说一个比较复杂的实现, 效果如图: 注意为了能够凸显没有NC(NotClient)区域,我们额外用了3个panel分别放在窗体的左右和下部。用来模拟客户自己...
  • norsd
  • norsd
  • 2015年09月22日 14:13
  • 1149

随着手指滑动动态改变子控件位置、透明度、大小的实现方式

这里把布局文件和核心类代码贴出来,大家一起交流探讨! 为了省事,没加自定义属性,代码中写死了,在此只是提供一些思路。 package com.blemobi.demo.widg...
  • pciverson
  • pciverson
  • 2016年04月14日 13:14
  • 1290

Delphi实现窗体控件自由移动

Delphi实现窗体控件自由移动 2008-04-25 16:22 在做Mis项目过程中,有时需要让用户自己来实现窗体控件的布局,比如酒店管理中就需要对餐厅餐桌位置进行布局。要实现这种功能,必...
  • delphi308
  • delphi308
  • 2013年08月08日 21:10
  • 1440

C#当窗体大小改变时,窗体中的控件大小也随之改变

第一种:推荐 在窗体中加上如下代码即可实现,但窗体点击放大按钮时却不能改变控件大小。 private Size beforeResizeSize = Size.Empty; pr...
  • kasama1953
  • kasama1953
  • 2016年05月29日 00:26
  • 767

C# WinForm控件的拖动和缩放的实现

转自:http://blog.csdn.net/joyhen/article/details/8572505 C# WinForm控件的拖动和缩放是个很有用的功能。实现起来其实很简单的,主要是设...
  • u012252959
  • u012252959
  • 2016年01月22日 17:23
  • 2439

如何实现控件随对话框大小变化而自动调整大小和位置

1. 处理对话框的WM_SIZE,然后用MoveWindow或者SetWindowPos来把对话框上面的控件重新调整新位置和大小。  2. 基本的做法就是响应WM_SIZE消息,并按照窗口大小比例来...
  • fanwenyuan_fwy
  • fanwenyuan_fwy
  • 2014年10月14日 18:26
  • 902

Qt无边框窗口实现拖动和改变大小(修改)

Qt无边框窗口实现拖动和8个方向改变大小
  • qq_16952303
  • qq_16952303
  • 2016年07月20日 23:52
  • 2358

c# winform 一个可以用鼠标改变控件位置和大小的类,调用即可

using System;   using System.Collections.Generic;   using System.Text;   using System.ComponentMo...
  • SunCherryDream
  • SunCherryDream
  • 2014年03月11日 12:15
  • 1143

DUILIB按钮随窗口变化而移动

前言:这几天一直在研究DUILIB,原以为DUILIB很好用很好学,随着软件的深入,发现DUILIB毕竟还是在初期阶段,关键问题在于资料太少,或许有一些大牛,但还没有看到他们的文章,希望大家都能分享自...
  • harvic880925
  • harvic880925
  • 2013年05月28日 10:04
  • 11067
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现控件的移动、改变大小(DELPHI实现)
举报原因:
原因补充:

(最多只允许输入30个字)