想法是在任何应用程序之上制作铭文
我的 main.cpp 中有这段代码
#include "OVERLAY.h"
void notWorking(Overlay &ol)
{
ol.addLabel(100, 100, L"ASDASDASD", RGB(255, 0, 0));
}
int main()
{
Overlay ol;
ol.addLabel(100, 100, L"ASDASDASD", RGB(255, 0, 0));
//notWorking(ol);
for (;;)
{
ol.drawAll();
}
}
当我做
ol.addLabel(100, 100, L"ASDASDASD", RGB(255, 0, 0));
时,屏幕上会出现一个标签,
但是当我打电话给notWorking(ol);
时,它出现了一秒钟然后就消失了。
基本上我不能在我的主要功能旁边的任何地方打电话addLabel()
叠加类:
class Overlay
{
private:
std::vector<Label> labels;
HDC hdc;
public:
void addLabel(int x, int y, std::wstring title, COLORREF clr)
{
Label label;
label.create(x, y, title, hdc, clr);
label.draw(2);
labels.push_back(label);
}
void drawAll()
{
for (int i =0; i < labels.size(); i++)
labels[i].draw();
}
Overlay()
{
hdc = GetDC(GetDesktopWindow());
}
};
标签类:
class Label
{
int x, y;
std::wstring txt;
HDC* wdc;
COLORREF color;
public:
Label()
{
}
void create(int x, int y, std::wstring text, HDC wdc, COLORREF color)
{
this->x = x;
this->y = y;
this->txt = text;
this->wdc = &wdc;
this->color = color;
}
void draw(int state = 1)
{
RECT rect;
SetTextColor(*wdc, color);
SetBkMode(*wdc, state);
rect.left = x;
rect.top = y;
DrawText(*wdc, txt.c_str(), -1, &rect, DT_NOCLIP);
}
};
我试着在它的类中调用 addLabel(),但即使那样它也不起作用
在
Label
中,您正在存储一个 HDC*
指针,该指针指向 HDC
变量,该变量在 Label
构造函数中是局部的,当构造函数退出时它超出范围,从而使指针悬空。在该点之后使用 HDC*
指针是 undefined behavior.
这意味着,即使在
addLabel()
内部调用main()
也会遇到这个问题。它能起作用的事实纯属运气。
HDC
已经是一个指针类型,因此您可以安全地复制它并按其值存储它(就像 Overlay
在内部所做的那样)。
更改
Label
以删除HDC
上的额外指针间接,例如:
class Label
{
...
HDC wdc;
...
public:
...
void create(..., HDC wdc, ...)
{
...
this->wdc = wdc;
...
}
void draw(...)
{
...
SetTextColor(wdc, ...);
SetBkMode(wdc, ...);
...
DrawText(wdc, ...);
}
};