动态桌面歌词如何实现比较方便?

ooolinux 2019-03-22 07:43:41
动态桌面歌词是一个特殊形状的窗口吗?如何实现比较方便?
...全文
1875 47 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2019-06-21
  • 打赏
  • 举报
回复
引用 46 楼 早打大打打核战争 的回复:
可以,判断鼠标位置和按键状态即可,另一种方法是不设置窗口透明,而是使用AlphaBlend,AlphaBlendValue设置为·一个很小的值(不能为0)
有空试一下。
  • 打赏
  • 举报
回复
可以,判断鼠标位置和按键状态即可,另一种方法是不设置窗口透明,而是使用AlphaBlend,AlphaBlendValue设置为·一个很小的值(不能为0)

  • 打赏
  • 举报
回复
这是在透明窗口下的桌面上直接绘制文字的效果,字体边缘平滑还是很好的:


代码也很简单:
procedure TForm1.Button1Click(Sender: TObject);
var
DesktopCanvas: TCanvas;
P: TPoint;
begin
DesktopCanvas := TCanvas.Create;
DesktopCanvas.Handle := GetWindowDC(0);
P := ClientToScreen(P.Zero);

Refresh;

with Image1.Canvas do
begin
CopyRect(Rect(0, 0, 200, 100),
DesktopCanvas,
Rect(P.X, P.Y, P.X + 200, P.Y + 100));
Brush.Style := bsClear;
Font.Name := '宋体';
Font.Size := 60;
Font.Color := clRed;
TextOut(0, 0, '测试');
end;

DesktopCanvas.CopyRect(Rect(P.X, P.Y, P.X + 200, P.Y + 100),
Image1.Canvas,
Rect(0, 0, 200, 100));
DesktopCanvas.Free;
end;
  • 打赏
  • 举报
回复
拖动不是问题,不是还有一个透明窗口吗,SetWindowsHookEx安装一个鼠标HOOK(不需要写DLL),检测到在窗口某个范围之内移动时按键按下就取消透明,移动,回复透明
ooolinux 2019-06-20
  • 打赏
  • 举报
回复
引用 43 楼 早打大打打核战争 的回复:
拖动不是问题,不是还有一个透明窗口吗,SetWindowsHookEx安装一个鼠标HOOK(不需要写DLL),检测到在窗口某个范围之内移动时按键按下就取消透明,移动,回复透明
如果透明窗口改成无标题栏无边框,还可以HOOK鼠标及判断鼠标在歌词位置吗?
  • 打赏
  • 举报
回复
是你说的直接绘制到桌面...
ooolinux 2019-06-19
  • 打赏
  • 举报
回复
引用 41 楼 早打大打打核战争 的回复:
是你说的直接绘制到桌面...


要平滑也只能用绘制了。
用Label来显示透明桌面歌词,按你说的原理,锯齿也是难免。
不知道他们GDI+绘制的桌面歌词,怎么实现可以拖动的?
ooolinux 2019-06-18
  • 打赏
  • 举报
回复
引用 35 楼 早打大打打核战争 的回复:
实际上,win10默认开启字体边缘平滑,对上述CB6编译出的程序,在win10中不带manifest文件,显示效果是一样的。 在xp中,默认没有开启ClearType,下图是同一程序在xp中默认和开启ClearType的放大效果:
窗体里面的字体确实是平滑的,在win7下好像也是,不过如果是无窗体的背景透明的桌面歌词,感觉就不平滑了。
  • 打赏
  • 举报
回复
实际上,win10默认开启字体边缘平滑,对上述CB6编译出的程序,在win10中不带manifest文件,显示效果是一样的。
在xp中,默认没有开启ClearType,下图是同一程序在xp中默认和开启ClearType的放大效果:

ooolinux 2019-06-18
  • 打赏
  • 举报
回复
引用 39 楼 ooolinux 的回复:
[quote=引用 38 楼 ooolinux 的回复:]

先取背景再画,这个代码有点麻烦吧,如果要移动位置呢?你这个效果是这样做的吗?


先取背景再画,这个是用来“画”的,不是Label直接显示的?
[/quote]

如果是画出来,那就没有句柄了,想拖动歌词位置就难做了。
ooolinux 2019-06-18
  • 打赏
  • 举报
回复
引用 38 楼 ooolinux 的回复:
先取背景再画,这个代码有点麻烦吧,如果要移动位置呢?你这个效果是这样做的吗?


先取背景再画,这个是用来“画”的,不是Label直接显示的?
ooolinux 2019-06-18
  • 打赏
  • 举报
回复
引用 37 楼 早打大打打核战争 的回复:
直接绘制到桌面,也是有字体边缘平滑的:


之所以你觉得绘制到桌面后字体轮廓不那么平滑了,是因为绘制字体时的背景和显示字体时的背景已经不同了,而字体边缘平滑的原理是把字体边缘的像素和相邻的背景像素做过渡色插值,使锯齿部分不那么显眼。所以先取绘制字体区域的背景,在此背景上绘制字体,再画回去就好了。


先取背景再画,这个代码有点麻烦吧,如果要移动位置呢?你这个效果是这样做的吗?
  • 打赏
  • 举报
回复
直接绘制到桌面,也是有字体边缘平滑的:


之所以你觉得绘制到桌面后字体轮廓不那么平滑了,是因为绘制字体时的背景和显示字体时的背景已经不同了,而字体边缘平滑的原理是把字体边缘的像素和相邻的背景像素做过渡色插值,使锯齿部分不那么显眼。所以先取绘制字体区域的背景,在此背景上绘制字体,再画回去就好了。
ooolinux 2019-06-17
  • 打赏
  • 举报
回复
那个窗体文件是窗体作为文本查看复制的,不是记事本打开的。
ooolinux 2019-06-17
  • 打赏
  • 举报
回复
引用 32 楼 早打大打打核战争 的回复:
上图是程序窗体,下图是截屏后放大(在windows画图中放大的,不会做线性插值之类的反锯齿处理),可以看出确实对字体做了边缘平滑处理:


你试一下无窗体的呢?就是歌词直接显示在桌面上。我那个窗体文件就是。
ooolinux 2019-06-17
  • 打赏
  • 举报
回复
ooolinux 2019-06-17
  • 打赏
  • 举报
回复
引用 15 楼 早打大打打核战争 的回复:
他的代码很冗长,使用GDI+唯一的优点是可以平滑字体边缘,不过不用GDI+也一样可以做到,有几种方法: 1. 用CreateFont,iQuality参数设置为ANTIALIASED_QUALITY或者CLEARTYPE_QUALITY 2. 用SystemParametersInfo,SPI_SETFONTSMOOTHING设置为true,全局启用字体平滑 3. 调用SetProcessDpiAwarenessContext,参数DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE或者DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2,不管系统设置如何,对该进程启用ClearType字体,但这个调用只能支持win10 4. 建立一个应用程序同名的manifest,指出DpiAware为true <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware>true</dpiAware> </windowsSettings> </application> </assembly> 这个方法对Vista+都有效
BCB 6.0,字体撇捺部分锯齿比较明显亚,空工程,窗体如下:
object Form1: TForm1
  Left = 192
  Top = 130
  BorderStyle = bsNone
  Caption = 'Form1'
  ClientHeight = 165
  ClientWidth = 630
  Color = clBlack
  TransparentColor = True
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  Position = poScreenCenter
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 8
    Top = 16
    Width = 576
    Height = 97
    Caption = '动态桌面歌词'
    Color = clBlack
    Font.Charset = GB2312_CHARSET
    Font.Color = clTeal
    Font.Height = -96
    Font.Name = '宋体'
    Font.Style = []
    ParentColor = False
    ParentFont = False
  end
end
想用第四种方法,运行程序提示有错误。
  • 打赏
  • 举报
回复
上图是程序窗体,下图是截屏后放大(在windows画图中放大的,不会做线性插值之类的反锯齿处理),可以看出确实对字体做了边缘平滑处理:

ooolinux 2019-06-17
  • 打赏
  • 举报
回复
引用 30 楼 早打大打打核战争 的回复:
我试了一下,虚拟机中CB6编译一个带Label的窗体,复制到win10中,加一个.manifest,运行正常


加.manifest运行可以去掉锯齿吗?
我在win7和win10下随.manifest文件运行都出错了:
  • 打赏
  • 举报
回复
我试了一下,虚拟机中CB6编译一个带Label的窗体,复制到win10中,加一个.manifest,运行正常
加载更多回复(27)

1,185

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧