gpt4 book ai didi

c++ - 如何在没有窗口的情况下绘制文本

转载 作者:行者123 更新时间:2023-11-30 01:50:35 25 4
gpt4 key购买 nike

我试图在屏幕上显示文本,在所有内容之上,不可点击,没有任何窗口。这个想法是能够显示通知。我离我想要的有点近了,但是刚刚出现了一个非常奇怪的问题。这是代码:

#include <Windows.h>  

int main(void){

HDC hdc = ::GetDC(0);
RECT rect;
SetTextColor(hdc, RGB(0, 0, 255));
SetBkMode(hdc, TRANSPARENT);
SetBkColor(hdc, RGB(0, 0, 0));
auto hFont = CreateFont(40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, L"Verdana");
auto hTmp = (HFONT)SelectObject(hdc, hFont);
rect.left = 40;
rect.top = 10;

while (true){
DrawText(hdc, L"THIS IS A TEXT", -1, &rect, DT_SINGLELINE | DT_NOCLIP);
Sleep(1);
}
DeleteObject(SelectObject(hdc, hTmp));
::ReleaseDC(0, hdc);
return 0;

}

这是当我将文本设置从 red 更改为 blue 并将大小 80 更改为 40 时发生的情况>:

buggz

出于某种原因,在重新运行程序后,我仍然可以看到旧文本,这告诉我我误解了一些东西。是否有更好、更简洁的方法来执行此操作?

编辑:我检查了 Windows 通知,这不是解决方案。想象一下,您正在玩​​一个全屏游戏,并且想知道是否有电子邮件到达。另一个重要的事情是它不能被点击,所以错误的点击不会最小化你的游戏。当您接到电话时,将您的应用程序最小化的 Skype 弹出窗口有多烦人?

最佳答案

您绕过了所有窗口/客户端控件,因此系统不知道需要清除该区域。你需要手动告诉它,特别是因为你没有使用 windows 消息通知机制。

在绘制之前,你想使屏幕的那部分无效并告诉窗口重绘它:

::InvalidateRect (0, &rect, false);   //  Redraw without erasing. If doesn't help, try true
::UpdateWindow (0);
while (true)...

关于c++ - 如何在没有窗口的情况下绘制文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27271207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com