Как получить высоту заголовка Listview - c # - PullRequest
12 голосов
/ 12 февраля 2009

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

Спасибо

Ответы [ 5 ]

13 голосов
/ 12 февраля 2009

Это может быть немного хакерски, но вы можете сделать:

listView.Items[0].Bounds.Top

Это будет работать, только если в списке есть только один элемент. Поэтому вы можете временно добавить его при первом создании списка и сохранить значение высоты.

Иначе, вы всегда можете использовать:

listView.TopItem.Bounds.Top

Чтобы сделать тест в любой момент, но вам все еще нужен хотя бы один элемент в списке.

11 голосов
/ 12 февраля 2009

Вот как получить высоту заголовка списка с помощью вызовов Win32 Interop.

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

const long LVM_FIRST = 0x1000;
const long LVM_GETHEADER = (LVM_FIRST + 31);

[DllImport("user32.dll", EntryPoint="SendMessage")]
private static extern IntPtr SendMessage(IntPtr hwnd, long wMsg, long wParam, long lParam);

[DllImport("user32.dll")]
private static extern bool GetWindowRect(HandleRef hwnd, out RECT lpRect);

RECT rc = new RECT();
IntPtr hwnd = SendMessage(ListView1.Handle, LVM_GETHEADER, 0, 0);
if (hwnd != null) 
{
    if (GetWindowRect(new HandleRef(null, hwnd), out rc)) 
    {
        int headerHeight = rc.Bottom - rc.Top;
    }
}
2 голосов
/ 10 января 2014

@ Федр

.. давным-давно .. но: PInvokeStackImbalance называется

Подпись SendMessage (long! = Uint32):

LRESULT WINAPI SendMessage(
    _In_  HWND hWnd,
    _In_  UINT Msg,
    _In_  WPARAM wParam,
    _In_  LPARAM lParam
)

Изменить все на:

const UInt32 LVM_FIRST = 0x1000;
const UInt32 LVM_GETHEADER = (LVM_FIRST + 31);

[Serializable, System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool GetWindowRect(System.Runtime.InteropServices.HandleRef hwnd, out RECT lpRect);

int youtFuncToGetHeaderHeight()
{
    RECT rc = new RECT();
    IntPtr hwnd = SendMessage((IntPtr)this.Handle, LVM_GETHEADER, IntPtr.Zero, IntPtr.Zero);
    if (hwnd != null)
    {
        if (GetWindowRect(new System.Runtime.InteropServices.HandleRef(null, hwnd), out rc))
        {
            int headerHeight = rc.Bottom - rc.Top;
        }
    }
    return -1;
}
0 голосов
/ 12 мая 2016

Правильный код:

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

    const int LVM_FIRST = 0x1000;
    const int LVM_GETHEADER = (LVM_FIRST + 31);

    [DllImport("user32.dll", EntryPoint="SendMessage")]
    private static extern IntPtr SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll")]
    private static extern bool GetWindowRect(HandleRef hwnd, out RECT lpRect);

    RECT rc = new RECT();
    IntPtr hwnd = SendMessage(ListView1.Handle, LVM_GETHEADER, 0, 0);
    if (hwnd != null) 
    {
        if (GetWindowRect(new HandleRef(null, hwnd), out rc)) 
        {
            int headerHeight = rc.Bottom - rc.Top;
        }
    }
0 голосов
/ 22 августа 2013

Проверено это работает в моем приложении Win32 ++:

CHeader* hdr = GetHeader();
CRect rcHdr = hdr->GetWindowRect();

Высота заголовка rcHdr.Height ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...