Здравствуйте, Vaynamond, Вы писали:
V>Есть контрол класса WC_HEADER достаточной высоты. Можно-ли штатными средствами отобразить V>текст ячейки в несколько строк, или только через OWNERDRAW ?
Придется переписывать обработчики событий WM_NCHITTEST и WM_NCPAINT. В первом задаешь размер, в данном случае высоту заголовка и других частей окна, путем возвращения соответствующего кода, где указатель мыши в данный момент находится, а во втором перерисовываешь все неклиенские части окна.
Здравствуйте, Melamed, Вы писали:
M>Придется переписывать обработчики событий WM_NCHITTEST и WM_NCPAINT. В первом задаешь размер, в данном случае высоту заголовка и других частей окна, путем возвращения соответствующего кода, где указатель мыши в данный момент находится, а во втором перерисовываешь все неклиенские части окна.
Не, ты не понял. Окно хидера можно создать отдельно, есть такой класс окна WC_HEADER, входит в common controls. Автор видимо имеет ввиду именно этот случай.
Здравствуйте, Vaynamond, Вы писали:
V>Есть контрол класса WC_HEADER достаточной высоты. Можно-ли штатными средствами отобразить V>текст ячейки в несколько строк, или только через OWNERDRAW ?
Никогда не работал с этим классом окна напрямую, полистал в MSDN его стили и опции, ничего похожего на многострочность не нашел.
Видимо только самому рисовать.
Здравствуйте, Vaynamond, Вы писали:
V>Есть контрол класса WC_HEADER достаточной высоты. Можно-ли штатными средствами отобразить V>текст ячейки в несколько строк, или только через OWNERDRAW ?
Там не OWNERDWRAW, а CUSTOMDRAW, так что можно дать отработать штатному рисованию, и затем рисовать поверх, зная координаты столбца и его стейт, то есть, совсем несложно.
Здравствуйте, Evgeniy Skvortsov, Вы писали:
ES>Здравствуйте, Melamed, Вы писали:
M>>Придется переписывать обработчики событий WM_NCHITTEST и WM_NCPAINT. В первом задаешь размер, в данном случае высоту заголовка и других частей окна, путем возвращения соответствующего кода, где указатель мыши в данный момент находится, а во втором перерисовываешь все неклиенские части окна.
ES>Не, ты не понял. Окно хидера можно создать отдельно, есть такой класс окна WC_HEADER, входит в common controls. Автор видимо имеет ввиду именно этот случай.
Да, именно так — используется WC_HEADER.
Здравствуйте, Alexander G, Вы писали:
AG>Там не OWNERDWRAW, а CUSTOMDRAW, так что можно дать отработать штатному рисованию, и затем рисовать поверх, зная координаты столбца и его стейт, то есть, совсем несложно.
Вижу только HDF_OWNERDRAW (для ячейки). Где задается CUSTOMDRAW ?
Здравствуйте, 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
Здравствуйте, 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
Интересно. Спасибо, попробую. А то сложный заголовок выглядит неаккуратненько.
Здравствуйте, 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).
Здравствуйте, 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 не пришлось бы.
Здравствуйте, Alexander G, Вы писали:
V>>В итоге ловлю CDDS_ITEMPOSTPAINT, подрезаю справа и снизу на два пикселя, заливаю фоном с помощью ExtTextOut, после чего V>>вывожу текст через DrawText (с флагами DT_CENTER | DT_END_ELLIPSIS | DT_WORDBREAK).
AG>Я предложил, чтобы у столбца не было "своего" тескта вообще, тогда делать заливку ExtTextOut не пришлось бы.
У меня шапка может быть комбинированная (где однострочные ячейки, где многострочные). Сначала я хотел самостоятельно
выводить текст только в многострочных ячейках, но поэкспериментировав понял, что проще везде выводить самому.