Пользовательские отрисовочные элементы ListView без границ в соответствии с тем, как это делает сам TListView.

В пользовательском элементе управления я самостоятельно рисую элементы в TListView.OnAdvancedCustomDrawItemмероприятие. Это хорошо работает.

Я экспериментировал с несколькими классами и частями Theme. Например, когда я использую:

      HTHEME Theme = OpenThemeData(Handle, L"Explorer::ListView") ;
DrawThemeBackground (Theme, Sender->Canvas->Handle, LVP_LISTITEM, LISS_NORMAL, &ItemRect, NULL);

Я получаю то, что и следовало ожидать, для исследователя темы (обратите внимание на границы вокруг элемента):

Но, если я посмотрю на правильный VCL TListViewобъект, подобные элементы рисуются без рамки. Я ожидал, что этот элемент управления будет использовать тот же класс Theme и часть. Разве это не так? Если да, то какой класс/часть следует использовать для имитации поведения?

Вот что я вижу (обратите внимание на границы в пользовательском элементе управления по сравнению с отсутствием границ в истинном элементе управления TListView сразу под ним:

На самом деле я получаю «более приятный» результат с , но мне все еще очень любопытно .

К вашему сведению, используя LVP_GROUPHEADERвместо . Он хорошо работает для этого типа элемента управления, так что это хорошая альтернатива, но мне все еще очень любопытно, почему настоящий элемент управления ListView не рисует границы, используя LVP_LISTITEM(Я ДУМАЮ).

Возможно, я должен добавить, что я все еще использую старый C++ Builder 2009 для этого проекта. Это небольшая попытка улучшить управление, чтобы дать ему жизнь после W10 (особенно W11, где текущий выбор MENU / MENU_POPUPITEM не радует глаз). PS. теперь у меня больше проблем с TPopupMenu .. но я думаю, это другая тема.

Простой пример кода (не такой, как в проекте, но показывающий границу):

      #include "uxtheme.h"
#include "Vsstyle.h"

// Project includes uxtheme.lib

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HTHEME Theme = OpenThemeData(Handle, L"Explorer::ListView") ;

TRect ItemRect = Image1->ClientRect ;

DrawThemeBackground (Theme, Image1->Canvas->Handle, LVP_LISTITEM, LISS_NORMAL, (tagRECT*)&ItemRect, NULL);

CloseThemeData(Theme) ;
}
//---------------------------------------------------------------------------

0 ответов

Другие вопросы по тегам