关于CBitmapButton贴图的问题~ CBitmapButton关联的按钮有四幅状态图,正常,鼠标经过,鼠标按下,正常,但是我的按钮好像使用了MFC自带的CBitmapButton类,并没有出现预期的效果~~请各位做界面的朋友帮忙~~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1.头文件中定义个CBitmapButton m_btn;对象2.m_btn.LoadBitmaps();//LoadBitmaps()4个参数是需要加载的图片资源ID号3.m_btn.SubclassDlgItem(IDC_CHANGYONG,this);//IDC_CHANGYONG为按钮的ID号4.m_btn.SizeToContent();//把按钮调整到和图片一样大最后记住把此按钮Owner draw属性设置为TRUE就OK了 实现方法:先建一个自定义类继承CButtoon类,重载一些消息和函数。1. 设置数据成员:private: BOOL m_bMouseMove;//鼠标是否在按钮上public: int m_nStyle;//有外部设置按钮为几态 Gdiplus::Image* m_pImage;//按钮图片 2. 设置成员函数// Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CXXXButton) public: virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);//重载自绘制 //}}AFX_VIRTUALprotected: //{{AFX_MSG(CXXXButton) afx_msg void OnMouseMove(UINT nFlags, CPoint point);//重载WM_MOUSEMOVE消息 afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam); //重载WM_MOUSELEAVE消息 //}}AFX_MSG DECLARE_MESSAGE_MAP()private: CSize GetImageBlockSize() const;//通过m_nStyle和图片的大小来得到每次需要得到的图片的长和宽 BOOL TrackMouseEventEx(HWND hWnd, DWORD flags = TME_LEAVE, DWORD hoverTime = HOVER_DEFAULT); // 追踪鼠标事件 3. 构造函数的实现CXXXButton::CXXXButton(){ m_bMouseMove = false;//默认设置鼠标不再按钮上}4. 消息的定义BEGIN_MESSAGE_MAP(CXXXButton, CButton) //{{AFX_MSG_MAP(CXXXButton) ON_WM_MOUSEMOVE() ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) //}}AFX_MSG_MAPEND_MESSAGE_MAP() 5. 个函数的实现void CXXXButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { UINT uStyle = DFCS_BUTTONPUSH; // This code only works with buttons. ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON); CRect imgRc; CRect txtRc = lpDrawItemStruct->rcItem; CRect dstRc = lpDrawItemStruct->rcItem; COLORREF textColor = RGB(77,77,77); CSize block = GetImageBlockSize(); if (lpDrawItemStruct->itemState & ODS_DISABLED) //按钮不可用状态 { textColor = RGB(77,77,77); imgRc = CRect(block.cx*(m_nStyle - 1), 0, block.cx*m_nStyle, block.cy); } else if (lpDrawItemStruct->itemState & ODS_SELECTED) //按钮按下状态 { textColor = RGB(77,77,77); //设置文字颜色 imgRc = CRect(block.cx,0,2*block.cx,block.cy);//设置按钮的图片在Load的图片上面的位置 } else { if(!m_bMouseMove) //鼠标不在按钮上面 { textColor = RGB(77,77,77); imgRc = CRect(0,0,block.cx,block.cy); } Else //鼠标在按钮上面 { textColor = RGB(255,255,255); imgRc = CRect(block.cx*2, 0, block.cx*3, block.cy); } } //Draw the Background CDC* dcMem = CDC::FromHandle(lpDrawItemStruct->hDC); Graphics grap(dcMem->GetSafeHdc()); grap.DrawImage(m_pImage, Rect(dstRc.top,dstRc.left,dstRc.Width(),dstRc.Height()), imgRc.left,imgRc.top,imgRc.Width(),imgRc.Height(),UnitPixel); // Get the button's text. CString strText; GetWindowText(strText); // Draw the button text using the text color red. SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT); COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, textColor); ::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(), &lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER); ::SetTextColor(lpDrawItemStruct->hDC, crOldColor);} void CXXXButton::SizeToContent(){ CRect rc; GetWindowRect(&rc); CSize block = GetImageBlockSize(); if(rc.Width() != block.cx || rc.Height() != block.cy) { SetWindowPos(NULL, -1, -1, block.cx, block.cy, SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW|SWP_NOACTIVATE); }} CSize CXXXButton::GetImageBlockSize() const{ CSize block; block.cy = m_pImage->GetHeight(); block.cx = m_pImage->GetWidth()/m_nStyle; return block;} void CXXXButton::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if(!m_bMouseMove) { TrackMouseEventEx(m_hWnd); m_bMouseMove = TRUE; Invalidate(); } CButton::OnMouseMove(nFlags, point);} BOOL CXXXButton::TrackMouseEventEx(HWND hWnd, DWORD flags, DWORD hoverTime){ TRACKMOUSEEVENT tme; tme.cbSize = sizeof(tme); tme.hwndTrack = hWnd; tme.dwFlags = flags; tme.dwHoverTime = hoverTime; return _TrackMouseEvent(&tme);} LRESULT CXXXButton::OnMouseLeave(WPARAM wParam, LPARAM lParam){ m_bMouseMove = FALSE; Invalidate(); return LRESULT(0);} 6. 应用通过MFC产生一个按钮,将按钮的属性改为Owner draw,在ClassWizard中为按钮关联一个CButton对象,如m_btnMyButton;在头文件里面将按钮的类型CButton改为我们自绘制按钮类,CXXXButton。再在实现文件的构造函数里面定义自绘制按钮的参数,设置如下:m_btnMyButton.m_nStyle = 3;m_btnClearList.m_pImage = LoadImage();//自定义按钮图片基本完成了。=====================================3楼已非常简单的说明了自绘按钮的步骤。还想实现鼠标经过点亮按钮,要重载CButton类,并重载鼠标消息和自绘函数。以上源码供参考。 CbitmapButton 貌似带鼠标经过功能的,我忘记了,加图的时候贴4张难道不可以? 难道是顺序错了? 查查cbitmapbutton看看如何使用我相信你可以实现的。 button 属性有没调节Owner draw MFC那个感觉效果并不怎么好,我倒是从WTL里移植那个过来比较好用,能实现你要的效果http://blog.csdn.net/hurryboylqs/archive/2010/08/28/5845684.aspx 本地excel与远程sql2000数据互导 vc6.0 comip.h 有玩AICODE或者ROBOCODE的兄弟吗? 关于线程问题,请大家进来帮帮忙! 请教VC的union里不能有struct的问题 如何向Autocad命令行发消息 请问高人在ado中与access建立连接后如何判断某个表在该数据库中是否存在 高分求救,快速结贴:请问谁有实现B+树,散列,位图等各种索引的c++源代码! “超级寻呼“软件中的串口问题,如能得到解决,高分相送并送上“超级寻呼“全部代码与资料 初级问题 求基于MFC单文档模式下的文件拖拽复制 哪位高人给个思路:如何实现屏幕录像功能?
2.m_btn.LoadBitmaps();//LoadBitmaps()4个参数是需要加载的图片资源ID号
3.m_btn.SubclassDlgItem(IDC_CHANGYONG,this);//IDC_CHANGYONG为按钮的ID号
4.m_btn.SizeToContent();//把按钮调整到和图片一样大
最后记住把此按钮Owner draw属性设置为TRUE就OK了
3楼已非常简单的说明了自绘按钮的步骤。
还想实现鼠标经过点亮按钮,要重载CButton类,并重载鼠标消息和自绘函数。以上源码供参考。
难道是顺序错了?
查查cbitmapbutton看看如何使用我相信你可以实现的。
比较好用,能实现你要的效果
http://blog.csdn.net/hurryboylqs/archive/2010/08/28/5845684.aspx