15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Working with CListCtrl headers

Jeff Galbraith -- jeffg%picatl@mhs.iqsc.com
Wednesday, June 19, 1996

Environment: MFC 4.0/Win95

I would like to be able to catch a message which tells me the user has
resized, or is resizing, the header controls in a CListCtrl. I've tried
many ways to do this, but it's failed each time. I've asked in several
places without getting a response, so this is my last chance for hope.
Does anyone know specifically how to do this?



Roger Onslow -- Roger_Onslow@compsys.com.au
Saturday, June 22, 1996

[Mini-digest: 2 responses]

>I would like to be able to catch a message which tells me the user has
>resized, or is resizing, the header controls in a CListCtrl. I've tried
>many ways to do this, but it's failed each time. I've asked in several
>places without getting a response, so this is my last chance for hope.
>Does anyone know specifically how to do this?

Not exactly -- but here are some cluse for you

(1) The header control of the listbox receives a HDN_BEGINTRACK and 
HDN_ENDTRACK message while resizing. Here's docco from Win32:

================================================================================
The HDN_BEGINTRACK notification message notifies a header control's parent 
window that the user has begun dragging a divider in the control (that is, the 
user has pressed the left mouse button while the mouse cursor is on a divider 
in the header control). This notification message is sent in the form of a 
WM_NOTIFY message. 
  
HDN_BEGINTRACK 
phdn = (HD_NOTIFY FAR *) lParam; 
 
Parameters
phdn
Pointer to an HD_NOTIFY structure that contains information about the header 
control and the item whose divider is to be dragged. 
Return Values
Returns FALSE to allow tracking of the divider or TRUE to prevent tracking.
  
The HDN_ENDTRACK notification message notifies a header control's parent window 
that the user has finished dragging a divider. This notification message sent 
in the form of a WM_NOTIFY message. 
  
HDN_ENDTRACK 
phdn = (HD_NOTIFY FAR *) lParam; 
 
Parameters
phdn
Pointer to an HD_NOTIFY structure that contains information about the header 
control and the item whose divider was dragged. 
Return Values
================================================================================

(2) You can get a pointer to the header control from the CListCtrl
Not sure if there is a direct call, but you should be able to enumerate the 
child windows of hte CListCtrl and test is the GetClassName of the child is 
"SysHeader32".
(see KB Q125694 for code that finds header control, but not quite what is 
required)

(3) Now, just need to subclass this header control window to recive the message 
and you should be there.

Haven't time to tell you how to do it - (and don't know *exactly*) - so asall 
the best text books do in these cases "this is left as an exercise for the 
reader" :-)

Roger Onslow
Computer Systems Australia.


-----From: "Cunningham Graham, IK 23" 

Hi you need to catch the OnNotify message in the CListCtrl

HTH

BOOL CExtListCtrl::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT*
pResult) 
{
	UINT code = ((NMHDR*)lParam)->code;
	int nColumn;
	CRect rect;

	switch (code)
	{
		case HDN_TRACK:
		case HDN_TRACKW: //NT Header ctrl uses UNICODE 
			//YOUR CODE HERE
			break;
		default:
			break;
	}
	
	return CListCtrl::OnNotify(wParam, lParam, pResult);
}



Andrew Cordwell -- andrewc@miles33.co.uk
Tuesday, June 25, 1996

Environment MSVC 4.1, NT 3.51

> I would like to be able to catch a message which tells me the user has
> resized, or is resizing, the header controls in a CListCtrl. I've tried
> many ways to do this, but it's failed each time. I've asked in several
> places without getting a response, so this is my last chance for hope.
> Does anyone know specifically how to do this?

Try this:

BOOL CListCtrl::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT*
pResult) 
{	
//Apologies for formatting....
HD_NOTIFY FAR * phdn = (HD_NOTIFY FAR *) lParam; 
 NMHDR   hdr=phdn->hdr;
 HD_ITEM FAR* pitem=phdn->pitem; 

 //hrd.code will contain a HDN_xx message from the header control within our CListCtrl
 //Be careful with UNICODE as different message numbers are sent!  
//uniquely specifiy both UNICODE and/or Non-UNICODE messages as necessary
//(see commctrl.h for header messages)
 switch(hdr.code) 
{	case HDN_BEGINTRACKA:
  case HDN_BEGINTRACKW:
   if (pitem->mask & HDI_WIDTH)
   {	//Do something!
   }

   break;

  case HDN_ENDTRACKW:			
  case HDN_ENDTRACKA:			
   if (pitem->mask & HDI_WIDTH)
   {	//Adjust the list view column width!
   }

   break;


 }

 return CListCtrl::OnNotify(wParam, lParam, pResult);
}


Descend a new class from CListCtrl and pick up the start and end 
track messages which are reflected from the header control within the 
list control.  (They are refelected by the header control to the 
parent - in our case the new CListCtrl derived class.  See Visual C++ 
4 + docs under CListCtrl then pick any of the message reflection 
sections).

Then take what ever action is necessary!
This should work! (code was taken from smothing slightly different - 
which leads me onto a related problem.....

Does anyone know how to scroll a CHeaderCtrl?  EG when I scroll 
another control, I want my header control to scroll to a  
position relative to the position in the other control.  I'm 
relatively new to MFC so maybe there is a better way of doing it?

I have a *real* nasty bodge to this - I stuck the header control as a 
child of a list box, set extents on the listbox then scrolled that!  
This is not an aceptable solution, due to the speed and redraw 
flicking!

Thanks.
------------------------
Andy Cordwell
------------------------




| Вернуться в корень Архива |