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

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


Trapping TABs and arrow keys in an OLE control

Peter Moss -- pmoss@bbn.com
Tuesday, June 11, 1996

Environment: MSVC 4.1, Win32

I am trying to build an OLE control based on a subclassed EDIT control. I then 
insert this control into a dialog box.  

 I would like to be able to trap TAB key presses and any of the 4 arrow keys.  
I have written a OnKeyDown handler for the WM_KEYDOWN msg.  This successfully 
traps the Delete key and all of the std keys, but TABs and arrows don't come 
thru.  I used SPY and it reports that the keydown is being sent to my window, 
but it never makes it to my handler.

Funny thing is that when I test the handler using the OLE Test Container EXE, 
the msgs do come thru (in this scenario, the control is not embedded in a 
dlg).  Somehow, (even tho SPY reports that the msg is directed to my OLE 
control wnd), the dlg class window proc must  intercept the msgs (???) b4 I 
can handle them, and it must use them to change the focus.  

Is there any way to make the OLE control get these msgs w/o having to write 
code in the dlg proc (which would defeat the purpose of building the OLE 
control)?

Thanks,
Pete Moss
pmoss@bbn.com



Joe Willcoxson -- joew@statsoftinc.com
Wednesday, June 12, 1996

[Mini-digest: 4 responses]

>Environment: MSVC 4.1, Win32
>
>I am trying to build an OLE control based on a subclassed EDIT control. I then 
>insert this control into a dialog box.  
>
> I would like to be able to trap TAB key presses and any of the 4 arrow keys.  
>I have written a OnKeyDown handler for the WM_KEYDOWN msg.  This successfully 
>traps the Delete key and all of the std keys, but TABs and arrows don't come 
>thru.  I used SPY and it reports that the keydown is being sent to my window, 
>but it never makes it to my handler.

Look at WM_GETDLGCODE
Joe Willcoxson (joew@statsoftinc.com)
http://www.statsoftinc.com
http://users.aol.com/chinajoe


-----From: craigtt@ccmail.PE-Nelson.COM

     Check out the WM_GETDLGCODE message for when your control is in a 
     dialog.  There's an article Q83302 giving the details.
     
     Tim Craig
     PE-Nelson

-----From: "Frederic Steppe" 

Peter,

Try trapping the WM_GETDLGCODE message and return DLGC_WANTALLKEYS.
I never tried that with OLD controls, but the symptoms are the same, so maybe 
the medecine is too.

Frederic Steppe (frederics@msn.com)
-----From: Roger Onslow/Newcastle/Computer Systems Australia/AU 

Perhaps this entry from "C and Visual C++ KB" in MSDN can help...
NOTE: key step here is...
UINT CMyEdit::OnGetDlgCode() {
 return DLGC_WANTARROWS|DLGC_WANTALLKEYS|DLGC_WANTCHARS;
}

Don't know if this is relevant for OLE controls??

Roger Onslow
RogerO@compsys.com.au

Here t'is...
How to Trap Arrow Keys in an Edit Control of a Dialog Box
  
PSS ID Number: Q104637
Article last modified on 12-07-1995
 
1.00 1.50 1.51 1.52 | 1.00 2.00 2.10 4.00
 
WINDOWS             | WINDOWS NT
 

 
----------------------------------------------------------------------
The information in this article applies to:
 
 - The Microsoft Foundation Classes (MFC), included with:
 
    - Microsoft Visual C++ for Windows, versions 1.0, 1.5, 1.51. and
      1.52
    - Microsoft Visual C++ 32-bit Edition, versions 1.0, 2.0, 2.1, and
      4.0
----------------------------------------------------------------------
 
SUMMARY
=======
 
This article describes how to trap arrow keys in an edit control of a
dialog box with the Microsoft Foundation Classes (MFC) versions 2.0 and
above. Although the example in this article uses an edit control, a similar
mechanism applies to other controls as well.
 
MORE INFORMATION
================
 
To trap the arrow keys in an edit control of a dialog box, the following
steps may be taken:
 
1. Create a dialog box class derived from CDialog. For example, you
   can create a dialog box class called CMyDlg:public CDialog with
   Class Wizard.
 
2. Create your own edit class and trap WM_GETDLGCODE and WM_KEYDOWN.
   The code will resemble the following:
 
      class CMyEdit : public CEdit
      {
      // Construction
      public:
           CMyEdit();
 
      public:
           virtual ~CMyEdit();
      protected:
           afx_msg UINT OnGetDlgCode();
           afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
           DECLARE_MESSAGE_MAP()
      };
 
      CMyEdit::CMyEdit()
      {
      }
 
      CMyEdit::~CMyEdit()
      {
      }
 
      BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
           ON_WM_GETDLGCODE()
           ON_WM_KEYDOWN()
      END_MESSAGE_MAP()
 
      UINT CMyEdit::OnGetDlgCode()
      {
 
           return DLGC_WANTARROWS|DLGC_WANTALLKEYS|DLGC_WANTCHARS;
      }
 
      void CMyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
     {
           //Check if the key pressed was a DOWN ARROW key
           if (nChar == VK_DOWN)
                AfxMessageBox("It is a down arrow key!");
           if (nChar == VK_RIGHT)
                AfxMessageBox("It is a right arrow key!");
           if (nChar == VK_LEFT)
                AfxMessageBox("It is a left arrow key!");
           if (nChar == VK_UP)
                AfxMessageBox("It is a up arrow key!");
           CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
      }
 
   NOTE: if Class Wizard is used to add a CMyEdit class, you must
   derive the class from CWnd first and then manually change any
   references of CWnd to CEdit in the code. It is important to trap
   WM_GEDLGCODE in your own edit class and specify DLGC_WANTARROWS in
   OnGetDlgCode().
 
3. Create a member variable that maps to your own edit class in the
   dialog box class and override CWnd::DoDataExchange(). Your code
   should resemble the following:
 
      class CMyDlg : public CDialog
      {
      public:
           CMyEdit m_edit;
      protected:
           virtual void DoDataExchange(CDataExchange* pDX); //DDX/DDV
 
           DECLARE_MESSAGE_MAP()
      };
      void CMyDlg::DoDataExchange(CDataExchange* pDX)
      {
           CDialog::DoDataExchange(pDX);
           DDX_Control(pDX, IDC_EDIT1, m_edit);
      }
 
   NOTE: This can be done easily by Class Wizard. For example, you can
   add a member variable m_edit and map it to CEdit and then manually
   change CEdit references in MyEdit.CPP and MyEdit.H files to
   CMyEdit.
 
Additional reference words: kbinf 1.00 1.50 1.51 1.52 2.00 2.10 2.50 2.51
3.00 3.10 4.00
KBCategory: kbprg
KBSubcategory: MfcUI
=============================================================================
Copyright Microsoft Corporation 1995.






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