【问题标题】:How to move a transparent form without border in Delphi?如何在 Delphi 中移动无边框的透明表单?
【发布时间】:2014-10-16 19:30:10
【问题描述】:

我已经知道并且已经使用这些方法创建了一个可以移动的没有边框的表单。 Move form without border style

我正在使用 WMNCHitTest 覆盖。 MouseDown 事件根本不起作用。

这个表格非常简单,它显示一个倒计时,一个每秒变化的数字,仅此而已。使用带有大字体的大 TLabel 绘制的数字。

但是我也使用 Delphi 的标准表单属性使这个表单透明。 现在,如果我尝试单击表格来移动它,我唯一可以使用的区域是绘制变化数字的线条,即使它们不那么细,这也不实用。 我希望用户能够通过单击数字附近的任意位置(例如在“0”或“8”内)将数字移动到屏幕的任何位置。

我会考虑在数字上画一个透明的矩形,作为可点击区域,但效果是一样的,点击会通过。

我知道一个应用程序可以做到这一点,所以这是可能的,但是如何?

procedure TfrmCountDown.Timer1Timer(Sender: TObject);
begin
  iCount := iCount - 1;
  lblTime.Caption := FormatFloat('00', iCount);
end;

procedure TfrmCountDown.FormCreate(Sender: TObject);
begin
  iCount := 60;
  BorderStyle:=bsNone;
  Self.Color := clGray;
  Self.TransparentColor := true;
  Self.TransparentColorValue := clGray;
end;

procedure TfrmCountDown.WMNCHitTest(var Message: TWMNCHitTest);
var
  Pt: TPoint;
begin
  Pt := ScreenToClient(SmallPointToPoint(Message.Pos));
  if Pt.Y < 160 then
    Message.Result := HTCAPTION
  else
    inherited;
end;

【问题讨论】:

  • 可以让我们重现您要求我们解决的问题的信息(表单的代码和属性设置)在哪里? (注意:我没有否决您的问题,但就目前而言,这是一个“请给我代码”的问题,要求我们调试我们看不到的代码。)
  • 我会放代码,但这不是调试或故障排除的东西,任何人都知道答案,或者不知道。你能同意吗?
  • 这是要调试的东西。 “我正在使用 WMNCHitTest 覆盖……我使表单透明……现在,如果我尝试单击表单来移动它,它就不起作用了。”是对存在问题的代码的描述,但您没有提供允许我们重现问题以进行调试的详细信息。
  • 我已经添加了代码 ;)
  • 肯,但这就是我解释的!大声笑....我说“如果我尝试单击表单来移动它,我唯一可以使用的区域是绘制变化数字的线条”和“我希望用户能够将数字移动到通过单击数字附近的任意位置(例如在“0”或“8”内),可以在屏幕的任何位置。”

标签: delphi transparency vcl


【解决方案1】:

VCL Form Transparency(这里假设你是指TransparentColor属性,而不是Alpha属性)使用分层窗口来实现透明绘图。使用这种技术,窗口的任何透明区域不仅在视觉上是透明的,而且在命中测试方面也是透明的。

即使用 VCL 表单透明度,您的表单中的透明区域可能根本不存在

可行的是关闭 VCL 表单透明度,而是使用 WS_EX_TRANSPARENT 窗口样式实现您的表单。这样可以实现视觉透明度,但允许您处理命中测试,以使表单的不同区域相对于点击透明或不透明。

不幸的是 WS_EX_TRANSPARENT 不是一个完整的“透明”解决方案 - 它只告诉 Windows 您的表单是透明的,但您还必须采取额外的步骤才能真正透明,或者解释什么“透明”是指您的特定表格。

这意味着它会使表单的视觉呈现变得复杂,并且您还必须覆盖绘制机制才能正确绘制表单。从您描述表单内容的方式来看,这听起来并不会太费力,尽管它非常简单(不幸的是,我没有一个可行的示例)。

至少您可能最好将 TLabel 替换为调用以选择适当的字体并将文本呈现到具有透明背景的窗口客户区。但是需要额外的内务管理。

在您的 WM_NCHITTEST 处理程序中,使用 HTNOWHERE 响应您希望被解释为“点击”区域的表单区域,以及 HTCAPTION 用于您希望支持拖动的区域(即根据您的描述,在文本边界定义的区域内)。

不幸的是,我认为您会发现绘制透明窗口的实现有很多繁琐的方面。

【讨论】:

    猜你喜欢
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多