A button within a button 

This control contains two buttons. It's very easy to use. Place a button control in your CDialog, add a CHiButton member variable (eg m_wndHiButton), and then in OnInitDialog subclass the control with m_wndHiButton.SubclassDlgItem(IDC_BUTTON1, this). To handle the message, it sufficient to add, using the class wizard, a handler for "on button click". User can disinguish between which button was pressed using something like: 

void CTestDlg::OnHibutton() 

 if (m_hiButton.m_bInsideButton) 

AfxMessageBox(_T("TestInside")); 

 else 

AfxMessageBox(_T("Test")); 

The user can attach icon, bitmap, text, or cursor to this control. 

Here the header file: 

/************************************ 

 REVISION LOG ENTRY 

 Revision By: Mihai Filimon 

 Revised on 7/3/98 12:20:46 PM 

 Comments: HiButton.h : header file 

 ************************************/ 

#if 

!defined(AFX_HIBUTTON_H__44AF4523_1247_11D2_863B_0040055C08D9__INCLUDED_) 

#define AFX_HIBUTTON_H__44AF4523_1247_11D2_863B_0040055C08D9__INCLUDED_ 

#if _MSC_VER >= 1000 

#pragma once 

#endif // _MSC_VER >= 1000 

///////////////////////////////////////////////////////////////////////////// 

// CHiButton window 

class CHiButton : public CButton 

// Construction 

public: 

 CHiButton(); 

 BOOL m_bInsideButton; 

 HBITMAP SetBitmap( HBITMAP hBitmap ); 

 HICON SetIcon( HICON hIcon ); 

 HCURSOR SetCursor( HCURSOR hCursor ); 

// Attributes 

public: 

// Operations 

public: 

// Overrides 

 // ClassWizard generated virtual function overrides 

 //{{AFX_VIRTUAL(CHiButton) 

 protected: 

 virtual void PreSubclassWindow(); 

 virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam); 

 //}}AFX_VIRTUAL 

// Implementation 

public: 

 virtual ~CHiButton(); 

 // Generated message map functions 

protected: 

 //{{AFX_MSG(CHiButton) 

 // NOTE - the ClassWizard will add and remove member functions here. 

 //}}AFX_MSG 

 DECLARE_MESSAGE_MAP() 

private: 

 CButton m_wndButtonInside; 

}; 

///////////////////////////////////////////////////////////////////////////// 

//{{AFX_INSERT_LOCATION}} 

// Microsoft Developer Studio will insert additional declarations 

immediately before the previous line. 

#endif // 

!defined(AFX_HIBUTTON_H__44AF4523_1247_11D2_863B_0040055C08D9__INCLUDED_) 

Here the source file: 

/************************************ 

 REVISION LOG ENTRY 

 Revision By: Mihai Filimon 

 Revised on 7/3/98 11:10:00 AM 

 Comments: HiButton.cpp : implementation file 

 ************************************/ 

#include "stdafx.h" 

#include "tesat.h" 

#include "HiButton.h" 

#ifdef _DEBUG 

#define new DEBUG_NEW 

#undef THIS_FILE 

static char THIS_FILE[] = __FILE__; 

#endif 

///////////////////////////////////////////////////////////////////////////// 

// CHiButton 

// Function name : CHiButton::CHiButton 

// Description : Contructor 

// Return type : 

CHiButton::CHiButton() 

 m_bInsideButton = FALSE; 

// Function name : CHiButton::~CHiButton 

// Description : Destructor 

// Return type : 

CHiButton::~CHiButton() 

BEGIN_MESSAGE_MAP(CHiButton, CButton) 

 //{{AFX_MSG_MAP(CHiButton) 

 // NOTE - the ClassWizard will add and remove mapping macros here. 

 //}}AFX_MSG_MAP 

END_MESSAGE_MAP() 

///////////////////////////////////////////////////////////////////////////// 

// CHiButton message handlers 

// Function name : CHiButton::PreSubclassWindow 

// Description : Subclass control 

// Return type : void 

void CHiButton::PreSubclassWindow() 

 CString caption; 

 GetWindowText(caption); 

 SetWindowText(_T("")); 

 CRect client; GetClientRect(client); 

 int dx = (int)((double)client.Width() * 0.8), dy = 

(int)((double)client.Height() * 0.7); 

 m_wndButtonInside.Create(caption, WS_CHILD | WS_VISIBLE | GetStyle(), 

CRect(CPoint((client.Width() - dx) / 2, (client.Height() - dy) / 

2),CSize( dx, dy)), this, 0); 

 m_wndButtonInside.SetWindowPos(&CWnd::wndNoTopMost,0,0,0,0, SWP_NOMOVE 

| SWP_NOSIZE); 

 ModifyStyle(0,WS_CLIPSIBLINGS | WS_CLIPCHILDREN); 

 m_wndButtonInside.SetFont(GetFont()); 

 CButton::PreSubclassWindow(); 

// Function name : CHiButton::OnCommand 

// Description : Send WM_COMMAND to parent of button. 

// Return type : BOOL 

// Argument : WPARAM wParam 

// Argument : LPARAM lParam 

BOOL CHiButton::OnCommand(WPARAM wParam, LPARAM lParam) 

 m_bInsideButton = TRUE; 

 GetParent()->SendMessage(WM_COMMAND, 

MAKEWPARAM(GetDlgCtrlID(),HIWORD(wParam)), lParam); 

 m_bInsideButton = FALSE; 

 return CButton::OnCommand(wParam, lParam); 

// Function name : CHiButton::SetBitmap 

// Description : Call to set the bitmap image of inside button 

// Return type : HBITMAP 

// Argument : HBITMAP hBitmap 

HBITMAP CHiButton::SetBitmap( HBITMAP hBitmap ) 

 ASSERT(m_wndButtonInside.GetSafeHwnd()); 

 return m_wndButtonInside.SetBitmap(hBitmap); 

// Function name : CHiButton::SetIcon 

// Description : Call to set the icon image of inside button 

// Return type : HICON 

// Argument : HICON hIcon 

HICON CHiButton::SetIcon( HICON hIcon ) 

 ASSERT(m_wndButtonInside.GetSafeHwnd()); 

 return m_wndButtonInside.SetIcon(hIcon); 

// Function name : CHiButton::SetCursor 

// Description : 

// Return type : HICON 

// Argument : HCURSOR hCursor 

HCURSOR CHiButton::SetCursor( HCURSOR hCursor ) 

 ASSERT(m_wndButtonInside.GetSafeHwnd()); 

 return m_wndButtonInside.SetCursor(hCursor);