Drop down a popdown window instead of a dropdown list from a combobox | CodeGuru

Drop down a popdown window instead of a dropdown list from a combobox

Environment: VC++ 5.0 , Windows NT 4.0   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 […]

Written By
CodeGuru Staff
CodeGuru Staff
Aug 6, 1998
1 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

Environment: VC++ 5.0 , Windows NT 4.0

 

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()
{

// prevent drop down of the combo
m_CoolCombo.ShowDropDown(FALSE);

// Display our own popdown window instead
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()
{
	//Get the combo’s alignment
	CRect rectCombo;
	m_CoolCombo.GetWindowRect(&rectCombo);

//if window is already present delete it
if(m_pWndPopDown) delete m_pWndPopDown;

///Register class and create window
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)
{
	// TODO: Add your message handler code here and/or call default

UINT nHitTest = CDialog::OnNcHitTest(point);
//HTCAPTION implies user clicked on the title bar , so return HTNOWHERE
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

CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.