Как я могу прикрепить данные пользователя к каждому элементу в списке?C ++ Win32 - PullRequest
2 голосов
/ 13 августа 2010

Я думал, что мог бы использовать структуры LVITEM LPARAM, чтобы прикрепить указатель на мой класс, но я не могу заставить его работать!

Вот основные части моего кода:

Создание списка:

hlvQuiz = CreateChild(WC_LISTVIEW, "",
    WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | LVS_ICON | LVS_AUTOARRANGE,
    0, 0, 320, 240, m_hwnd, FontNormal);

Добавление предметов:

if (vQuizes.size() > 0)
{
    LVITEM lvi;
    lvi.mask = LVIF_TEXT | LVIF_PARAM;
    lvi.iItem = 0;
    lvi.iSubItem = 0;
    lvi.cchTextMax = QUIZSTRLEN;

    for (unsigned int i = 0; i < vQuizes.size(); i++)
    {
        lvi.lParam = (LPARAM)&vQuizes[i]; // adding pointer to lparam
        lvi.pszText = vQuizes[i].szName;
        ListView_InsertItem(hlvQuiz, &lvi);
    }
}

Потом, когда я вернусь, чтобы получить свой класс от LPARAM:

        LVITEM lvi;
    lvi.iItem = ListView_GetNextItem(hwnd, -1, LVNI_SELECTED);
    lvi.iSubItem = 0;

    if (ListView_GetItem(fm->hlvQuiz, &lvi) == TRUE)
    {
        Quiz* q = (Quiz*)lvi.lParam;
        if (q != NULL) // i get stopped here because my pointer is NULL
            if (Exists(q->szPath) == IS_FILE)
                ShellExecute(NULL, "edit", q->szPath, NULL, NULL, SW_SHOWNORMAL);
    }

Есть что-то, что я делаю не так? просмотр списка создает нормально, и элементы добавляются, но указатель на мой класс, который я поместил в значение LPARAM, кажется, игнорируется или изменяется к тому времени, когда я обращаюсь к нему с разыменованием

Ответы [ 2 ]

5 голосов
/ 13 августа 2010

Я не работал на этом низком уровне раньше, но я подозреваю, что вам нужно установить для маскирующего элемента структуры LVITEM значение LVIF_PARAM (а также соответствующие значения для всего, что вам нужно) для вызова ListView_GetItem.

0 голосов
/ 13 августа 2010

Ваш код работает нормально в режиме отладки, но не в режиме выпуска, потому что вы пропустили указание имени LPARAM в lvi.mask (и имени любого другого поля, которое вы хотите вернуть).

Попробуйте это:

lvi.iItem = ListView_GetNextItem(hlvQuiz, -1, LVNI_SELECTED);
lvi.mask = LVIF_PARAM;

if (ListView_GetItem(fm->hlvQuiz, &lvi) == TRUE) ...

Вы получите копию установленного вами значения LPARAM.Я думаю, что это маленькое странное поведение связано с помощью режима отладки, который инициализирует все для вас.Режим релиза вместо этого нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...