CButton类

类CButton提供了对Windows按钮控件的操作。按钮控件是一个小的矩形子窗口,可以通过单击选中(按下)或不选中。按钮可以单独使用,也可以成组使用,它还可以具有文本标题。在用户单击它的时候,按钮通常要改变显示外观。


继承体系

  
CObject
└CCmdTarget
└CWnd
└CButton

详细资料

  典型的按钮控件有:复选框、单选钮和下压式按钮(push button)。一个CButton对象可以是它们中的一种,这由它的按钮风格和成员函数Create的初始化决定。
  此外,类CButtonBitmap是从类CButton继承而来的,不过它支持按钮的图像标签。一个CButtonBitmap对象可以分别为它的四种状态(未按下、按下、获得焦点和禁止存取)设置不同的位图。
  既可以从对话框模板中创建一个按钮控件,也可以直接在代码中创建。
  无论哪种情况,都要先调用构造函数CButton构造一个CButton对象,然后调用成员函数Create创建Windows按钮控件并应用到CButton对象上。
  在一个从类CButton派生出来的类中,构造可以一步完成。程序员可以为这个派生类编写一个构造函数,并在其中调用Create函数。
  如果想处理Windows的通知消息,如位图按钮控件发给它的父对象(通常是从CDialog继承来的)的消息,就要在父对象中加入消息映射入口以及处理每个消息的成员函数。
  每个消息映射入口的格式如下:
  ON_Notification(id, memberFxn)
  其中id指定了发送通知的控件的子窗口的ID,而memberFxn指定了处理该通知的父对象中的成员函数名。
  父对象的函数原型格式如下:
  afx_msg void memberFxn( );
  可能的消息映射入口如下:
  
映射入口 何时向父对象发送消息ON_BN_CLICKED 用户单击按钮时ON_BN_DOUBLECLICKED 用户双击按钮时
 如果在对话框资源中创建了CButton对象,则在用户关闭该对话框时会自动撤消这个CButton对象。如果在窗口中创建了CButton对象,就可能需要自己撤消它。如果是用new函数在内存的堆中创建该对象的,则在用户关闭该窗口按钮控件时,必须用delete函数撤消它。如果在堆栈中创建了该对象,或者它嵌入在父对话框对象中,系统会自动撤消它。
  #include


成员列表
  CButton类的成员
构造函数
  CButton 构造一个CButton对象
初始化函数
  Create 创建Windows按钮控件并在CButton对象上应用
  CButton::Create 创建一个CButton对象
  BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
  lpszCaption是按钮上显示的文本;
  dwStyle指定按钮风格,可以是按钮风格与窗口风格的组合,取值有:
窗口风格
  WS_CHILD 子窗口,必须有
  WS_VISIBLE 窗口可见,一般都有
  WS_DISABLED 禁用窗口,创建初始状态为灰色不可用的按钮时使用
  WS_TABSTOP 可用Tab键选择
  WS_GROUP 成组,用于成组的单选按钮中的第一个按钮
按钮风格
  BS_PUSHBUTTON 下压式按钮,也即普通按钮
  BS_AUTORADIOBUTTON 含自动选中状态的单选按钮
  BS_RADIOBUTTON 单选按钮,不常用
  BS_AUTOCHECKBOX 含自动选中状态的复选按钮
  BS_CHECKBOX 复选按钮,不常用
  BS_AUTO3STATE 含自动选中状态的三态复选按钮
  BS_3STATE 三态复选按钮,不常用
  以上风格指定了创建的按钮类型,不能同时使用,但必须有其一。
  BS_BITMAP 按钮上将显示位图
  BS_DEFPUSHBUTTON 设置为默认按钮,只用于下压式按钮,一个对话框中只能指定一个默认按钮
  rect指定按钮的大小和位置;
  pParentWnd指示拥有按钮的父窗口,不能为NULL;
  nID指定与按钮关联的ID号,用上一步创建的ID号。
  返回值:若成功,返回非0;否则返回0 CButton::DrawItem 重载该函数绘制一个CButton对象,由框架调用该函数
  virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
  参数:lpDrawItemStruct指向包含绘制项信息和要求类型的LPDRAWITEMSTRUCT结构的长指针
  CButton::SetCheck 设置或复位单选按钮和复选按钮的选择状态
  void SetCheck(int nCheck);
  参数:nCheck 指定设置的状态,0为未选择,1为选中,2为不确定
操作
  GetState 检索按钮控件的选中状态、加亮状态和获得焦点状态
  SetState 设置按钮控件的加亮状态
  GetCheck 检索按钮控件的选中状态
  SetCheck 设置按钮控件的选中状态
  GetButtonStyle 检索按钮控件的风格
  SetButtonStyle 设置按钮控件的风格
  GetIcon 检索此前调用SetIcon设置的图标句柄
  SetIcon 指定一个在按钮上显示的图标
  GetBitmap 检索此前调用SetBitmap设置的位图的句柄
  SetBitmap 设置在按钮上显示的位图
  GetCursor 检索此前调用SetCursor设置的光标图像的句柄
  SetCursor 设置在按钮上显示的光标图像
可覆盖的函数
  DrawItem 可以覆盖它来绘制自定义的CButton对象


//========================================================================

//TITLE:
//    CButton使用详解
//========================================================================

        恩,不用怀疑了,这个CButton类也不是微软的通用控件,而是和我之前写的CText及CProgress一样,都是为了方便大面积需要贴图的程序,而模仿微软的特性来写的一个类.

 就让我们直接看看例程代码.
        CButton m_Btn;
        
        
// 设置该按钮可用
        m_Btn.SetEnable(TRUE);
        
        
// 设置实例句柄
        m_Btn.SetHinstance(hInst);
        
        
// 设置按钮的位置
        m_Btn.SetPosition( & RC_BTN);
        
        
// 设置普通状态,按下状态,无效状态的图片信息
        m_Btn.SetImgInfoDisable( & IMG_DISABLE);
        m_Btn.SetImgInfoEnable(
& IMG_ENABLE);
        m_Btn.SetImgInfoPush(
& IMG_PUSH);
        
        
// 设置透明绘制
        m_Btn.SetTransparent(TRUE);
        
        
// 设置透明色
        m_Btn.SetTransparentColor(TRANSPARENT_COLOR);
        
        
// 绘制背景
        m_Btn.Draw(hdc);
        
        
// 判断是否点击该按钮
         if (m_Btn.CheckTap( & pt)  ==  TRUE)
        
{
            
//Do something..
        }

        恩,就这么简单,也没什么很特别的地方,仅仅主要是方便大量采用贴图的程序而已.
        
        CButton类完整源码:
//////////////////////////////////////////////////////////////////////
//  Button.h: interface for the CButton class.
//
// Version: 
//     1.1.1
// Data:
//     2007.03.31   
//////////////////////////////////////////////////////////////////////

#ifndef BUTTON_H
#define  BUTTON_H



#include 
" CtrlCommon.h "



// ---------------------------------------------------------------------------
// Enum data

// For the button draw
enum  ButtonDrawType
{
    BTN_DRAW_AUTO,
    BTN_DRAW_PUSH,
    BTN_DRAW_ENABLE,
    BTN_DRAW_DISABLE
}
;

// ------------------------------------------------------------------------------
// Class

class  CButton  
{
public:
    
void SetTransparent(BOOL bTran);
    
void SetTransparentColor(COLORREF crColor);
    
void GetPosition(RECT *prcOut);
    BOOL CheckTap(
const LPPOINT ppt);
    
void SetPosition(const RECT * pRc);
    
void SetImgInfoPush(const DISPIMAGEINFO *pImgInfo);
    
void SetImgInfoDisable(const DISPIMAGEINFO *pImgInfo);
    
void SetImgInfoEnable(const DISPIMAGEINFO *pImgInfo);
    
void SetHinstance(HINSTANCE hInst);
    BOOL Draw(HDC hdc, ButtonDrawType btnDraw 
= BTN_DRAW_AUTO);
    
void SetEnable(BOOL bEnable);
    BOOL GetEnable();
    CButton();
    
virtual ~CButton();

protected:
    BOOL m_bEnable;
    RECT m_rcWndPos;
    DISPIMAGEINFO m_ImgPush;
    DISPIMAGEINFO m_ImgEnable;
    DISPIMAGEINFO m_ImgDisable;
    HANDLE m_hBmpPush;
    HANDLE m_hBmpEnable;
    HANDLE m_hBmpDisable;
    HINSTANCE m_hInst;
    COLORREF m_crTranColor;
    BOOL m_bTran;
}
;

#endif   //  #ifndef BUTTON_H





//////////////////////////////////////////////////////////////
//  Button.cpp: implementation of the CButton class.
//
//////////////////////////////////////////////////////////////////////

#include 
" stdafx.h "
#include 
" Button.h "


// -------------------------------------------------------------------
// Macro define
#define  DEFAULT_TRANSPARENT_COLOR    RGB(125,125,125)
// --------------------------------------------------------------------

//////////////////////////////////////////////////////////////////////
//  Construction/Destruction
//////////////////////////////////////////////////////////////////////

CButton::CButton()
{
    m_bEnable 
= TRUE;
    memset(
&m_rcWndPos,0,sizeof(m_rcWndPos));
    memset(
&m_ImgPush,0,sizeof(m_ImgPush));
    memset(
&m_ImgEnable,0,sizeof(m_ImgEnable));
    memset(
&m_ImgDisable,0,sizeof(m_ImgDisable));    
    m_hBmpPush 
= NULL;
    m_hBmpEnable 
= NULL;
    m_hBmpDisable 
= NULL;
    m_hInst 
= NULL;

    m_crTranColor 
= DEFAULT_TRANSPARENT_COLOR;
    m_bTran 
= FALSE;
}


CButton::
~ CButton()
{
    
if(m_hBmpPush != NULL)
    
{
        DeleteObject(m_hBmpPush);
        m_hBmpPush 
= NULL;
    }


    
if(m_hBmpEnable != NULL)
    
{
        DeleteObject(m_hBmpEnable);
        m_hBmpEnable 
= NULL;
    }


    
if(m_hBmpDisable != NULL)
    
{
        DeleteObject(m_hBmpDisable);
        m_hBmpDisable 
= NULL;
    }

}



// --------------------------------------------------------------------
// Description:
//     The button is enable or not
//
// -------------------------------------------------------------------
BOOL CButton::GetEnable()
{
    
return m_bEnable;
}




// --------------------------------------------------------------------
// Description:
//     Set the button status 
//
// -------------------------------------------------------------------
void  CButton::SetEnable(BOOL bEnable)
{
    m_bEnable 
= bEnable;
}



// --------------------------------------------------------------------
// Description:
//     Draw the button
//
// -------------------------------------------------------------------
BOOL CButton::Draw(HDC hdc, ButtonDrawType btnDraw)
{
    
if(m_hInst == NULL)
    
{
        
return FALSE;
    }


    HANDLE hBmp 
= NULL;
    PDISPIMAGEINFO pInfo;

    
if(btnDraw == BTN_DRAW_AUTO)
    
{
        
if(m_bEnable == TRUE)
        
{
            
if(m_hBmpEnable == NULL)
            
{
                m_hBmpEnable 
= LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgEnable.imgID),IMAGE_BITMAP,0,0,0);
            }


            hBmp 
= m_hBmpEnable;
            pInfo 
= &m_ImgEnable;
        }

        
else
        
{
            
if(m_hBmpDisable == NULL)
            
{
                m_hBmpDisable 
= LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgDisable.imgID),IMAGE_BITMAP,0,0,0);
            }


            hBmp 
= m_hBmpDisable;
            pInfo 
= &m_ImgDisable;
        }

    }

    
else if(btnDraw == BTN_DRAW_ENABLE)
    
{
        
if(m_hBmpEnable == NULL)
        
{
            m_hBmpEnable 
= LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgEnable.imgID),IMAGE_BITMAP,0,0,0);
        }


        hBmp 
= m_hBmpEnable;
        pInfo 
= &m_ImgEnable;
    }

    
else if(btnDraw == BTN_DRAW_DISABLE)
    
{
        
if(m_hBmpDisable == NULL)
        
{
            m_hBmpDisable 
= LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgDisable.imgID),IMAGE_BITMAP,0,0,0);
        }


        hBmp 
= m_hBmpDisable;
        pInfo 
= &m_ImgDisable;
    }

    
else if(btnDraw == BTN_DRAW_PUSH)
    
{
        
if(m_hBmpPush == NULL)
        
{
            m_hBmpPush 
= LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgPush.imgID),IMAGE_BITMAP,0,0,0);
        }


        hBmp 
= m_hBmpPush;
        pInfo 
= &m_ImgPush;
    }



    
//Create a DC that matches the device
    HDC hdcMem = CreateCompatibleDC(hdc);
    
//Select the bitmap into to the compatible device context
    HGDIOBJ hOldSel = SelectObject(hdcMem,hBmp);
    
//Copy the bitmap image from the memory DC to the screen DC
    if(m_bTran == FALSE)
    
{
        StretchBlt(hdc,m_rcWndPos.left,m_rcWndPos.top,(m_rcWndPos.right 
- m_rcWndPos.left),(m_rcWndPos.bottom - m_rcWndPos.top),
            hdcMem,pInfo
->left,pInfo->top,(pInfo->right - pInfo->left),(pInfo->bottom - pInfo->top),SRCCOPY);
    }

    
else
    
{
        TransparentBlt(hdc,m_rcWndPos.left,m_rcWndPos.top,(m_rcWndPos.right 
- m_rcWndPos.left),(m_rcWndPos.bottom - m_rcWndPos.top),
            hdcMem,pInfo
->left,pInfo->top,(pInfo->right - pInfo->left),(pInfo->bottom - pInfo->top),m_crTranColor);
    }

    
//Restore original bitmap selection and destroy the memory DC
    SelectObject(hdcMem,hOldSel);    
    DeleteDC(hdcMem);



    
return TRUE;
}



// --------------------------------------------------------------------
// Description:
//     Set the handle of instance
//
// -------------------------------------------------------------------
void  CButton::SetHinstance(HINSTANCE hInst)
{
    m_hInst 
= hInst;
}



// --------------------------------------------------------------------
// Description:
//     Set the image of enable
//
// -------------------------------------------------------------------
void  CButton::SetImgInfoEnable( const  DISPIMAGEINFO  * pImgInfo)
{
    
if(m_hBmpEnable != NULL)
    
{
        DeleteObject(m_hBmpEnable);
        m_hBmpEnable 
= NULL;
    }


    m_ImgEnable 
= *pImgInfo;
}

// --------------------------------------------------------------------
// Description:
//     Set the image of disable
//
// -------------------------------------------------------------------
void  CButton::SetImgInfoDisable( const  DISPIMAGEINFO  * pImgInfo)
{
    
if(m_hBmpDisable != NULL)
    
{
        DeleteObject(m_hBmpDisable);
        m_hBmpDisable 
= NULL;
    }


    m_ImgDisable 
= *pImgInfo;
}

// --------------------------------------------------------------------
// Description:
//     Set the image of push
//
// -------------------------------------------------------------------
void  CButton::SetImgInfoPush( const  DISPIMAGEINFO  * pImgInfo)
{
    
if(m_hBmpPush != NULL)
    
{
        DeleteObject(m_hBmpPush);
        m_hBmpPush 
= NULL;
    }


    m_ImgPush 
= *pImgInfo;
}


// --------------------------------------------------------------------
// Description:
//     Set the button position
//
// -------------------------------------------------------------------
void  CButton::SetPosition( const  RECT  * pRc)
{
    m_rcWndPos 
= *pRc;
}



// --------------------------------------------------------------------
// Description:
//     Check tapped position in the area.If the button is disable,
// it would return FALSE.
//
// -------------------------------------------------------------------
BOOL CButton::CheckTap( const  LPPOINT ppt)
{
    
if(m_bEnable == FALSE)
    
{
        
return FALSE;
    }


    
if( ppt->>= m_rcWndPos.left && ppt-><= m_rcWndPos.right && ppt->>= m_rcWndPos.top && ppt-><= m_rcWndPos.bottom)
    
{
        
return TRUE;
    }

    
else
    
{
        
return FALSE;
    }


}


// --------------------------------------------------------------------
// Description:
//     Get the position as rect
//
// ---------------------------------------------------------------------
void  CButton::GetPosition(RECT  * prcOut)
{
    
*prcOut = m_rcWndPos;
}



// --------------------------------------------------------------------
// Description:
//     Set the transparent color
//
// -------------------------------------------------------------------
void  CButton::SetTransparentColor(COLORREF crColor)
{
    m_crTranColor 
= crColor;
}

// --------------------------------------------------------------------
// Description:
//     Set the transparent mode
//
// Parameters:
//     bTran:[in]
//         TRUE  - Don't draw the transparent color
//         FALSE - Draw all the color
//
// -------------------------------------------------------------------
void  CButton::SetTransparent(BOOL bTran)
{
    m_bTran 
= bTran;
}

你可能感兴趣的:(C++,Development)