How to Change Default Control Focus on CPropertyPage

ID: Q148388


The information in this article applies to:


SUMMARY

When a CPropertyPage is activated, the first control in the page's tab order will get the focus by default. To change the default to a different control, derive a class from CPropertyPage, override OnSetActive(), and post a user message to a member function that will actually set the focus to the desired control.


MORE INFORMATION

CPropertySheet's member function OnSetActive() is called when a PSN_SETACTIVE message is sent to that page. Attempting to set the focus to a control while in this handler won't produce the expected results because after this notification is handled, the tab control will get the focus.

Therefore, you need to post a message to the property sheet's message queue with a user message in order to set the focus to the desired control once the page is active.

Sample Code


// this is the user-defined message
#define WM_SETPAGEFOCUS WM_APP+2
BEGIN_MESSAGE_MAP(CMyPage, CPropertyPage)
  ON_MESSAGE(WM_SETPAGEFOCUS, OnSetPageFocus)
END_MESSAGE_MAP()

BOOL CMyPage::OnSetActive()
{
  BOOL fRet = CPropertyPage::OnSetActive();

  PostMessage(WM_SETPAGEFOCUS, 0, 0L);

  return fRet;
}

LONG CMyPage::OnSetPageFocus(UINT wParam, LONG lParam)
{
  // IDC_BUTTON2 is the button on this property page
  // that you want to give the default focus.

  CButton* pBtn = (CButton*)GetDlgItem(IDC_BUTTON2);
  ASSERT(pBtn);
  pBtn->SetFocus();
  return 0;
} 

Additional query words: kbinf 4.00 CPropertySheet


Keywords          : kbcode kbMFC KbUIDesign kbVC 
Version           : 4.00
Platform          : NT WINDOWS 
Issue type        : 

Last Reviewed: August 8, 1999