按钮内还有按钮
可行?

解决方案 »

  1.   

    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 Comments:
    But why? - RealCodeGuy (2002/06/26) 
    good :} - okky (2002/06/06) 
    VISUAL C++ HELP!!!! - :'o( (2002/05/09) 
    hoi thac mac 1 chut??? - sandy (2002/04/07) 
    ^^* - hihi (2002/01/10) 
    giup do ?! - Vo Van Tai (2001/10/25) 
    Visual Basic Type Button Please... - Pandu (2001/07/01) 
    Java Compatible Button pleease! - B Shukla (2001/03/25) 
    Using a special style, can enable creation of overlapping DlgItems - Noam Rathaus (1999/05/06) 
    Add Comment   
     
     
    EarthWeb is a service of Jupitermedia Corp.
    Copyright 2002 Jupitermedia Corp. All Rights Reserved.
    Feedback,   Advertising Info,   Legal Notices,  Licensing, Reprints, & Permissions,   Privacy Policy. 
      

  2.   

    http://www.codeguru.com/buttonctrl/double_button.shtml