I tried detaching the header control in various ways and that didn't work.

VictorN, that is the exact code I'm using, but it doesn't seem to work. It runs, but my custom header control functions aren't being called. Maybe it's with my override?

SortHeaderCtrl.cpp
Code:
#include "stdafx.h"
#include "Scrip Pro.h"
#include "SortHeaderCtrl.h"

BEGIN_MESSAGE_MAP(CSortHeaderCtrl, CMFCHeaderCtrl)
END_MESSAGE_MAP()

IMPLEMENT_DYNAMIC(CSortHeaderCtrl, CMFCHeaderCtrl)

/// <summary>
/// Default constructor.
/// </summary>
CSortHeaderCtrl::CSortHeaderCtrl()
{

}

/// <summary>
/// Default destructor.
/// </summary>
CSortHeaderCtrl::~CSortHeaderCtrl()
{

}

/// <summary>
/// Called by the framework to draw the sorting arrow for the column.
/// </summary>
/// <param name="pDC">Device context to draw to</param>
/// <param name="rectArrow">Size of the arrow</param>
void CSortHeaderCtrl::OnDrawSortArrow( CDC* pDC, CRect rectArrow )
{
	pDC->FillSolidRect(rectArrow, RGB(255,255,255));
}
SortHeaderCtrl.h
Code:
#pragma once

class CSortHeaderCtrl : public CMFCHeaderCtrl
{
	DECLARE_DYNAMIC(CSortHeaderCtrl)

public:
	CSortHeaderCtrl();
	virtual ~CSortHeaderCtrl();

protected:
	DECLARE_MESSAGE_MAP()

	virtual void OnDrawSortArrow(CDC* pDC, CRect rectArrow);
};
If I set a breakpoint in the OnDrawSortArrow function, it never gets hit. The only thing I'm thinking it could be is that I'm using CMFCListctrl not CListCtrl. But I really need to use CMFCListCtrl. Also, the latter is the parent class of the former, so how could that cause so many issues?