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

  • On-demand Event Event Date: May 18, 2015 While the idea of using facial and/or gesture recognition to create a modern, intuitive game seems attractive, some developers may want to leverage Unity 3D as a way to accelerate their development efforts. There are many different ways in which Intel and Unity Technologies have been working together to help speed the development of games with the Intel&reag; RealSense™ SDK (software developer kit). Check out this webcast to join a panel of experts as they …

  • On-Demand eSeminar DevOps and Cloud are all the rage in IT, but the two terms relating process and computing aren't mutually exclusive. Join us to see how your movement into cloud changes the way you develop, deploy, test and manage, and how DevOps can actually be a good thing when coupled with cloud.

Most Popular Programming Stories

More for Developers

RSS Feeds

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