Проблема очистки изображения заголовка Listview в Vista - PullRequest
0 голосов
/ 16 апреля 2009

У меня проблема в Vista с элементом управления Listview, в частности, установка пользовательских значков в заголовке. Обычно под XP или любой другой из предыдущих версий Windows, если бы я добавил значок (на C ++), я мог бы сделать это с помощью следующего:

HeaderItem.mask     = HDI_FORMAT | HDI_IMAGE;
Header_GetItem(HeaderHWND, Column, &HeaderItem);

TurnOn(HeaderItem.fmt, HDF_IMAGE);
HeaderItem.iImage = Image;
if (Header_SetItem(HeaderHWND, Column, &HeaderItem) == 0)
    printf("Failed to set header [%d:%.8X]\n", GetLastError(), GetLastError());

и затем для удаления изображения в определенном столбце я мог бы использовать тот же процесс, но вместо того, чтобы включить бит HDF_IMAGE, вы просто выключаете его.

Однако в Vista, когда я ее выключаю, кажется, что изменения не принимаются. Так, например, когда я запускаю мой fmt:

0x4000 (или в основном HDF_STRING)

Я включаю значок, и он становится:

0x5800 (или в основном HDF_STRING | HDF_IMAGE | HDF_BITMAP_ON_RIGHT)

Затем я снова выключаю его, но результат:

0x4800 (или в основном HDF_STRING | HDF_IMAGE)

Я проверил и установил только HDF_STRING, но после установки HDF_IMAGE его невозможно удалить. Header_SetImage не возвращает никаких ошибок, так что я не знаю, что делать. Я также попытался удалить список изображений из элемента управления, но он все еще оставляет пространство, как будто там все еще было изображение.

В конце дня мне нужно иметь возможность добавлять и удалять значки из заголовка, а когда они удаляются, мне снова нужно все пространство заголовка (как оно было до того, как оно появилось. Любая помощь будет очень полезна). оценил - спасибо заранее!

Ответы [ 2 ]

1 голос
/ 16 апреля 2009

Если вы читаете документацию http://msdn.microsoft.com/en-us/library/bb775247(VS.85).aspx,, если вы указываете HDI_IMAGE в маске, тогда iImage должен быть допустимым индексом, вы должны установить его в I_IMAGENONE, чтобы удалить его.

Если вы хотите удалить изображение, вы должны сделать что-то вроде этого:

HeaderItem.mask = HDI_FORMAT | HDI_IMAGE;
Header_GetItem(HeaderHWND, Column, &HeaderItem);
HeaderItem.fmt &= ~(HDF_IMAGE | HDF_BITMAP_ON_RIGHT);
HeaderItem.iImage = I_IMAGENONE;
Header_SetItem(HeaderHWND, Column, &HeaderItem);
0 голосов
/ 16 апреля 2009

Э-э, я только что понял - они немного изменили способ, которым все работает теперь, до передаваемых параметров.

Раньше я всегда устанавливал iImage на 0, когда удалял атрибут HDF_IMAGE - но теперь, если вы выполняете Set, и похоже, что ваша маска содержит HDI_IMAGE, она не удалит бит HDF_IMAGE, даже если вы явно делаем.

Итак, решение состоит в том, чтобы не отправлять что-либо, связанное с изображением, если вы пытаетесь удалить его. Поскольку я просмотрел сеть и ничего не смог найти по этому поводу, надеюсь, этот пост теперь поможет всем, кто сталкивается с подобной проблемой.

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