OnMeasureItem для ListView
От: Return Россия  
Дата: 16.07.05 14:29
Оценка:
У листбокса есть св-во OwnerDraw и соот-во можно менять размер элемента через OnMeasureItem и рисовать его самому...
Как можно сделать тоже самое но с ListView?
Надо просто сделать много-строчные элементы.

Нашел нужный пример на Си++, но увы не до конца пойму как его перенести.
http://www.codeproject.com/wtl/ListView_OwnerDraw.asp

Я попытался сделать аналогичное на C#, но есть вопросы.
Почему-то WndProc для System.Windows.Forms.ListView не получает сообщения WM_INITDIALOG. А на этом основана вся суть того контрола на Си++. Надо переместить контрол до вызова WM_INITDIALOG, чтобы принудительно вызвать сообщение WM_MEASUREITEM. И т.о. можно будет сделать любой размер элемента.

Ниже приведена как раз эта ф-ция, для генерации WM_MEASUREITEM:


    // If this control was .SubclassWindowed instead of .Create(Xe)d, then it 
    // will not receive a WM_MEASUREITEM since this message occurs before 
    // WM_INITDIALOG. By moving the window we can get windows to generate
    // another one for us.
    // ---------------------------------------------------------------------
    void ForceMeasureItemMessage()
    {
        // I just want to nudge it up a little.
        CRect window_rect;
        GetWindowRect(&window_rect);
        CPoint pt = window_rect.TopLeft();
        ::ScreenToClient(GetParent(), &pt);
        window_rect.right = pt.x + window_rect.Width();
        window_rect.left = pt.x;
        window_rect.bottom = pt.y + window_rect.Height();
        window_rect.top = pt.y + 1;
        MoveWindow(window_rect);

        // Alright now move it back.
        window_rect.top = pt.y;
        MoveWindow(window_rect);
    }


Щас эта ф-ция вызывается в OnInitDialog() т.о. до сообщения WM_INITDIALOG.
Вопрос в том как это реализовать на C#?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.