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

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


Q: Use keyboard to toggle CTreeCtrl items

wang shao yu -- wsy@pub.zjpta.net.cn
Monday, December 23, 1996

Hi all friends, Merry Christmas!

I am using a CTreeView object in my application. I'd like my CTreeView's
parent items can be toggled (expanded or collapsed) by pressing [Enter].
The problem is whenever I press [enter] the items do toggled but with
a beep! I want to get rid of the annoying beep but without success.

I have tried:
	+ Override the OnKeyDown() virtual method in my CTreeView object
	like this:

void CMyTreeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	CTreeCtrl& treeCtrl = GetTreeCtrl();
	HTREEITEM hItem;

	if (nChar == VK_RETURN)
	{//if item has child
		hItem = treeCtrl.GetSelectedItem();
		if (hItem && treeCtrl.ItemHasChildren(hItem))
			treeCtrl.Expand(hItem, TVE_TOGGLE);
	}
	else
		CTreeView::OnKeyDown(nChar, nRepCnt, nFlags);
}//OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

	+ Override the OnKeyUp() virtual method in my CTreeView object
	like this:

void CMyTreeView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	CTreeCtrl& treeCtrl = GetTreeCtrl();
	HTREEITEM hItem;

	if (nChar == VK_RETURN)
	{//if item has child
		hItem = treeCtrl.GetSelectedItem();
		if (hItem && treeCtrl.ItemHasChildren(hItem))
			treeCtrl.Expand(hItem, TVE_TOGGLE);
	}
	else
		CTreeView::OnKeyUp(nChar, nRepCnt, nFlags);
}//OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)

	+ Override both OnKeyDown and OnKeyUp in my CTreeView object.
	In the OnKeyDown method, when nChar is VK_RETURN do nothing.
	The OnKeyUp method is the same as the above.

But in all circumstance, it still beeps. What should I do to eliminate
the beeps?

Thanks in advance.

-- 
Truly yours, Yong Xu, wsy@pub.zjpta.net.cn, Hangzhou, P.R.C





Mike Blaszczak -- mikeblas@nwlink.com
Sunday, December 29, 1996

At 15:20 12/23/96 +0800, Yong Xu wrote:
>Hi all friends, Merry Christmas!

Happy Kwanzaa.

>I am using a CTreeView object in my application. I'd like my CTreeView's
>parent items can be toggled (expanded or collapsed) by pressing [Enter].
>The problem is whenever I press [enter] the items do toggled but with
>a beep! I want to get rid of the annoying beep but without success.

You don't mention what environment you're using; you must've given Dave
a kickback. I'll assume that you're using MFC 4.2b under Windows 95,
just like you assumed everyone celebrated Christmas.

You _do_ say that you try handling OnKeyDown() and OnKeyUp(). You shouldn't
handle those messages. Since MFC's message map calls TranslateMessage(), your
application will get WM_CHAR messages as the user types. If you wanted to put
this code into your app in reaction to WM_KEYDOWN or WM_KEYUP, you should do
it in a PreTranslateMessage() override so that you can prevent MFC from
calling TranslateMessage().  It's the call to TranslateMessage() against a
WM_KEYDOWN posted to the message queue that ends up causing a WM_CHAR to be
sent.

When the control gets your WM_CHAR with nChar == VK_RETURN, it beeps.
Books like Petzold and Richter explain all this in some detail.

It would be easiest to just correctly handle the WM_CHAR message,
I think.  You could get started with something like this:

void CFix2View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
   CTreeCtrl& treeCtrl = GetTreeCtrl();
   HTREEITEM hItem;

   if (nChar == VK_RETURN)
   {  // only toggle if we have an odd number of repeats
      if (nRepCnt & 1)
      {
         hItem = treeCtrl.GetSelectedItem();
         if (hItem && treeCtrl.ItemHasChildren(hItem))
            treeCtrl.Expand(hItem, TVE_TOGGLE);
      }
   }
   else
      CTreeView::OnChar(nChar, nRepCnt, nFlags);
}

I can't remember if testing nRepCnt is necessary.  nRepCnt is only
rarely not equal to one in Win32, and I can't remember the exception.
Maybe there's something on the MSDN Library CD about it, or in
the KB.

>Thanks in advance.

Please buy me some asprin.  Thanks in advance.

.B ekiM
http://www.nwlink.com/~mikeblas/
I'm afraid I've become some sort of speed freak.
These words are my own. I do not speak on behalf of Microsoft.




Dong Chen -- d_chen@ix.netcom.com
Thursday, January 02, 1997

Try this:

function declared as:
void OnKeyDown(NMHDR *pNotifyStruct,LRESULT *result);


put this line in your message map:
ON_NOTIFY_REFLECT(TVN_KEYDOWN,OnKeyDown)

this is the handler:
void CMyTreeView::OnKeyDown(NMHDR *pNotifyStruct,LRESULT *result)
{
        TV_KEYDOWN* pKeyDown = (TV_KEYDOWN *) pNotifyStruct;
        if (pKeyDown->wVKey == VK_RETURN)
        {
	m_ItemSel.Expand();
        }
        *result = 0;
}

--
Dong
d_chen@ix.netcom.com





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