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); 
} 

Last updated: 12 July 1998