防止透明表单上的Click-thru

时间:2012-04-21 13:33:35

标签: delphi delphi-xe transparent tform

我想在表单中绘制一个函数,而不显示表单背景。创建了一个TForm,其TransparentColor设置为True,TransParentColorValue设置为clWhite。只需在其上放置一个TImage,在位图上绘制一个函数,将其分配给图像,效果很好。有一个问题。我不能再单击该表单了。任何单击表单标题和clientarea导致单击底层应用程序。这是通过将TransparentColor设置为True引起的。如何防止这种“点击通过”?

更新 我尝试了Sertac的建议,得到了一些非凡的成果。我按如下方式准备位图:

   Bitmap.Canvas.Brush.Color := clFuchsia;
   Bitmap.Canvas.FillRect (Rect (0, 0, Bitmap.Width, Bitmap.Height));

当Color设置为clWhite和Forms TransparentColorValue时,表单完全启用了click-thru。

两者都设置为clBlack,表单可以移动,但边框不能调整大小,系统按钮不起作用

两者都设置为clFuchsia它表现为普通形式。嗯,它现在有用,但也许有人得到了解释?

1 个答案:

答案 0 :(得分:5)

当使用某些特定颜色时,API似乎很奇怪。白色是显而易见的,黑色有点问题。我试过用黄色,灰色,按钮面,紫红色等等。它们看起来很好。

如果有人想在不使用Delphi的'Transparent ...'属性的情况下复制问题,这里有一个小片段:

procedure TForm1.Button1Click(Sender: TObject);
var
  Color: DWORD;
  DC: HDC;
begin
  Color := $00FFFFFF;
  SetWindowLong(Handle, GWL_EXSTYLE,
      GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED );
  SetLayeredWindowAttributes(Handle, Color, 255, LWA_COLORKEY);

  DC := GetWindowDC(Handle);
  SetDCBrushColor(DC, Color);
  FillRect(DC, Rect(10, 10, 100, 80), GetStockObject(DC_BRUSH));
  ReleaseDC(Handle, DC);
end;

注意:如果有人提供明确解释的答案,我很乐意删除此答案。