|
Die nachfolgend aufgezeigte Vorgehensweise ist eine von mehreren möglichen. Zunächst wird im Körper der Klassendeklaration ein Prototyp und eine Variable für eine Callback-Funktion deklariert, deren Aufgabe darin besteht zu prüfen, ob die entsprechende Spalte des Header angeklickt werden darf oder nicht.
public:
typedef BOOL (*ColumnCheckF)(void *,int,LPARAM);
void SetCallback(ColumnCheckF checkf=NULL,
void * cbdata=NULL)
{
m_fColumnCheck=checkf;
m_pCBData=cbdata;
}
private:
ColumnCheckF m_fColumnCheck;
void *m_pCBData;
Nach einem Klick auf den Header der ListView Control wird die betroffene Spalte ermittelt und über die Callback-Funktion abgefragt, ob der Klick erlaubt ist oder nicht. Im Header der Klassendeklaration ist hinzuzufügen:
afx_msg void OnLButtonDown(UINT,CPoint);
DECLARE_MESSAGE_MAP()
Analog dazu wird in der CPP-Datei hinzugefügt:
BEGIN_MESSAGE_MAP(CCustHeaderCtrl, CHeaderCtrl)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
Die eigentliche Implementation erfolgt in der Behandlungsmethode des Ereignisses OnLButtonDown. Hier ist insbesondere auch sicherzustellen, daß neben dem Klick nicht auch das Ändern der Spaltenbreite unterdrückt wird.
void CCustHeaderCtrl::OnLButtonDown(UINT flags, CPoint pt)
{
if (m_fColumnCheck!=NULL)
{
HD_ITEM hditem;
CClientDC dc(this);
int offset=dc.GetTextExtent(_T(" "),1).cx*2;
int x_coord=pt.x;
int column=0;
hditem.mask=HDI_WIDTH;
while (x_coord>((column==0)?0:offset))
{
GetItem(column,&hditem);
Liegt die X-Koordinate des Klickpunkts in der Spalte, wird die Callback-Funktion aufgerufen, um festzustellen, ob der Klick erlaubt ist oder nicht. Ist der Klick nicht erlaubt, erfolgt über return ein Rücksprung aus dem Handler, so daß insbesondere das OnLButtonDown-Ereignis der Header Control nicht mehr aufgerufen wird.
if (x_coord
Wurde der Klick erlaubt oder keine betroffene Spalte gefunden, erfolgt abschließend der Aufruf des OnLButtonDow-Handlers der Header Control.
CHeaderCtrl::OnLButtonDown(flags,pt);
}
Als Nebeneffekt bringt dieser Code mit sich, daß die für das Klicken deaktivierten Spalten nicht mehr verschoben werden können, da die Header Control das OnLButtonDown-Ereignis nicht mehr erhält.
|