c++ 一个方法只在主函数中起作用

问题描述 投票:0回答:1

想法是在任何应用程序之上制作铭文

我的 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(),但即使那样它也不起作用

c++ winapi
1个回答
1
投票

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, ...);
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.