Многострочный текст в ячейке заголовка
От: Vaynamond Россия  
Дата: 15.11.18 14:49
Оценка:
Есть контрол класса WC_HEADER достаточной высоты. Можно-ли штатными средствами отобразить
текст ячейки в несколько строк, или только через OWNERDRAW ?
Re: Многострочный текст в ячейке заголовка
От: Melamed Россия  
Дата: 20.11.18 13:42
Оценка:
Здравствуйте, Vaynamond, Вы писали:

V>Есть контрол класса WC_HEADER достаточной высоты. Можно-ли штатными средствами отобразить

V>текст ячейки в несколько строк, или только через OWNERDRAW ?

Придется переписывать обработчики событий WM_NCHITTEST и WM_NCPAINT. В первом задаешь размер, в данном случае высоту заголовка и других частей окна, путем возвращения соответствующего кода, где указатель мыши в данный момент находится, а во втором перерисовываешь все неклиенские части окна.
Re[2]: Многострочный текст в ячейке заголовка
От: Evgeniy Skvortsov Россия  
Дата: 22.11.18 19:15
Оценка:
Здравствуйте, Melamed, Вы писали:

M>Придется переписывать обработчики событий WM_NCHITTEST и WM_NCPAINT. В первом задаешь размер, в данном случае высоту заголовка и других частей окна, путем возвращения соответствующего кода, где указатель мыши в данный момент находится, а во втором перерисовываешь все неклиенские части окна.


Не, ты не понял. Окно хидера можно создать отдельно, есть такой класс окна WC_HEADER, входит в common controls. Автор видимо имеет ввиду именно этот случай.
Re: Многострочный текст в ячейке заголовка
От: Evgeniy Skvortsov Россия  
Дата: 22.11.18 19:16
Оценка:
Здравствуйте, Vaynamond, Вы писали:

V>Есть контрол класса WC_HEADER достаточной высоты. Можно-ли штатными средствами отобразить

V>текст ячейки в несколько строк, или только через OWNERDRAW ?

Никогда не работал с этим классом окна напрямую, полистал в MSDN его стили и опции, ничего похожего на многострочность не нашел.
Видимо только самому рисовать.
Re: Многострочный текст в ячейке заголовка
От: Alexander G Украина  
Дата: 25.11.18 13:32
Оценка:
Здравствуйте, Vaynamond, Вы писали:

V>Есть контрол класса WC_HEADER достаточной высоты. Можно-ли штатными средствами отобразить

V>текст ячейки в несколько строк, или только через OWNERDRAW ?

Там не OWNERDWRAW, а CUSTOMDRAW, так что можно дать отработать штатному рисованию, и затем рисовать поверх, зная координаты столбца и его стейт, то есть, совсем несложно.
Русский военный корабль идёт ко дну!
Re[3]: Многострочный текст в ячейке заголовка
От: Vaynamond Россия  
Дата: 25.11.18 18:44
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Здравствуйте, Melamed, Вы писали:


M>>Придется переписывать обработчики событий WM_NCHITTEST и WM_NCPAINT. В первом задаешь размер, в данном случае высоту заголовка и других частей окна, путем возвращения соответствующего кода, где указатель мыши в данный момент находится, а во втором перерисовываешь все неклиенские части окна.


ES>Не, ты не понял. Окно хидера можно создать отдельно, есть такой класс окна WC_HEADER, входит в common controls. Автор видимо имеет ввиду именно этот случай.

Да, именно так — используется WC_HEADER.
Re[2]: Многострочный текст в ячейке заголовка
От: Vaynamond Россия  
Дата: 25.11.18 18:49
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Там не OWNERDWRAW, а CUSTOMDRAW, так что можно дать отработать штатному рисованию, и затем рисовать поверх, зная координаты столбца и его стейт, то есть, совсем несложно.


Вижу только HDF_OWNERDRAW (для ячейки). Где задается CUSTOMDRAW ?
Re[3]: Многострочный текст в ячейке заголовка
От: Alexander G Украина  
Дата: 26.11.18 09:00
Оценка:
Здравствуйте, Vaynamond, Вы писали:

V>Вижу только HDF_OWNERDRAW (для ячейки). Где задается CUSTOMDRAW ?


Нигде, оно само приходит. Owner-draw флаг при этом нужно не задавать.

Нужно получить в паренте WM_NOTIFY с кодом NM_CUSTOMDRAW
Но само приходит только с параметром CDDS_PREPAINT, и по умолчанию получает ответ CDRF_DODEFAULT,
поэтому по умолчанию больше ничего не приходит.

Встроиться нужно как-то так:
1. Хранить текст где-то у себя, чтобы дефолтное рисование его не рисовало
2. При параметре CDDS_PREPAINT вернуть CDRF_NOTIFYITEMDRAW, чтобы получить CDDS_ITEMPREPAINT / CDDS_ITEMPOSTPAINT
3. При параметре CDDS_ITEMPREPAINT вернуть CDRF_DODEFAULT, чтобы отработало дефолтное рисование, и сделало фон
4. При параметре CDDS_ITEMPOSTPAINT для требуемого столбца нарисовать многострочный текст и вернуть CDRF_DODEFAULT
Русский военный корабль идёт ко дну!
Re[4]: Многострочный текст в ячейке заголовка
От: Vaynamond Россия  
Дата: 26.11.18 09:51
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, Vaynamond, Вы писали:


V>>Вижу только HDF_OWNERDRAW (для ячейки). Где задается CUSTOMDRAW ?


AG>Нигде, оно само приходит. Owner-draw флаг при этом нужно не задавать.


AG>Нужно получить в паренте WM_NOTIFY с кодом NM_CUSTOMDRAW

AG>Но само приходит только с параметром CDDS_PREPAINT, и по умолчанию получает ответ CDRF_DODEFAULT,
AG>поэтому по умолчанию больше ничего не приходит.

AG>Встроиться нужно как-то так:

AG>1. Хранить текст где-то у себя, чтобы дефолтное рисование его не рисовало
AG>2. При параметре CDDS_PREPAINT вернуть CDRF_NOTIFYITEMDRAW, чтобы получить CDDS_ITEMPREPAINT / CDDS_ITEMPOSTPAINT
AG>3. При параметре CDDS_ITEMPREPAINT вернуть CDRF_DODEFAULT, чтобы отработало дефолтное рисование, и сделало фон
AG>4. При параметре CDDS_ITEMPOSTPAINT для требуемого столбца нарисовать многострочный текст и вернуть CDRF_DODEFAULT

Интересно. Спасибо, попробую. А то сложный заголовок выглядит неаккуратненько.
Re[4]: Многострочный текст в ячейке заголовка
От: Vaynamond Россия  
Дата: 05.12.18 13:40
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, Vaynamond, Вы писали:


V>>Вижу только HDF_OWNERDRAW (для ячейки). Где задается CUSTOMDRAW ?


AG>Нигде, оно само приходит. Owner-draw флаг при этом нужно не задавать.


AG>Нужно получить в паренте WM_NOTIFY с кодом NM_CUSTOMDRAW

AG>Но само приходит только с параметром CDDS_PREPAINT, и по умолчанию получает ответ CDRF_DODEFAULT,
AG>поэтому по умолчанию больше ничего не приходит.

AG>Встроиться нужно как-то так:

AG>1. Хранить текст где-то у себя, чтобы дефолтное рисование его не рисовало
AG>2. При параметре CDDS_PREPAINT вернуть CDRF_NOTIFYITEMDRAW, чтобы получить CDDS_ITEMPREPAINT / CDDS_ITEMPOSTPAINT
AG>3. При параметре CDDS_ITEMPREPAINT вернуть CDRF_DODEFAULT, чтобы отработало дефолтное рисование, и сделало фон
AG>4. При параметре CDDS_ITEMPOSTPAINT для требуемого столбца нарисовать многострочный текст и вернуть CDRF_DODEFAULT

Чего всплыло:
1. В п.3 при параметре CDDS_ITEMPREPAINT нужно вернуть CDRF_NOTIFYPOSTPAINT — иначе CDDS_ITEMPOSTPAINT не прилетит.
2. Проверял разные моменты, куда можно влезть — либо уже все есть (и текст, и сепараторы), либо вообще ничего нет (только окно заголовка залито фоном).
В итоге ловлю CDDS_ITEMPOSTPAINT, подрезаю справа и снизу на два пикселя, заливаю фоном с помощью ExtTextOut, после чего
вывожу текст через DrawText (с флагами DT_CENTER | DT_END_ELLIPSIS | DT_WORDBREAK).
Re[5]: Многострочный текст в ячейке заголовка
От: Alexander G Украина  
Дата: 05.12.18 14:34
Оценка:
Здравствуйте, Vaynamond, Вы писали:

V>Чего всплыло:

V>1. В п.3 при параметре CDDS_ITEMPREPAINT нужно вернуть CDRF_NOTIFYPOSTPAINT — иначе CDDS_ITEMPOSTPAINT не прилетит.

Ну может, я навскиду писал, под рукой варианта рабочего не было.

V>2. Проверял разные моменты, куда можно влезть — либо уже все есть (и текст, и сепараторы), либо вообще ничего нет (только окно заголовка залито фоном).


V>В итоге ловлю CDDS_ITEMPOSTPAINT, подрезаю справа и снизу на два пикселя, заливаю фоном с помощью ExtTextOut, после чего

V>вывожу текст через DrawText (с флагами DT_CENTER | DT_END_ELLIPSIS | DT_WORDBREAK).

Я предложил, чтобы у столбца не было "своего" тескта вообще, тогда делать заливку ExtTextOut не пришлось бы.
Русский военный корабль идёт ко дну!
Re[6]: Многострочный текст в ячейке заголовка
От: Vaynamond Россия  
Дата: 05.12.18 19:15
Оценка:
Здравствуйте, Alexander G, Вы писали:

V>>В итоге ловлю CDDS_ITEMPOSTPAINT, подрезаю справа и снизу на два пикселя, заливаю фоном с помощью ExtTextOut, после чего

V>>вывожу текст через DrawText (с флагами DT_CENTER | DT_END_ELLIPSIS | DT_WORDBREAK).

AG>Я предложил, чтобы у столбца не было "своего" тескта вообще, тогда делать заливку ExtTextOut не пришлось бы.

У меня шапка может быть комбинированная (где однострочные ячейки, где многострочные). Сначала я хотел самостоятельно
выводить текст только в многострочных ячейках, но поэкспериментировав понял, что проще везде выводить самому.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.