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 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



Comments

  • louis vuitton evidence sunglasses for women thjahj

    Posted by Achiegaic on 05/16/2013 06:48am

    http://hermesbags.citationguide.net 27497 965631how to identify fake louis vuitton bags louis vuitton outlet store online cheap hermes belts china hermes bags for sale on ebay

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • When individual departments procure cloud service for their own use, they usually don't consider the hazardous organization-wide implications. Read this paper to learn best practices for setting up an internal, IT-based cloud brokerage function that service the entire organization. Find out how this approach enables you to retain top-down visibility and control of network security and manage the impact of cloud traffic on your WAN.

  • Complex hybrid environments can make it difficult to track interdependencies, increasing the risk of disrupting critical business services. In this white paper by EMA, you'll learn how application discovery and dependency mapping can help you: Meet granular targets for availability, cost, and time-to-revenue for cloud services. Accelerate mean time to repair (MTTR) while communicating better with stakeholders. Manage even the most complex hybrid environments more efficiently and effectively Understand the …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date