m_hBmp = ::LoadBitmap(HINSTANCE(GetModuleHandle(0)),MAKEINTRESOURCE(IDB_PLAY));
m_playButton.SetBitmap(m_hBmp);用这两行代码已经可以帮一个按钮贴上位图,但总感觉效果不好,尤其按钮的边缘仍然不能为位图所覆盖所以想请教用CBitmapButton替按钮贴位图的,是不是那样效果比较好?一定请给出代码,谢谢了
m_playButton.SetBitmap(m_hBmp);用这两行代码已经可以帮一个按钮贴上位图,但总感觉效果不好,尤其按钮的边缘仍然不能为位图所覆盖所以想请教用CBitmapButton替按钮贴位图的,是不是那样效果比较好?一定请给出代码,谢谢了
解决方案 »
- 两个CStatic的覆盖
- 怎么获取文件夹下的二级文件夹
- 走头无路,继续提问
- CInternetSession 如果自动下载HTML中的媒体文件(如JPG)
- 什么控件功能与propertyGrid 相似
- 一个工程,上周还是好好的,今天早上就做了一个修改,修改了一个字符串,就出现这样的错误,哪位知道怎么解决吗?急。。。。。
- 我想问一下,就是在edit box这种空间中添如文字
- MessageBox里面的焦点怎么移动
- 关天数据库访问时,连接查询语句时,为何有时可以查询,有时查询一半时,又不行有时完全不行?问题
- 如何复制IE临时目录里的文件?
- 我用CreateBitmap() 创建的位图文件该如何保存?
- 请问各位高手:位图保存能不能用Serialize来保存?
{
CDC buttomDC;
CBitmap bitmapTrans;
BITMAP bmp;
CDC mem;
CRect rc;
buttomDC.Attach(lpDrawItemStruct->hDC);
mem.CreateCompatibleDC(&buttomDC);
rc=lpDrawItemStruct->rcItem;
UINT state = lpDrawItemStruct->itemState;
if(state & ODS_FOCUS)
{
bitmapTrans.LoadBitmap(IDB_BTN_DOWN);
bitmapTrans.GetBitmap(&bmp);
CBitmap* old=mem.SelectObject(&bitmapTrans);
buttomDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,
0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
mem.SelectObject(old);
bitmapTrans.DeleteObject();
buttomDC.SetBkMode(TRANSPARENT);
if(nIDCtl == IDC_ODBC_SQL_SAVE){
buttomDC.DrawText("保存",&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
else
buttomDC.DrawText("保存",&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
else
{
bitmapTrans.LoadBitmap(IDB_GETFOCUS);
bitmapTrans.GetBitmap(&bmp);
CBitmap* old2=mem.SelectObject(&bitmapTrans);
buttomDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,
0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
mem.SelectObject(old2);
bitmapTrans.DeleteObject();
buttomDC.SetBkMode(TRANSPARENT);
if(nIDCtl == IDC_ODBC_SQL_SAVE){
buttomDC.DrawText("保存",&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
else
buttomDC.DrawText("保存",&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
CFormView::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
1、如果在CDialog类型或其继承类
(1)、在对话框适当位置添加按钮,为其"Caption"设置一个值,假设为"MYBUTTON",为其指定ID号,假设为"IDC_MYBUTTON",并设定“Owner Draw”属性
(2)、做4个位图,分别用于当按钮处在“UP”、“DOWN”、“FOCUS”、“DISABLE”时显示,其ID分别为"MYBUTTONU"、"MYBUTTOND"、"MYBUTTONF"、"MYBUTTONX",注意,不要写成MYBUTTONU、MYBUTTOND、MYBUTTONF、MYBUTTONX;
(3)、在对话框类的结构中(.h)加入如下代码:
CBitmapButton m_wndBitmapButton;(3)、在对话框的初始函数(InitDialog)中加入如下代码:
m_wndBitmapButton.AutoLoad(IDC_MYBUTTON,this);
//#include "stdafx.h"
#include "DialogTest7.h"
#include "MyButton.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// CMyButtonCMyButton::CMyButton()
{
m_bIsMouseMove = FALSE;
}CMyButton::~CMyButton()
{
}
BEGIN_MESSAGE_MAP(CMyButton, CButton)
//{{AFX_MSG_MAP(CMyButton)
ON_WM_MOUSEMOVE()
ON_CONTROL_REFLECT(BN_CLICKED, OnClicked)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CMyButton message handlers
void CMyButton::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
ModifyStyle(0, BS_OWNERDRAW); CButton::PreSubclassWindow();
}void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default if( !m_bIsMouseMove )
{
m_bIsMouseMove = TRUE;
Invalidate();
TRACKMOUSEEVENT trackmouseevent;
trackmouseevent.cbSize = sizeof(trackmouseevent);
trackmouseevent.dwFlags = TME_LEAVE ;
trackmouseevent.hwndTrack = GetSafeHwnd();
trackmouseevent.dwHoverTime = HOVER_DEFAULT;
_TrackMouseEvent(&trackmouseevent);
}
CButton::OnMouseMove(nFlags, point);
}
#define WM_MOUSEOFFBUTTON WM_USER+101
LONG CMyButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_bIsMouseMove = FALSE;
::PostMessage(GetParent()->GetSafeHwnd(), WM_MOUSEOFFBUTTON, 0, 0);
Invalidate(); return 0;
}#define WM_MOUSEONBUTTON WM_USER+100
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct )
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
DWORD nState = lpDrawItemStruct->itemState;
DWORD nAction = lpDrawItemStruct->itemAction;
CRect rc = lpDrawItemStruct->rcItem;
UINT uStyle = DFCS_BUTTONPUSH; pDC->SetBkMode(TRANSPARENT);
CString strText;
GetWindowText(strText); if (nState & ODS_SELECTED)//select
{
m_bIsMouseMove = FALSE; DrawSelectedState(rc, pDC);
}
else //Normal
{
DrawNormalState(rc, pDC);
} if (m_bIsMouseMove)//hover on the button
{
DrawFocusState(rc, pDC);
::PostMessage(GetParent()->GetSafeHwnd(), WM_MOUSEONBUTTON, 0, 0); }
pDC->DrawText(strText, strText.GetLength(),
&lpDrawItemStruct->rcItem,
DT_SINGLELINE|DT_VCENTER|DT_CENTER);
}
void CMyButton::DrawNormalState(CRect rc, CDC *pDC)
{ //DrawFrame(rc, pDC);
// DrawFace(rc, RGB(223, 233, 255), RGB(0, 128, 255), pDC);
// DrawFrame(rc, RGB(230, 230, 230), RGB(128, 128, 128), pDC);
// pDC->SetTextColor(RGB(255, 255, 255));
pDC->DrawState(CPoint(0, 0), CSize(rc.Width(), rc.Height()),
m_bmNormal, DSS_NORMAL);}void CMyButton::DrawSelectedState(CRect rc, CDC *pDC)
{// DrawFace(rc, RGB(255, 255, 255), RGB(0, 255, 128), pDC);
// DrawFrame(rc, RGB(255, 255, 128), RGB(0, 255, 255), pDC);
// pDC->SetTextColor(RGB(0, 128, 128));
pDC->DrawState(CPoint(0, 0), CSize(rc.Width(), rc.Height()),
m_bmSelect, DSS_NORMAL);
}
void CMyButton::DrawFocusState(CRect rc, CDC *pDC)
{
// DrawFace(rc, RGB(255, 255, 255), RGB(128, 255, 128), pDC);
// DrawFrame(rc, RGB(255, 255, 255), RGB(128, 255, 128), pDC);
// pDC->SetTextColor(RGB(0, 128, 255));
pDC->DrawState(CPoint(0, 0), CSize(rc.Width(), rc.Height()),
m_bmFocuse, DSS_NORMAL);
}void CMyButton::DrawFace(CRect &rc, COLORREF clrTopRight, COLORREF clrBottomLeft,
CDC* pDC)
{ CPen Pen;
CPen* pOldPen = pDC->SelectObject(&Pen);
int R,G, B;
R = (GetRValue(clrTopRight) - GetRValue(clrBottomLeft)) / rc.Height();
G = (GetGValue(clrTopRight) - GetGValue(clrBottomLeft)) / rc.Height();
B = (GetBValue(clrTopRight) - GetBValue(clrBottomLeft)) / rc.Height();
int nColR = GetRValue(clrTopRight);
int nColG = GetGValue(clrTopRight);
int nColB = GetBValue(clrTopRight);
COLORREF clrColMax = clrTopRight > clrBottomLeft ? clrTopRight : clrBottomLeft;
COLORREF clrColMin = clrTopRight > clrBottomLeft ? clrBottomLeft: clrTopRight; for(int i=0; i<rc.Height(); i++)
{
nColR -= R;
nColG -= G;
nColB -= B;
Pen.CreatePen(PS_SOLID, 1, RGB(nColR, nColG, nColB));
pDC->SelectObject(&Pen);
pDC->MoveTo(rc.left, rc.top+i);
pDC->LineTo(rc.right, rc.top+i); Pen.DeleteObject();
} pDC->SelectObject(pOldPen);}void CMyButton::DrawFrame(CRect& rc, COLORREF clrTopRight, COLORREF clrBottomLeft,
CDC* pDC)
{
CBrush NullBrush;
NullBrush.CreateStockObject(NULL_BRUSH);
CBrush* pOldBrush = pDC->SelectObject(&NullBrush); CPen Pen;
Pen.CreatePen(PS_SOLID, 1, RGB(0, 64, 128));
CPen* pOldPen = pDC->SelectObject(&Pen);
pDC->RoundRect(rc, CPoint(3, 3) );
rc.DeflateRect(1, 1, 1, 1);
pDC->Draw3dRect(rc, clrTopRight, clrBottomLeft); pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
void CMyButton::SetBitmaps(UINT nNormal, UINT nSelect, UINT nFocuse)
{
m_bmNormal.LoadBitmap(nNormal);
m_bmSelect.LoadBitmap(nSelect);
m_bmFocuse.LoadBitmap(nFocuse);
}void CMyButton::OnClicked()
{
// TODO: Add your control notification handler code here
}
1、如果在CDialog类型或其继承类
(1)、在对话框适当位置添加按钮,为其"Caption"设置一个值,假设为"MYBUTTON",为其指定ID号,假设为"IDC_MYBUTTON",并设定“Owner Draw”属性
(2)、做4个位图,分别用于当按钮处在“UP”、“DOWN”、“FOCUS”、“DISABLE”时显示,其ID分别为"MYBUTTONU"、"MYBUTTOND"、"MYBUTTONF"、"MYBUTTONX",注意,不要写成MYBUTTONU、MYBUTTOND、MYBUTTONF、MYBUTTONX;
(3)、在对话框类的结构中(.h)加入如下代码:
CBitmapButton m_wndBitmapButton;(4)、在对话框的初始函数(OnInitDialog)中加入如下代码:
m_wndBitmapButton.AutoLoad(IDC_MYBUTTON,this);
(5)、编译并运行
2、其它情况
(1)、做4个位图,分别用于当按钮处在“UP”、“DOWN”、“FOCUS”、“DISABLE”时显示,对ID无要求;
(2)、声明CBitmapButton对象如:CBitmapButton m_wndBitmapButton;
(3)、调用Create()函数创建按钮
(4)、调用LoadBitmaps()函数装入位图。
函数原形如下:
BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );BOOL LoadBitmaps( UINT nIDBitmapResource, UINT nIDBitmapResourceSel = 0, UINT nIDBitmapResourceFocus = 0, UINT nIDBitmapResourceDisabled = 0 );
有CButtonST的源码及例子