【问题标题】:delphi form transparency not working in win7delphi表单透明度在win7中不起作用
【发布时间】:2016-04-18 15:24:25
【问题描述】:

我做了一个小应用,

我有 form.color := clolive ; 的主窗体 并设置了transparentcolor := true;TransparentColorvalue := clolive;

它在我的 Windows 8.1 上运行良好,没有桌面效果。 我可以在mainform.canvas 上“画画”

当我在具有视觉样式的 Windows 7 上测试这个迷你应用程序时,表单透明度被忽略,我无法绘图,我的鼠标光标“触摸”了mainform“后面”的图标和对象

有什么解决办法吗?

谢谢

我的代码:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
application.minimize;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
application.terminate;
end;

procedure TForm1.FormClick(Sender: TObject);
var p: TPoint;
begin
form1.Canvas.Pen.Color:=clyellow;
form1.Canvas.Pen.Width:=5;
p.X:=mouse.CursorPos.X;
p.y:=mouse.CursorPos.Y;
form1.Canvas.PenPos:=p;
form1.Canvas.LineTo(p.x,p.y);
end;

end.

表格1:

formstyle:=fsStayOnTop;
borderstyle:=bsNone;
WindowState:=wsMaximized;
TransparentColor:=true;
TransparentColorValue:=clOlive;
Color:=clOlive;

【问题讨论】:

  • 我想我们可以尝试构建您的程序并进行调查。但是我肯定会担心我构建的程序与您的程序不同,因此会调试错误的东西。接下来发生的事情是你说,“哦,不,我的程序不是那样的,它是这样的”。就这样。它可能不会以这种方式发生,但它会发生很多次。如果您提供了minimal reproducible example,那么这种情况是不可能的。
  • 感谢@DavidHeffernan 的回复。它的应用非常简单,只需设置透明度,一键最小化和退出...和 ​​mainform.Canvas.Pen.Color:=clyellow; formstyle fs最大化,增加了一个事件:Tmainform.FormClick(Sender: TObject);以下是什么: p(TPoint) p.x:=mouse.cursorpos.x; p.y:=mouse.cursorpos.y; mainform.Canvas.PenPos:=p; mainform.canvas.lineto(p.x,p.y);所以 - 整个程序基于在桌面上绘制“点”、线。原因 - 这将是教师的帮助,他们可以标记和绘制到桌面而不影响图标等......)
  • 你知道吗,我想我不会。如果您找不到在问题中添加minimal reproducible example 的动机,我不能。
  • @DavidHeffernan - 整个代码已添加到问题中...

标签: forms delphi transparency


【解决方案1】:

您的代码的最大问题是您在错误的位置进行绘制。您需要绘制以响应 Windows 绘制消息 WM_PAINT。在 VCL 应用程序的上下文中,这通常意味着在重写的 Paint 方法或 OnPaint 事件处理程序中。

为了在表单上绘画,您可以处理表单的OnPaint 事件并在那里进行绘画。这意味着您需要记住在表单上进行的每一次点击,并且当您被要求绘制窗口时,您会为迄今为止发生的每一次点击绘制一些内容。

这是一个常见的错误。窗口没有持久的绘图画布。窗户必须能够根据需要在任何时间点自行涂漆。我建议您阅读 Win32 图形的介绍性教程。你可能会比从 Petzold 的书开始做得更糟。

【讨论】:

  • 感谢您的回答,但它仍然无法解决没有视觉效果的 win8 上的透明窗口与带有 aero 的 win7 的不同行为的问题。Form.click 适用于 win8 ,但不适用于带有 aero 的 win7。
  • 好吧,也许你应该问这个问题,不要通过在OnClick 事件处理程序中绘制来混淆这个问题。您能否相应地编辑问题。适当尊重 MCVE 中的 M。问题中的代码也没有提及 VCL 样式。我认为你没有足够努力地提出一个准确的问题。
  • 我认为这个问题已经很清楚了,我无法更详细地描述我的问题,因为我的英语水平。如果你能帮助我,那就建议一些东西,如果你不能帮助我,不要怪我的“编程”和语言能力
  • 也许你是对的。也许我不知道我在说什么。也许我不知道什么是一个好问题。祝你好运。也许其他人将能够重现您的程序。
  • 我不得不说,Delphi 需要它可以得到的所有新手,虽然我很欣赏“帮助某人学会自助”的意图,但这里展示的态度无助于鼓励人们加入一点点。
【解决方案2】:

当我在 Windows 7 上使用视觉样式测试这个迷你应用程序时, 表单透明度被忽略,我无法绘制,我的鼠标光标 “触摸”主窗体“后面”的图标和对象。

在 Windows 7 和 Aero 主题下,表单是透明的,但对鼠标点击有反应,因此可以绘图。鼠标点击(或移动)没有通过表单到达表单下方的任何内容。

在 Windows 7 和 Aero 主题关闭的情况下,表单对于鼠标操作也是透明的,随后绘图不起作用,鼠标操作会作用于表单下方的任何内容。

所以有区别,但我不清楚你想要什么。

也许您的问题是您的 Windows 设置?见http://www.sevenforums.com/tutorials/283-transparency-enable-disable.html

【讨论】:

    【解决方案3】:

    感谢您的回复,我试图更改windows设置,但我想制作通用应用程序......所以我做了一个框架并放入表单中,并将AlphaBlend设置为True,并将AlphaBlend的值设置为设置为 1(非常透明 :) ).. 它在 Windows 7、Windows 8、8.1 以及 Windows 10 上对我有用......它不是很好的解决方案,但至少有效......

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多