|
|
|
Можно ли в 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
(так мигания не будет заметно при изменении размеров столбца), и,
конечно же, реализовать прорисовку изображений во всех нужных ячейках, а
не только в одной, как в этом примере.
|
|
|
|
|
|
|