Visual Basic, .NET, ASP, VBScript
 
   
   
     
   
 


Можно ли в ListViewSubItem отобразить картинку?



Предлагаю сделать наследника от ListView и рисовать в перекрытом методе WndProc() при получении сообщения WM_PAINT. Для простоты примера здесь жестко прописана прорисовка ячейки, находящейся в 1-ом столбце 0-го item'a.

class MyListView: ListView
{
    const string imageFile = fileName;
    Image image = Image.FromFile(imageFile);
    const int WM_PAINT = 0x000F;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_PAINT)
        {
            //Позволяем ListView прорисовать себя полностью
            base.WndProc(ref m);
            //Получаем координаты прямоугольника нужной нам ячейки
            RECT rect = new RECT(1, LVIR_BOUNDS);
            IntPtr pointer = Marshal.AllocHGlobal(Marshal.SizeOf(rect));

            Marshal.StructureToPtr(rect, pointer, true);
            SendMessage(m.HWnd, LVM_GETSUBITEMRECT, IntPtr.Zero,
pointer);
            rect = (RECT)Marshal.PtrToStructure(pointer, typeof(RECT));
            //И прорисовываем нашу картинку
            IntPtr hDC = GetDC(m.HWnd);
            Graphics g = Graphics.FromHdc(hDC);
            g.DrawImage(image, rect.Left, rect.Top, rect.Width,
rect.Height);
            g.Dispose();
            ReleaseDC(m.HWnd, hDC);
            return;
        }
        base.WndProc(ref m);
    }

    [StructLayout(LayoutKind.Sequential)]
    struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;

        public int Width
        {
            get
            {
                return Right - Left;
            }
        }

        public int Height
        {
            get
            {
                return Bottom - Top;
            }
        }

        public RECT(int top, int left)
        {
            Top = top;
            Left = left;
            Bottom = 0;
            Right = 0;
        }
    }

    //Необходимые Win32 функции и константы

    [DllImport("User32.dll")]
    static extern IntPtr GetDC(IntPtr hWnd);

    [DllImport("User32.dll")]
    static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

    [DllImport("User32.dll")]
    static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr
wParam, IntPtr lParam);

    const int LVM_FIRST = 0x1000;
    const int LVM_GETSUBITEMRECT = LVM_FIRST + 56;
    const int LVIR_BOUNDS = 0;
}


Думаю, этот пример можно использовать как отправную точку - здесь еще нужно усовершенствовать обработчик WM_PAINT, чтобы исключить регион(ы), занимаемый прорисовываемыми ячейками из 'update' региона всего ListView (так мигания не будет заметно при изменении размеров столбца), и, конечно же, реализовать прорисовку изображений во всех нужных ячейках, а не только в одной, как в этом примере.
 
     

   
   
     
  VBNet рекомендует  
   
     
   
   
     
   
   
     

© Copyright 2002-2011 VBNet.RU | Пишите нам