BUG: CB_SETTOPINDEX and CB_GETTOPINDEX Always Return Zero on Macintosh

ID: Q201116


The information in this article applies to:


SYMPTOMS

On the Macintosh, the combo box messages CB_GETTOPINDEX and CB_SETTOPINDEX fail and always return zero (0).


CAUSE

There are no message handlers for these messages in the combo-box window procedure in the Windows Portability Library.


RESOLUTION

Obtain a pointer to the list box portion of the combo box, and use LB_GETTOPINDEX and LB_SETTOPINDEX instead.


STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.


MORE INFORMATION

The combo-box control is composed of an edit control and a list-box control. For additional information about combo boxes, please see the following article in the Microsoft Knowledge Base:

Q65881 INFO: The Parts of a Windows Combo Box and How They Relate
On the Intel side, the edit control is the first child of the combo box. For a simple combo box, the Macintosh has the list-box control as the first control.

The window handle to the list box can be obtained using GetWindow. Once a valid handle is obtained, using the LB_GETTOPINDEX and LB_SETTOPINDEX messages provides the same functionality as CB_GETTOPINDEX and CB_SETTOPINDEX.

The sample code below shows the MFC implementation:

Sample Code



class CCtrlsView : public CFormView
{
public:
   CComboBox   m_comboindex;
   int      m_currentIndex;
#ifdef _MAC
   CListBox m_comboList;
#endif
...
};

void CCtrlsView::OnInitialUpdate()
{
   CFormView::OnInitialUpdate();

#ifdef _MAC
   // Obtain pointer to combo's list box.
   HWND hComboList = m_comboindex.GetWindow(GW_CHILD)->m_hWnd;
   ASSERT(hComboList);

   // Verify class name.
   char className[50];
   GetClassName(hComboList, className, 50);
   ASSERT(lstrcmp(className, "ComboLBox") == 0);

   // Subclass to use CListBox.
   m_comboList.SubclassWindow(hComboList);
#endif
...
}

// A simple combo box with "set" and "get" buttons using
// the values from an edit control.
void CCtrlsView::OnSetindex()
{
   UpdateData(TRUE);
#ifndef _MAC
   m_comboindex.SetTopIndex(m_currentIndex);
#else
   m_comboList.SetTopIndex(m_currentIndex);
#endif
}

void CCtrlsView::OnGetindex()
{
#ifndef _MAC
   m_currentIndex = m_comboindex.GetTopIndex();
#else
   m_currentIndex = m_comboList.GetTopIndex();
#endif
   UpdateData(FALSE);
} 


REFERENCES

(c) Microsoft Corporation 1999, All Rights Reserved. Contributions by Adam Kim, Microsoft Corporation.

Additional query words: Macintosh CB_GETTOPINDEX CB_SETTOPINDEX combobox listbox


Keywords          : kbcode kbMAC kbMFC kbVC kbVC400bug kbDSupport MacPrgIss 
Version           : MACINTOSH:4.0,4.0b
Platform          : MACINTOSH 
Issue type        : kbbug 

Last Reviewed: June 23, 1999