internal virtual bool HandleHeaderCustomDraw(ref Message m)
{
const int CDRF_NEWFONT = 2;
const int CDRF_SKIPDEFAULT = 4;
const int CDRF_NOTIFYPOSTPAINT = 0x10;
const int CDRF_NOTIFYITEMDRAW = 0x20;
const int CDDS_PREPAINT = 1;
const int CDDS_POSTPAINT = 2;
const int CDDS_ITEM = 0x00010000;
const int CDDS_ITEMPREPAINT = (CDDS_ITEM | CDDS_PREPAINT);
const int CDDS_ITEMPOSTPAINT = (CDDS_ITEM | CDDS_POSTPAINT);
NativeMethods.NMCUSTOMDRAW nmcustomdraw = (NativeMethods.NMCUSTOMDRAW)m.GetLParam(typeof(NativeMethods.NMCUSTOMDRAW));
//System.Diagnostics.Debug.WriteLine(String.Format("header cd: {0:x}, {1}, {2:x}", nmcustomdraw.dwDrawStage, nmcustomdraw.dwItemSpec, nmcustomdraw.uItemState));
switch (nmcustomdraw.dwDrawStage) {
case CDDS_PREPAINT:
this.cachedNeedsCustomDraw = this.NeedsCustomDraw();
m.Result = (IntPtr)CDRF_NOTIFYITEMDRAW;
return true;
case CDDS_ITEMPREPAINT:
int columnIndex = nmcustomdraw.dwItemSpec.ToInt32();
OLVColumn column = this.ListView.GetColumn(columnIndex);
// These don't work when visual styles are enabled
//NativeMethods.SetBkColor(nmcustomdraw.hdc, ColorTranslator.ToWin32(Color.Red));
//NativeMethods.SetTextColor(nmcustomdraw.hdc, ColorTranslator.ToWin32(Color.Blue));
//m.Result = IntPtr.Zero;
if (this.cachedNeedsCustomDraw) {
using (Graphics g = Graphics.FromHdc(nmcustomdraw.hdc)) {
g.TextRenderingHint = ObjectListView.TextRenderingHint;
this.CustomDrawHeaderCell(g, columnIndex, nmcustomdraw.uItemState);
}
m.Result = (IntPtr)CDRF_SKIPDEFAULT;
} else {
const int CDIS_SELECTED = 1;
bool isPressed = ((nmcustomdraw.uItemState & CDIS_SELECTED) == CDIS_SELECTED);
Font f = this.CalculateFont(column, columnIndex == this.ColumnIndexUnderCursor, isPressed);
this.fontHandle = f.ToHfont();
NativeMethods.SelectObject(nmcustomdraw.hdc, this.fontHandle);
m.Result = (IntPtr)(CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINT);
}
return true;
case CDDS_ITEMPOSTPAINT:
if (this.fontHandle != IntPtr.Zero) {
NativeMethods.DeleteObject(this.fontHandle);
this.fontHandle = IntPtr.Zero;
}
break;
}
return false;
}