Я делаю приложение 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;
}
И это код, который создает элемент и «Касиллу» для отслеживания идентификатора.
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);
}
Идентификатор равен нулю, потому что вы его не указываете. Вы также держите указатель на локальную переменную, которой больше не существует.
@DavidHeffernan, это правда. Я пришел с C# и все еще борюсь с объектами стека / кучи.
@JonathanPotter Где мне дать удостоверение личности? Я проверил документацию для CreateWindowW, но не вижу, где указан идентификатор.
hMenu
(тип HMENU
): дескриптор меню, или указывает идентификатор дочернего окна в зависимости от стиля окна». Поскольку вы передаете WS_CHILD
, этот аргумент получает идентификатор окна.
CreateWindow(...,(HMENU)ID,...)
должен решить проблему с ID. Вы также должны прочитать о «передаче по ссылке» и передаче указателей в C++. Обычно вы передаете действительный HWND
как константу, потому что вы не хотите его изменять (void foo(const HWND window)
). Оператора new
следует избегать в C++, поскольку он может вызвать утечку памяти. Вместо этого вы можете объявить Casilla cas;
как член класса глобальных данных.
Создавая элемент управления, вы не присваиваете ему идентификатор.