Environment: VC++ 5.0 , Windows NT 4.0
(continued)
This article explains how to drop down a tool window from a combobox.
The dropdown tool window will replace the default dropdown list in an ordinary
combobox. The following procedure describes how to go about it:
Step 1:
When the user clicks the arrow button in the combobox, the
ON_CBN_DROPDOWN handler gets
to have a go at it. ON_CBN_DROPDOWN(IDC_COMBO1, OnDropdownCombo)
Now to disable the default drop down call ShowDropDown() member
function of the
combobox with the flag set to FALSE.
void CCoolComboDlg::OnDropdownCombo()
{
m_CoolCombo.ShowDropDown(FALSE);
DisplayPopdownWindow();
}
Step 2:
Now it's time to display our pop down window. Make sure you create the
window with the
extended styles WS_EX_TOPMOST and WS_EX_TOOL_WINDOW. The
WS_EX_PALETTE_WINDOW style is
optional.
void CCoolComboDlg::DisplayPopdownWindow()
{
CRect rectCombo;
m_CoolCombo.GetWindowRect(&rectCombo);
if(m_pWndPopDown) delete m_pWndPopDown;
LPCTSTR lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW);
m_pWndPopDown = new CPopDownWnd();
m_pWndPopDown->CreateEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW|WS_EX_PALETTEWINDOW
lpszClass,
_T(""),
WS_POPUP | WS_VISIBLE,
rectCombo.left,rectCombo.bottom,
rectCombo.Width(),200,
m_CoolCombo.GetSafeHwnd(),
NULL,
NULL);
}
Step 3:
Now there is one problem that crops up. Grab the title bar and move the
dialog. What
happens ?. Our tool window floats freely independent of the dialog. So we
need to prevent
the user from dragging the dialog. Trapping the non client hit test
notifications is the
way to go about it. When the user clicks the title bar , a HTCAPTION is
returned. To
nullify the drag attempt, simply return HTNOWHERE.
UINT CCoolComboDlg::OnNcHitTest(CPoint point)
{
UINT nHitTest = CDialog::OnNcHitTest(point);
return (nHitTest == HTCAPTION) ? HTNOWHERE : nHitTest;
}
That's it. So you now have your own window popping out from the
combobox instead of the
default list entries.
Last updated: 13 June 1998