Win32 List-View Control Заполнение подэлемента для пользовательских нарисованных подэлементов? - PullRequest
7 голосов
/ 09 сентября 2008

При использовании пользовательского рисования (NM_CUSTOMDRAW) для рисования всего содержимого подэлемента ListView (в представлении «Отчет / подробности») было бы неплохо иметь возможность применять одно и то же слева и справа. заполнение в моем пользовательском методе рисования, который применяется самим элементом управления для элементов, не нарисованных пользователем.

Есть ли способ программно получить это значение заполнения? Это связанные с шириной конкретного символа ("" или "w" или что-то?) или это фиксированное значение (6px слева и 3px справа или что-то) или ...?

РЕДАКТИРОВАТЬ: Чтобы уточнить, Я хочу добавить к моим подэлементам NM_CUSTOMDRAWn тот же самый отступ, который элемент управления добавляет к элементам, которые он рисует , а метрика, которую я ищу, например, это пробел между началом второго столбца и словом «сиамский» на следующем снимке экрана ( Примечание: добавлен снимок экрана из MSDN, чтобы помочь объяснить мой вопрос ):

List View in Report View

Обратите внимание, что слово "сиамский" выровнено с заголовком ("Порода"). Я хотел бы иметь возможность гарантировать такое же выравнивание для нарисованных на заказ предметов.

Ответы [ 5 ]

2 голосов
/ 21 декабря 2009

использовать сообщение заголовка ListView HDM_GETBITMAPMARGIN см текст ссылки

1 голос
/ 09 декабря 2011

способ сделать это - получить формат соответствующего столбца с ListView_GetColumn () затем проверьте полученный myLVCOLUMN.mask

LVCOLUMN myLVCOLUMN;
myLVCOLUMN.mask=LVCF_FMT;
ListView_GetColumn(hwnd,nCol,&myLVCOLUMN);

тогда, когда мы рисуем соответствующую метку, принадлежащую этому столбцу

if(myLVCOLUMN.fmt & LVCFMT_CENTER)
    DrawText(x,x,x,x, DT_CENTER | DT_WORD_ELLIPSIS );
else if (myLVCOLUMN.fmt & LVCFMT_RIGHT)
    DrawText(x,x,x,x, DT_RIGHT | DT_WORD_ELLIPSIS );
else
    DrawText(x,x,x,x, DT_LEFT | DT_WORD_ELLIPSIS );
1 голос
/ 11 сентября 2008

ListView_GetSubItemRect (LVM_GETSUBITEMTECT)

http://msdn.microsoft.com/en-us/library/ms930172.aspx

Несмотря на то, что сказано в документации, я подозреваю, что LVIR_LABEL возвращает только те, которые возвращают ограничивающий прямоугольник текста элемента, согласно ListView_GetItemRect.

(Это просто продолжало мучить меня, как будто я где-то видел ответ, когда играл с NM_CUSTOMDRAW).

Редактировать после комментария 2:

Я предполагаю, что вы видели NMLVCUSTOMDRAW, который, если вы хотите использовать версию 6.0. имеет rcText. Я бы не стал, так как использую Win2K.

Учитывая то, что вы нашли, я бы вернулся к предложению использовать ListView_GetItemRect, чтобы получить LVIR_LABEL и сравнить его с LVIR_BOUNDS и использовать разницу.

0 голосов
/ 11 сентября 2008

Можно только догадываться, не видя вашего выхода.

Несколько предложений: Если вы используете функцию DrawTextEx, экспериментировали ли вы с DT_INTERNAL и др.?

Вы случайно вставляете пустое изображение / значок.

В классическом режиме экрана все выглядит нормально? Если это так, я бы посмотрел функции XP Theme, чтобы увидеть, происходит ли что-то.

Позднее редактирование после первого комментария:

Интересно, соответствует ли размер прямоугольника пространству, необходимому для поля редактирования LVN_ENDLABELEDIT вокруг текста, чтобы текст не двигался (или для прямоугольника фокусировки)?

Полагаю, вы могли бы сравнить результат LVM_GETITEMRECT с LVIR_LABEL в первом столбце и использовать разницу в качестве левой границы.

0 голосов
/ 09 сентября 2008

Я бы предположил, что GetSystemMetrics () - это то, что вам нужно посмотреть. Я думаю, что SM_CXEDGE и SM_CYEDGE , вероятно, те значения, которые вы хотите, но не указывайте меня по этому поводу. ; -)

...