Как нарисовать многостолбцовый ListView в WM_DRAWITEM - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть ListView с тремя столбцами (я не включил код вставки столбцов и элементов ниже, так как эти части работают):

hwndListbox = CreateWindow(
                WC_LISTVIEW, 
                "", 
                WS_VISIBLE | WS_BORDER | WS_CHILD | LVS_REPORT|LVS_OWNERDRAWFIXED, 
                100, 100,600, 300, 
                hwnd, 
                (HMENU)1, 
                NULL, 
                NULL);

Теперь я пытаюсь использовать WM_DRAWITEM для изменения цвета фона на основе текста в 1-м столбце:

    case  WM_DRAWITEM:
    {
        LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)(lParam);
        HDC hDC = pDIS->hDC;
        RECT rc = pDIS->rcItem;
        // initialize brushes
        HBRUSH bgRed = CreateSolidBrush (RGB(255,0,0));
        HBRUSH bg = (HBRUSH)(GetStockObject(WHITE_BRUSH));
        // declare strings for the sub-items' text
        TCHAR  text_col1[256];
        TCHAR  text_col2[256];
        TCHAR  text_col3[256];
        // get the text from sub-items
        ListView_GetItemText( pDIS -> hwndItem , pDIS -> itemID , 0 ,text_col1, 256);
        ListView_GetItemText( pDIS -> hwndItem , pDIS -> itemID , 1 ,text_col2, 256);
        ListView_GetItemText( pDIS -> hwndItem , pDIS -> itemID , 2 ,text_col3, 256);
        // fill the row
        if(strcmp(text_col1,"Random_Name") == 0)
        {
            FillRect(hDC,&rc,bgRed);
        }
        else
        {
            FillRect(hDC,&rc,bg);
        }
        // How to draw text of 2nd and 3rd columns within columns' boundaries?
        DrawText(hDC, text_col1, strlen(text_col1), &rc, DT_SINGLELINE|DT_LEFT);
    }
    return 0;

Как нарисовать текст 2-го и 3-го столбцов? Я могу вызвать DrawText() с другими строками, но, поскольку все они нарисованы в одном и том же прямоугольнике, они не соответствуют границам столбцов, а вместо этого свободно перемещаются по прямоугольнику в зависимости от флагов формата, которые я указал в последнем аргумент. Как мне преодолеть эту проблему?

Если есть способ получить тот же эффект без использования WM_DRAWITEM, или, альтернативно, определить каждый столбец как отдельный прямоугольник или любое другое решение, я бы хотел услышать.

1 Ответ

1 голос
/ 04 апреля 2020

Вы можете использовать макрос ListView_GetSubItemRect для получения прямоугольника подэлемента.

void ListView_GetSubItemRect(
   hwnd,
   iItem,
   iSubItem,
   code,
   prc
);
...