焦点不会改变嵌套的CWnd-Derived Class

时间:2015-05-12 05:47:09

标签: c++ mfc focus cwnd

环境:VS2013,MFC,C ++

我有一个带有2个静态按钮(OK,Cancel)的CDialog派生对话框,使用对话框编辑器创建。此外,该对话框应包含动态创建的CWnd-Derived类实例,该实例包含2个编辑框。

问题是我无法通过编辑框之间的tab键移动焦点,并且在打开对话框时我也无法使其中一个框具有初始焦点。当我按下Tab键时,第一个编辑框会聚焦,但从这一点开始,我无法移动焦点并使用Tab键移动(单击鼠标工作)。

我已经使用WS_EX_CONTROLPARENT样式创建了CWnd,但它仍然无法移动焦点。那么问题出在哪里?到目前为止我做了什么:

//the CDialog-class which should be the container for the CWnd
//.h
class CDlgSelCatalogItem : public CDialog {
   CListFilterInput _ctrlList; //CWnd-Derived, contains 2 Edit-Boxes
}

//.cpp
BOOL CDlgSelCatalogItem::OnInitDialog()
{
   CRect rectList(10, 10, 100, 50);
   _ctrlList.Create(rectList, this);
}

//the CWnd-derived class that contains 2 edit-boxes
//.h
class CListFilterInput : public CWnd {
   BOOL Create(const RECT& rect, CWnd* pParentWnd);

   //2 Edit-Boxes   
   CEdit _ctrl1;
   CEdit _ctrl2;
}

BOOL CListFilterInput::Create(const RECT &rect, CWnd *pParentWnd)
{
   BOOL bRetVal;

   bRetVal = CWnd::CreateEx(WS_EX_CONTROLPARENT, NULL, _T(""), WS_CHILDWINDOW | WS_VISIBLE,
      rect, pParentWnd, CTRL_ID_THIS);

   if (bRetVal == TRUE){
    //1st box
    CRect rectTextbox = ...; //calculate rect fox box

    bRetVal = _ctrl1.Create(
        WS_CHILDWINDOW | WS_VISIBLE | WS_TABSTOP | ES_LEFT | ES_AUTOHSCROLL,
        rectTextbox, this, CTRL_ID_TEXTBOX);

    //2nd box above 1st
    rectTextbox.MoveToY(rectTextbox.top - rectTextbox.Height());
    bRetVal = _ctrl1.Create(
        WS_CHILDWINDOW | WS_VISIBLE | WS_TABSTOP | ES_LEFT | ES_AUTOHSCROLL,
        rectTextbox, this, CTRL_ID_TEXTBOX+1);

      //set input-focus initially on 1st textbox - doesnt work
      _ctrl1.SetFocus();
   }

   return bRetVal;
}

1 个答案:

答案 0 :(得分:0)

menu-> format-> tab顺序(ctrl + d) 这个东西提供了对话框的Tab键顺序。一旦您设置了订单,请在对话框外单击。我希望它会有所帮助