一,只加载一张位图的方法:
1,
装入bmp资源,id为IDB_BMP,按钮的bitmap属性设为true,icon属性为false。
2,
CButton *pBtn = (CButton *)GetDlgItem(IDB_BMP);
CBitmap bitMap;
HBITMAP hBit ;
if(bitMap.LoadBitmapW(IDB_NORMAL_BTN))
{
hBit = (HBITMAP)bitMap.Detach();
pBtn->SetBitmap(hBit);
}
缺点:图片不会自动拉伸。
二,为按钮的不同状态加载不同的位图:(使用CBitmapButton类)这种方法还可以。
1,按钮属性 Owner Draw选上,按钮ID: IDC_BUTTON1
为IDC_BUTTON1添加CButton变量m_button,
2,然后手动将CButton m_button改为
CBitmapButton m_button;
3,在初始化里边
m_button.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);//IDB_BITMAP1:平时;IDB_BITMAP2:按下
m_button.SubclassDlgItem(IDC_BUTTON1, this);
m_button.SizeToContent();
或者用另一种方式,不必为IDC_BUTTON1添加关联的变量。
直接声明CBitmapButton m_button;,在初始化里边调用
m_BitmapBtn.AutoLoad(IDC_BUTTON1_AREA,this);//把按钮和变量联系起来
m_BitmapBtn.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);
m_button.SizeToContent();
缺点:1,无法显示文字,需重载DrawItem函数。
2,无法去掉图片的背景色,即只能显示矩形按钮。
// NOTE: CMyButton is a class derived from CButton. The CMyButton // object was created as follows: // // CMyButton myButton; // myButton.Create(_T("My button"), // WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW, // CRect(10,10,100,30), pParentWnd, 1); // // This example implements the DrawItem method for a CButton-derived // class that draws the button's text using the color red. void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { UINT uStyle = DFCS_BUTTONPUSH; // This code only works with buttons. ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON); // If drawing selected, add the pushed style to DrawFrameControl. if (lpDrawItemStruct->itemState & ODS_SELECTED) uStyle |= DFCS_PUSHED; // Draw the button frame. ::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem, DFC_BUTTON, uStyle); // Get the button's text. CString strText; GetWindowText(strText); // Draw the button text using the text color red. COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, RGB(255,0,0)); ::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(), &lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER); ::SetTextColor(lpDrawItemStruct->hDC, crOldColor); }
//继承CBitmapButton的例子
void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
//从lpDrawItemStruct获取控件的相关信息
CRect rect=lpDrawItemStruct-> rcItem;
CDC *pDC=CDC::FromHandle(lpDrawItemStruct-> hDC);
int nSaveDC=pDC-> SaveDC();
UINT state = lpDrawItemStruct-> itemState;
TCHAR strText[MAX_PATH + 1];
::GetWindowText(m_hWnd, strText, MAX_PATH);
CBitmapButton::DrawItem(lpDrawItemStruct);
CRect rect1=rect;
rect.SetRect(rect1.left,rect1.top,rect1.left+75,rect1.top+24);
//显示按钮的文本
pDC-> SetTextColor(TextColor);
if (strText!=NULL)
{
CFont* hFont = GetFont();
CFont* hOldFont = pDC-> SelectObject(hFont);
CSize szExtent = pDC-> GetTextExtent(strText, lstrlen(strText));
CPoint pt( rect.CenterPoint().x - szExtent.cx / 2, rect.CenterPoint().y - szExtent.cy / 2);
if (state & ODS_SELECTED)
pt.Offset(1, 1);
int nMode = pDC-> SetBkMode(TRANSPARENT);
if (state & ODS_DISABLED)
pDC-> DrawState(pt, szExtent, strText, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);
else
pDC-> DrawState(pt, szExtent, strText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL);
pDC-> SelectObject(hOldFont);
pDC-> SetBkMode(nMode);
}
pDC-> RestoreDC(nSaveDC);
}
三,继承CButton类,重写OnPaint函数,为Button的不同状态画位图(BitBlt,TransparentBlt,StretchBlt ,MaskBlt,
PlgBlt
)。
四,
可以采用CButtonST控件,挺好用的,比MFC的那些封装好用。
假设按钮ID为IDC_BUTTON1
1.添加成员变量
CButtonST m_btn;
2.添加位图资源,ID设为IDB_BITMAP1
3.在OnInitDialog函数中初始化按钮m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetBitmaps(IDB_BITMAP1,RGB(0,0,0));
m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
注: 上面的SetBitmaps函数会将图片中颜色值为RGB(0,0,0)的点设为透明。
五,
把button按钮属性设置为ower draw
然后映射onDrawItem消息
在ondraw函数内自己绘制就可以了
void CUi6Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if(nIDCtl == IDC_HELLO_CFAN)
{
//绘制按钮框架
UINT uStyle = DFCS_BUTTONPUSH;
//是否按下去了?
if (lpDrawItemStruct->itemState & ODS_SELECTED)
uStyle |= DFCS_PUSHED;
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
dc.DrawFrameControl(&lpDrawItemStruct->rcItem, DFC_BUTTON, uStyle);
//输出文字
dc.SelectObject(&m_Font);
dc.SetTextColor(RGB(0, 0, 255));
dc.SetBkMode(TRANSPARENT);
CString sText;
m_HelloCFan.GetWindowText(sText);
dc.TextOut(lpDrawItemStruct->rcItem.left + 20, lpDrawItemStruct->rcItem.top + 20, sText);
//是否得到焦点
if(lpDrawItemStruct->itemState & ODS_FOCUS)
{
//画虚框
CRect rtFocus = lpDrawItemStruct->rcItem;
rtFocus.DeflateRect(3, 3);
dc.DrawFocusRect(&rtFocus);
}
return;
}
CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}