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

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


Catching Arrow Keys in OCX--OnGetDlgCode

Michael & Vicki -- mvp@usaor.net
Monday, March 24, 1997

Environment:  VC++ 4.2-flat, NT 4.0

Note: I will be changing to VC 4.2b by the time you read this (thanks for
the DatTimePick  info, B. ekiM)

I have been trying to build an OCX (Active X, or whaterver it is called
this week) and I am unable to catch the arrow keys.  When they are pressed,
focus moves to the next/prev control in the tab order.  I have referenced
MSDN (July 96, latest version on order) and found at least two articles one
being Q104637 about trapping the arrow keys.  I have created my own
OnGetDlgCode and added the WANT_ARROWS (wording may not be exact, I'm
writing from memory at home).  My version of  OnGetDlgCode never gets
called, and the arrow keys are still being treated as a focus (tab) change.
   So what am I missing/doing wrong that prevents me from getting the arrow
keys.  I don't actually want the arrow keys, I just don't want them to
change focus, but only to move the caret.  My control is derived from the
Edit control.  I have used the VC 4.2 control Wizard and the control is
being tested/used in a VB4 "app".

--Mike



Michael Hupp -- mhupp@ti.lmco.com
Thursday, March 27, 1997

[Mini-digest: 2 responses]

Hello Mike,

I wrote a real simple control and added these two message handlers to my message map:

BEGIN_MESSAGE_MAP(CXxxCtrl, COleControl)
	//{{AFX_MSG_MAP(CXxxCtrl)
	ON_WM_KEYDOWN()			//  trap key presses
	ON_WM_GETDLGCODE()		//  tell windows I want arrow
	//}}AFX_MSG_MAP
	ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
END_MESSAGE_MAP()

And added these two routines to my control:

UINT CXxxCtrl::OnGetDlgCode( )
{
	return DLGC_WANTARROWS;
}

void CXxxCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	switch ( nChar )
	{
		case VK_UP:
		case VK_DOWN:
		case VK_LEFT:
		case VK_RIGHT:
			 TRACE( "Got Arrow Key\n" );
			 break;
		default:
			 break;
	}
	COleControl::OnKeyDown(nChar, nRepCnt, nFlags);
}

And, voila, arrow keys went to my control.

Hope this helps,
Michael

-----Original Message-----
From:	Pasterik, Michael & Vicki [SMTP:mvp@usaor.net]
Sent:	Monday, March 24, 1997 8:52 PM
To:	mfc-l@netcom.com
Subject:	Catching Arrow Keys in OCX--OnGetDlgCode

Environment:  VC++ 4.2-flat, NT 4.0

Note: I will be changing to VC 4.2b by the time you read this (thanks for
the DatTimePick  info, B. ekiM)

I have been trying to build an OCX (Active X, or whaterver it is called
this week) and I am unable to catch the arrow keys.  When they are pressed,
focus moves to the next/prev control in the tab order.  I have referenced
MSDN (July 96, latest version on order) and found at least two articles one
being Q104637 about trapping the arrow keys.  I have created my own
OnGetDlgCode and added the WANT_ARROWS (wording may not be exact, I'm
writing from memory at home).  My version of  OnGetDlgCode never gets
called, and the arrow keys are still being treated as a focus (tab) change.
   So what am I missing/doing wrong that prevents me from getting the arrow
keys.  I don't actually want the arrow keys, I just don't want them to
change focus, but only to move the caret.  My control is derived from the
Edit control.  I have used the VC 4.2 control Wizard and the control is
being tested/used in a VB4 "app".

--Mike
-----From: "Neil A. Van Note" 

Hello Michael & Vicki,

	You will want to override PreTranslateMessage for your
control and send those to yourself. It would seem that certain
containers eat these messages, ie: VB...

Something like the following...

switch (pMsg->message)
{
// Trap the arrow keys so we can process them...
case WM_KEYDOWN:
case WM_KEYUP:
	switch (pMsg->wParam)
	{
	case VK_LEFT:
	case VK_RIGHT:
	case VK_UP:
	case VK_DOWN:
		this->SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
		return TRUE;
	}
	break;
}

return COleControl::PreTranslateMessage(pMsg);
}


----------
From: 	Pasterik, Michael & Vicki
Sent: 	Monday, March 24, 1997 11:51 PM
To: 	mfc-l@netcom.com
Subject: 	Catching Arrow Keys in OCX--OnGetDlgCode

Environment:  VC++ 4.2-flat, NT 4.0

Note: I will be changing to VC 4.2b by the time you read this (thanks for
the DatTimePick  info, B. ekiM)

I have been trying to build an OCX (Active X, or whaterver it is called
this week) and I am unable to catch the arrow keys.  When they are pressed,
focus moves to the next/prev control in the tab order.  I have referenced
MSDN (July 96, latest version on order) and found at least two articles one
being Q104637 about trapping the arrow keys.  I have created my own
OnGetDlgCode and added the WANT_ARROWS (wording may not be exact, I'm
writing from memory at home).  My version of  OnGetDlgCode never gets
called, and the arrow keys are still being treated as a focus (tab) change.
   So what am I missing/doing wrong that prevents me from getting the arrow
keys.  I don't actually want the arrow keys, I just don't want them to
change focus, but only to move the caret.  My control is derived from the
Edit control.  I have used the VC 4.2 control Wizard and the control is
being tested/used in a VB4 "app".

--Mike



Mike Blaszczak -- mikeblas@nwlink.com
Sunday, March 30, 1997

At 23:51 3/24/97 -0500, Pasterik, Michael & Vicki wrote:
>Environment:  VC++ 4.2-flat, NT 4.0
>
>Note: I will be changing to VC 4.2b by the time you read this (thanks for
>the DatTimePick  info, B. ekiM)

>I have been trying to build an OCX (Active X, or whaterver it is called
>this week)

The name only changed once, and it changed with a major revision of the
technology.  While it was a little annoying, it's over.

>and I am unable to catch the arrow keys.  
>When they are pressed,
>focus moves to the next/prev control in the tab order. 

I'm embarrassed to recommend it because it is so poorly written.  But it
looks like the article at http://www.microsoft.com/kb/articles/q132/4/50.htm
explains what you need to do.


.B ekiM
http://www.nwlink.com/~mikeblas/
These words are my own. I do not speak on behalf of Microsoft.
       One is too many and a million is not enough.




Become an MFC-L member | Вернуться в корень Архива |