UpdateLayeredWindow使用普通的canvas/textout

Kno*_*bik 4 delphi opengl directx winapi

有没有办法在画布上绘制然后使用updatelayeredwindow,所以不会看到表单,但文本,如只显示文本的transculent表单?如果没有,那么有没有办法制作某种只有画布(opengl/directx)的变形形式?我想在所有窗口的顶部绘制命令.

Ser*_*yuz 7

您可以将TransparentColor表单的属性设置为"True",然后将表单颜色设置为相同的颜色TransparentColorValue,并且表单的所有客户区域都将是透明的.如果您使用的Delphi版本没有'TransparentColor [Value]'属性,则可以通过API调用实现相同的功能:

  Color := clBlack;
  SetWindowLong(Handle, GWL_EXSTYLE,
      GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED );
  SetLayeredWindowAttributes(Handle, 0, 255, LWA_COLORKEY);
Run Code Online (Sandbox Code Playgroud)

将使表单客户区透明.您可以像往常一样在画布上绘画:

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Font.Color := clWhite;
  Canvas.TextOut(0, 0, 'Text');
end;
Run Code Online (Sandbox Code Playgroud)

当然,您也可以在表单上放置一个标签,其字体颜色与透明颜色不同.

  • @Talibek - 通过将背景设置为与'clWindowText'略有不同的颜色,我可以得到没有可见轮廓的标签.Fi`BgColor:= graphutil.ColorAdjustLuma(clWindowText,10,False)`,将表单的'Color','TransparentColorValue'和标签的'Color'设置为此值,label的字体颜色为'clWindowText'.它有助于摆脱轮廓,但也减少了抗锯齿现在看起来更加丑陋.当没有轮廓时,当表格下的颜色相似时,它是不可见的.我想这是一个完全不同的问题,然后透明度,考虑问一个问题. (2认同)