【问题标题】:Delphi VCL make element "transparent" to clicksDelphi VCL 使元素对点击“透明”
【发布时间】:2014-08-05 11:55:16
【问题描述】:

是否可以让 VCL 元素对点击透明,例如在 FMX 中禁用命中测试?

【问题讨论】:

  • 如果控件是WinControl,则编写返回HTTRANSPARENTWM_NCHITTEST 处理程序可能会成功。但我不知道这是否仅适用于顶级窗口或所有带有句柄的控件。
  • @CodesInChaos,它也适用于子窗口。就是这样,例如当 InterceptMouse 属性设置为 False 时,TCustomTransparentControl 允许点击。
  • 如果您不介意外观,或者如果它不改变(例如面板),请禁用控件。
  • 对于非wincontrols,您可以将HTNOWHERE返回到CM_HITTEST

标签: delphi delphi-xe6


【解决方案1】:

在Form上放两个Memo,但Memo2部分在Memo1后面进行测试。然后添加这段代码:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Memo2Enter(Sender: TObject);
    procedure Memo2Exit(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    OriginalProc:TWndMethod;
    procedure MyWindowProc(var Msg: TMessage);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  OriginalProc:=Memo1.WindowProc;
  Memo1.WindowProc:=MyWindowProc;
end;

procedure TForm1.MyWindowProc(var Msg: TMessage);
begin
  OriginalProc(Msg);
  if Msg.Msg = WM_NCHITTEST then Msg.Result:=HTTRANSPARENT;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Memo1.WindowProc:=OriginalProc;
end;

procedure TForm1.Memo2Enter(Sender: TObject);
begin
  Memo2.Color:=clRed;
end;

procedure TForm1.Memo2Exit(Sender: TObject);
begin
  Memo2.Color:=clWhite;
end;

end.

【讨论】:

    猜你喜欢
    • 2013-03-16
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2011-12-15
    相关资源
    最近更新 更多