GetDlgCtrlID и GetLastError возвращают 0 - PullRequest
0 голосов
/ 27 октября 2018

Я делаю приложение для WIN32, и мне нужно отслеживать (или каким-то образом получать) идентификатор различных статических элементов для изменения цвета.

Проблема возникает из-за того, что функция GetDlgCtrlID возвращает 0, а GetLastError возвращает также значение без ошибки.

Это класс, в котором я пытаюсь получить идентификатор и сохранить его.

Casilla::Casilla(HWND* window, std::set<int>* stackToEnable, std::set<int>* stackToDisable)
{
    m_window = window;
    m_wID = GetDlgCtrlID(*window);
    std::string str = GetLastErrorAsString();
    m_setToEnable = stackToEnable;
    m_setToDisable = stackToDisable;
}

DWORD WINAPI Casilla::Enable()
{
    InvalidateRect(*m_window, NULL, TRUE);
    m_setToEnable->insert(m_wID);
    return 0;
}

DWORD WINAPI Casilla::Disable()
{
    InvalidateRect(*m_window, NULL, TRUE);
    m_setToDisable->insert(m_wID);
    return 0;
}

//Returns the last Win32 error, in string format. Returns an empty string if there is no error.
std::string Casilla::GetLastErrorAsString()
{
    //Get the error message, if any.
    DWORD errorMessageID = ::GetLastError();
    if (errorMessageID == 0)
        return std::string(); //No error message has been recorded

    LPSTR messageBuffer = nullptr;
    size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);

    std::string message(messageBuffer, size);

    //Free the buffer.
    LocalFree(messageBuffer);

    return message;
}

И это код, который создает элемент и "Casilla" для отслеживания идентификатора.

void AddSlot(HWND hWnd)
{   
    HWND tmp = CreateWindowW(L"static", L"TO CHANGE COLOR", WS_VISIBLE | WS_CHILD | WS_BORDER | SS_CENTER, 500, 500, 100, 100, hWnd, NULL, NULL, NULL);
    Casilla* cas = new Casilla(&tmp, windowsToChangeColorToEnable, windowsToChangeColorToDisable);
}
...