110,535
社区成员
发帖
与我相关
我的任务
分享
private Rectangle HeaderEndRect()
{
RECT rect = new RECT();
IntPtr headerWnd = HeaderWnd;
SendMessage(
headerWnd, HDM_GETITEMRECT, ColumnAtIndex(ColumnCount - 1), ref rect);
int left = rect.Right;
GetWindowRect(headerWnd, ref rect);
OffsetRect(ref rect, -rect.Left, -rect.Top);
rect.Left = left;
return Rectangle.FromLTRB(rect.Left, rect.Top, rect.Right, rect.Bottom);
}
现在再来看看HeaderNativeWindow类的完整代码:private class HeaderNativeWindow : NativeWindow,IDisposable
{
private ListViewEx _owner;
public HeaderNativeWindow(ListViewEx owner)
: base()
{
_owner = owner;
base.AssignHandle(owner.HeaderWnd);
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 0xF || m.Msg == 0x47)
{
IntPtr hdc = GetDC(m.HWnd);
try
{
using (Graphics g = Graphics.FromHdc(hdc))
{
Rectangle bounds = _owner.HeaderEndRect();
Color baseColor = _owner.HeadColor;
Color borderColor = _owner.HeadColor;
Color innerBorderColor = Color.FromArgb(200, 255, 255, 255);
_owner.RenderBackgroundInternal(
g,
bounds,
baseColor,
borderColor,
innerBorderColor,
0.45f,
true,
LinearGradientMode.Vertical);
}
}
finally
{
ReleaseDC(m.HWnd, hdc);
}
}
}
#region IDisposable 成员
public void Dispose()
{
ReleaseHandle();
_owner = null;
}
#endregion
}
再来看看对ListView创建和销毁句柄的两个方法OnHandleCreated和OnHandleDestroyed的重写。
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
if (_headerNativeWindow == null)
{
if (HeaderWnd != IntPtr.Zero)
{
_headerNativeWindow = new HeaderNativeWindow(this);
}
}
}
protected override void OnHandleDestroyed(EventArgs e)
{
base.OnHandleDestroyed(e);
if (_headerNativeWindow != null)
{
_headerNativeWindow.Dispose();
_headerNativeWindow = null;
}
}
最后来看看效果: