In this post, I’m introducing the new button style which is introduced in Windows Vista and above. It’s no more painful to create a Drop down button with Windows Vista, earlier it was accomplished by placing two controls side by side and handle it’s message separately.
Windows Vista introduced new button style BS_SPLITBUTTON and you can set this new style by specifying as parameter of CreateWindow API if you’re dynamically creating button control or by modifying the style using ModifyStyle API. To use this style Windows Vista or higher required .
Using with CreateWindow/CButton::Create API
HWND hWndButtonMain = CreateWindow(_T("Button"), _T("Split Button"),
WS_CHILD | WS_VISIBLE | BS_SPLITBUTTON,
10, 10, 120, 50,
m_hWnd, (HMENU)IDC_BTN_BUTTON1, AfxGetApp()->m_hInstance, NULL);
Or
CButton* pButton = new CButton; pButton->Create( _T( "Split Button"), WS_CHILD | WS_VISIBLE | BS_SPLITBUTTON,CRect(10,10,120,50),this,IDC_BUTTON1);
Or modifying Existing control
m_SplitButton.ModifyStyle(0, BS_SPLITBUTTON );
Handling Dropdown Event
Add message handler for BCN_DROPDOWN in your message handler or in message map of your MFC window class
ON_NOTIFY(BCN_DROPDOWN, IDC_BUTTON1, &CControlSampleDlg::OnBnDropDownButton1)
In the message Handler, Display the popup menu and the menu item can be handled using ON_COMMAND message with associated menu ID.
void CControlSampleDlg::OnBnDropDownButton1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMBCDROPDOWN pDropDown = reinterpret_cast<lpnmbcdropdown>(pNMHDR);
Button_SetDropDownState( m_SplitButton, TRUE );
RECT rc;
// Get the bounding rectangle of the client area
::GetWindowRect(m_SplitButton, &rc);
HMENU hmenu = LoadMenu(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_MENU1));
HMENU hmenuTrackPopup;
hmenuTrackPopup = GetSubMenu(hmenu, 0);
TrackPopupMenuEx(hmenuTrackPopup, TPM_RIGHTBUTTON, rc.left, rc.bottom, m_hWnd, NULL);
DestroyMenu(hmenu);
Button_SetDropDownState( m_SplitButton, FALSE );
*pResult = 0;
}

Hi Sarat,
I am new to windows programming and came across your blog through this post. I was searching for a way to click the “Organize” split button in the windows explorer in Vista and then click on the menu items Layout;Navigation pane. I need to do this in VB script. I was unable to make the GetMenu or GetSubMenu functions to work… would you be able to guide me…appreciate your help
Thanks,
Reju