c++中的a方法只在main函数中起作用



这个想法是在任何应用程序的顶部制作铭文

我在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);时,它只出现了一瞬间,然后就消失了。基本上我不能在main函数

之外的任何地方调用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*指针是未定义行为

这意味着,即使在main()内部调用addLabel()也会受到这个问题的影响。它能起作用纯属运气。

HDC已经是一个指针类型开始,所以你可以安全地复制它并根据它的值存储它(就像Overlay内部做的那样)。

更改Label以间接删除HDC上的额外指针,例如:

class Label
{
...
HDC wdc;
...
public:
...
void create(..., HDC wdc, ...)
{
...
this->wdc = wdc;
...
}
void draw(...)
{
...
SetTextColor(wdc, ...);

SetBkMode(wdc, ...); 
...
DrawText(wdc, ...);
}
};

相关内容

  • 没有找到相关文章