Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как изменить цвет фона или текста, отдельного элемента в List View, WinAPI 
:(
    Опции темы
S.A.G.
Дата 29.3.2008, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Читаю MSDN и никак немогу врубиться как это сделать. Что нужно делать, перехватив сообщение WM_NOTIFY?


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
korian
Дата 29.3.2008, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 4
Всего: 17



PM   Вверх
S.A.G.
Дата 30.3.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



korian, Я как раз читаю это и много чего другого, но разобраться пока немогу. Я так понимаю, что никак не изменишь цвет или фон ячейки просто изменив соотв. значения в передаваемых структурах в обработчик WM_NOTIFY? Т.е. выходит, что изменятся только локальные параметры обработчика. Может отослать WM_NOTIFY в нужный момент с обновленными структурами в качестве параметров? Иного выхода пока невижу.


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
korian
Дата 30.3.2008, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 4
Всего: 17



http://msdn2.microsoft.com/en-us/library/b...817(VS.85).aspx
пример изменения шрифта и его clrTextBk и clrText
HDC есть, так что, менять можно все, что можно менять для HDC.
некоторые операции делаются просто (как с шрифтом - установка нового шрифта, и return CDRF_NEWFONT)
а другие изменения делаем при PREPAINT и возвращаем исходное состояние HDC в POSTPAINT

PM   Вверх
S.A.G.
Дата 30.3.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



korian, спасибо за наводку. Оказывается, есть технология Custom Draw. Сейчас почитаю про нее в своей MSDN.


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
S.A.G.
Дата 30.3.2008, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Проблема, однако, не решена. Вот пример из MSDN:
Код
LPNMLISTVIEW  pnm    = (LPNMLISTVIEW)lParam;

switch (pnm->hdr.code){
...
case NM_CUSTOMDRAW:

    LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)lParam;

    switch(lplvcd->nmcd.dwDrawStage) {

    case CDDS_PREPAINT :
        return CDRF_NOTIFYITEMDRAW;

    case CDDS_ITEMPREPAINT:
        SelectObject(lplvcd->nmcd.hdc,
                     GetFontForItem(lplvcd->nmcd.dwItemSpec,
                                    lplvcd->nmcd.lItemlParam) );
        lplvcd->clrText = GetColorForItem(lplvcd->nmcd.dwItemSpec,
                                          lplvcd->nmcd.lItemlParam);
        lplvcd->clrTextBk = GetBkColorForItem(lplvcd->nmcd.dwItemSpec,
                                              lplvcd->nmcd.lItemlParam);

/* At this point, you can change the background colors for the item
and any subitems and return CDRF_NEWFONT. If the list-view control
is in report mode, you can simply return CDRF_NOTIFYSUBITEMREDRAW
to customize the item's subitems individually */
        ...

        return CDRF_NEWFONT;
    //  or return CDRF_NOTIFYSUBITEMREDRAW;

    case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
        SelectObject(lplvcd->nmcd.hdc,
                     GetFontForSubItem(lplvcd->nmcd.dwItemSpec,
                                       lplvcd->nmcd.lItemlParam,
                                       lplvcd->iSubItem));
        lplvcd->clrText = GetColorForSubItem(lplvcd->nmcd.dwItemSpec,
                                             lplvcd->nmcd.lItemlParam,
                                             lplvcd->iSubItem));
        lplvcd->clrTextBk = GetBkColorForSubItem(lplvcd->nmcd.dwItemSpec,
                                                 lplvcd->nmcd.lItemlParam,
                                                 lplvcd->iSubItem));

/* This notification is received only if you are in report mode and
returned CDRF_NOTIFYSUBITEMREDRAW in the previous step. At
this point, you can change the background colors for the
subitem and return CDRF_NEWFONT.*/
        ...
        return CDRF_NEWFONT;    
    }
...
}


Что делает функция GetFontForSubItem()? Кстати, в MSDN ее ненайти. И негде в студии ее тоже нет, гы гы гы. Вот она - забота о разработчиках от MS. Ладно, книжики есть корявые, но такого я не ожидал. Везде в примерах не рабочие коды, а постоянные сокращения. И еще на английском языке. Особенно любопытны ее параметры:

1. dwItemSpec - The item number. What is contained in this member will depend on the type of control that is sending the notification. See the NM_CUSTOMDRAW notification reference for the specific control to determine what, if anything, is contained in this member.

2. lItemlParam - Application-defined item data

3. iSubItem - в nmc вообще нету такого элемента.

Ну просто сказка - как же в этом разобраться?

Впрочем, понятно, что предпринимается попытка загрузить в контекст контрола необходимый цвет, шрифт и фон. Хотя рекомендуют они делать так(что тоже неработает):

Цитата
To change text colors for all controls that support custom draw except for the list view and tree view, simply set the desired text and background colors in the device context supplied in the custom draw notification structure with the SetTextColor and SetBkColor functions. To modify the text colors in the list view or tree view, you need to place the desired color values in the clrText and clrTextBk members of the NMLVCUSTOMDRAW or NMTVCUSTOMDRAW structure.


Предлагают пользоваться вторым вариантом, а в примере криво показали второй. А - ну да, цвет и фон просто записывают в локальные параметры, а шрифт заносят в контекст.


Это сообщение отредактировал(а) S.A.G. - 30.3.2008, 17:43


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
korian
Дата 30.3.2008, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 4
Всего: 17



GetFontForSubItem - это Application Defined функция =)
короче ее вы должны написать сами...
она должна возвращает нужный шрифт в зависимости от того, какая ячейка в данный момент рисуется.
все ее параметры описывают ячейку.

Добавлено через 2 минуты и 1 секунду
Цитата(S.A.G. @  30.3.2008,  16:25 Найти цитируемый пост)
Предлагают пользоваться вторым вариантом, а в примере криво показали второй.

в цитате ясно сказано "except for the list view and tree view".

Это сообщение отредактировал(а) korian - 30.3.2008, 17:35
PM   Вверх
S.A.G.
Дата 30.3.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Вот код моего обработчика:
Код

BOOL DlgOnNotify(HWND hwnd, INT, NMHDR * pnmh)
{    
    if ((pnmh->hwndFrom == hWndLV1) && (pnmh->code == NM_CUSTOMDRAW))
    {
        NMLVCUSTOMDRAW * lpNMCustomDraw = lpNMCustomDraw = (NMLVCUSTOMDRAW *)pnmh;
        DWORD dwDrawStage = lpNMCustomDraw->nmcd.dwDrawStage;
        HDC hdc = lpNMCustomDraw->nmcd.hdc;
            switch(dwDrawStage)
            {
                case CDDS_PREPAINT:        return CDRF_NOTIFYITEMDRAW;
                case CDDS_ITEMPREPAINT: SetTextColor(hdc, RGB(255, 0, 0));
                                        return CDRF_NEWFONT;
            }
    }
}

Он компилируется. Где ошибка? Цель - все итемы должны быть красными. Если выходит не то, то что? Разъясните, пожалуйста.

Добавлено @ 17:39
Кстати, по поводу
Цитата

To modify the text colors in the list view or tree view, you need to place the desired color values in the clrText and clrTextBk members of the NMLVCUSTOMDRAW or NMTVCUSTOMDRAW structure.

Просто place??? - я сделал просто place в локальный параметр, но что дальше? - Система помимо return еще проверяет, что я записал в локальный параметр обработчика???

Добавлено @ 17:47
Цитата(korian @  30.3.2008,  17:34 Найти цитируемый пост)
в цитате ясно сказано "except for the list view and tree view".

Ага, ну так я же "place", а оно неработает.

Это сообщение отредактировал(а) S.A.G. - 30.3.2008, 17:55


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
korian
Дата 30.3.2008, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 4
Всего: 17



Цитата(S.A.G. @  30.3.2008,  16:37 Найти цитируемый пост)
Система помимо return еще проверяет что я записал в локальный параметр обработчика??? 

параметр не локальный, вы получаете ссылку на него от куда-то, а точнее из функции-рисовальщика ячейки.
Код

BOOL DlgOnNotify(HWND hwnd, INT, NMHDR * pnmh)
{    
    if ((pnmh->hwndFrom == hWndLV1) && (pnmh->code == NM_CUSTOMDRAW))
    {
        NMLVCUSTOMDRAW * lpNMCustomDraw = lpNMCustomDraw = (NMLVCUSTOMDRAW *)pnmh;
        DWORD dwDrawStage = lpNMCustomDraw->nmcd.dwDrawStage;
//        HDC hdc = lpNMCustomDraw->nmcd.hdc;
            switch(dwDrawStage)
            {
                case CDDS_PREPAINT:        return CDRF_NOTIFYITEMDRAW;
                case CDDS_ITEMPREPAINT: lpNMCustomDraw->clrText = RGB(255, 0, 0);
                                        return CDRF_NEWFONT;
            }
    }
}

вроде так
PM   Вверх
S.A.G.
Дата 30.3.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Ну так вы же не поменяли ничего? Просто закомментировали объявление hdc?

Добавлено через 1 минуту и 40 секунд
Цитата(korian @  30.3.2008,  17:52 Найти цитируемый пост)
параметр не локальный, вы получаете ссылку на него от куда-то, а точнее из функции-рисовальщика ячейки.

Это прояснили, но все по прежнему неработает.


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
korian
Дата 30.3.2008, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 4
Всего: 17



Цитата(S.A.G. @  30.3.2008,  16:54 Найти цитируемый пост)
Ну так вы же не поменяли ничего?

поменял
case CDDS_ITEMPREPAINT: SetTextColor(hdc, RGB(255, 0, 0));
case CDDS_ITEMPREPAINT: lpNMCustomDraw->clrText = RGB(255, 0, 0);


Это сообщение отредактировал(а) korian - 30.3.2008, 18:02
PM   Вверх
S.A.G.
Дата 30.3.2008, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Цитата(korian @  30.3.2008,  17:58 Найти цитируемый пост)
поменял

Я после того как написал предыдущее сообщение (незная о вашей замене) сделал так и не заработало. И раньше делал - не зарабатывало. Чушь какая-то..

Добавлено через 11 минут и 16 секунд
Может еще у кого-нибудь появяться какие-нибудь мысли?


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
korian
Дата 31.3.2008, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 4
Всего: 17



Цитата(S.A.G. @  30.3.2008,  17:14 Найти цитируемый пост)
Я после того как написал предыдущее сообщение (незная о вашей замене) сделал так и не заработало. И раньше делал - не зарабатывало. Чушь какая-то..

код написанный выше - рабочий код, если DlgOnNotify вызывается при WM_NOTIFY парента, а hWndLV1 - HWND ListView
там правда хз, нафига такое написано:
NMLVCUSTOMDRAW * lpNMCustomDraw = lpNMCustomDraw = (NMLVCUSTOMDRAW *)pnmh;
но оно все равно работает.

как конкретно оно у вас не работает? и давайте тогда уж побольше кода...
PM   Вверх
S.A.G.
Дата 31.3.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



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


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
S.A.G.
Дата 31.3.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Оно почему-то не переходит на кейс CDDS_ITEMPREPAINT. Ставлю брейк - запускается сразу окошко -> программа и не доходит до изменения цвета для каждого итем-а. Почитал ОЧЕНЬ вдумчиво документацию в MSDN про Custom Draw. Оно должно, поидее, и все subitem-ы рисовать красным, но у меня попрежнему все черное. Может я неправильно описал стиль диалога (у меня прога на основе диалога). Вот описание:

Код

IDD_DIALOG1 DIALOGEX 0, 0, 649, 295
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Метод Гомори"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    CONTROL         "1",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,2,27,647,126,WS_EX_LEFTSCROLLBAR
    CONTROL         "2",IDC_LIST2,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | WS_BORDER | WS_TABSTOP,86,2,563,25
END


У меня два List-а. Первый тот что hWndLV1


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0631 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.