Member 13089825 Ответов: 3

Как использовать getinsertmark


В моем требовании я должен получить текущую позицию вставки, используя следующий метод
GetInsertMark(LPLVINSERTMARK lvim) const


не могли бы вы рассказать мне, как использовать этот метод

Что я уже пробовал:

 LPLVINSERTMARK* lvim =NULL;
    if (m_probelist_ctl.GetInsertMark(lvim)
{

int nitem = = lvim->iItem
}
but i am gettimg compile error here ,
could you pleae tell me how to use GetInsertMark

3 Ответов

Рейтинг:
16

Jochen Arndt

Вы должны передать указатель на LVINSERTMARK структура (которая является LPLVINSERTMARK; LP указывает, что это указатель):

// Structure as local variable
LVINSERTMARK lvim;
// [EDIT]
// Must set the cbSize member
lvim.cbSize = sizeof(LVINSERTMARK);
// [/EDIT]
// Pass the address of the structure
if (m_probelist_ctl.GetInsertMark(&lvim))
{
    // Access structure element
    int nitem = lvim.iItem
}


Member 13089825

привет, спасибо, что его компиляция прошла успешно, но GetInsertMark (&lvim)возвращает ложные alwyas.
я делаю это, удаляя элемент в списке, и после этого я вызываю GetInsertMark(& lvim), но он возвращает false alwyas

Jochen Arndt

Смотрите мой обновленный ответ.
Структура должна быть инициализирована.
Я думал, что это делается с помощью GetInsertMark (), но это должно быть сделано.

Member 13089825

теперь также возвращая false и lvim имеют нижеприведенную valuse
cbSize = 16
dwFlags = 2147483648
пункт = -1
dwReserved = 3435973836
нужно ли мне позвонить в setinsertmark прежде чем позвонить getinsertmark?

Jochen Arndt

Значения элементов структуры не определены (случайны), если вызов не удался.

Возможные причины сбоев описаны по адресу https://msdn.microsoft.com/en-us/library/windows/desktop/bb774945 (v=vs.85). aspx (функция просто отправляет это сообщение в элемент управления списком)

"Точка вставки может появиться только в том случае, если элемент управления list-view находится в режиме icon view, small icon view или tile view, а не в режиме group-view."

и

"Примечание чтобы использовать это сообщение, вы должны предоставить манифест с указанием Comclt32.dll версия 6.0. дополнительные сведения о манифестах см. В разделе включение визуальных стилей."

Member 13089825

"Точка вставки может появиться только в том случае, если элемент управления list-view находится в режиме icon view, small icon view или tile view, а не в режиме group-view"
Привет, даже если я использую iconview также getinsertmark возвращается значение false.

Jochen Arndt

Может быть, на самом деле нет никакой точки вставки.
Попробуйте установить все остальные члены lvim равными нулю (dwFlags, iItem, dwReserved) и проверить iItem после вызова. Если это значение равно -1, то точка вставки отсутствует.

Member 13089825

я добавил Вот так
lvim. cbSize = sizeof (lvim); / / / / необходимо установить член cbSize
//memset(lvim. cbSize, 0, sizeof(LVINSERTMARK));
лвим.iItem = 0;
lvim. dwFlags = 0;
lvim. dwReserved = 0;
если (m_probelist_ctl.GetInsertMark (& lvim)) / / передать адрес структуры
{
// Элемент структуры доступа
int nitem = lvim.пункт;
}
но все равно он показывает -1

Jochen Arndt

Вы установили iItem в ноль, но теперь он равен -1. Это говорит вам о том, что на самом деле точка вставки не определена. Вы можете установить его с помощью SetInsertMark ().

Рейтинг:
1

Richard MacCutchan

Сообщений компилятора должно быть достаточно, чтобы помочь вам.

LPLVINSERTMARK* lvim =NULL; //<-- LPLVINSERTMARK is already a pointer, you do not need more indirection
    if (m_probelist_ctl.GetInsertMark(lvim) //<-- close parenthesis missing here
{
 
int nitem = = lvim->iItem //<-- what is this statement supposed to be?
}


Рейтинг:
1

Member 13089825

привет спасибо за ответ,
когда я даю ниже одну его ошибку затирания, как тип аргумента LPLVINSERTMARK * * несовместим с типом paramater LPLVINSERTMARK
если (m_probelist_ctl.GetInsertMark (lvim)

int nitem = = lvim->iItem //<-- what is this statement supposed to be?

сохранение текущего положения маркера вставки


Richard MacCutchan

Нет, это не так, у вас их два = знаки, которые являются тестом на равенство. Вам действительно нужно более тщательно проверить свой код.