VC自绘控件框架
这是一个按钮自绘的框架,其他控件也类似
//.h头文件#pragmaonce#include"afxwin.h"#include"MemDC.h"//封装内存DC类classCYuButton:publicCWnd{private:BOOLm_bIsDown;BOOLm_bIsMove;BOOL_bMouseTrack;CStringm_sCaption;CFont*m_pFont;INTm_nFocusPic;//焦点图片INTm_nForePic;//前景图片CMemoryDCm_Icon_MDC;CMemoryDCm_focus_MDC;CMemoryDCm_fore_MDC;CMemoryDCm_CompoundDC;//合成位图DCboolm_bTracking=TRUE;public:DECLARE_DYNCREATE(CYuButton)CYuButton(void);virtual~CYuButton(void);BOOLCreate(LPCTSTRstrCaption,constCRect&rt,CWnd*pParendWnd,UINTuId,UINTstrFocusPic,UINTstrForePic);afx_msgvoidOnNcPaint();afx_msgBOOLOnEraseBkgnd(CDC*pDC);afx_msgvoidOnPaint();afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);afx_msgvoidOnKillFocus(CWnd*pNewWnd);DECLARE_MESSAGE_MAP()//鼠标按下voidDrawDown(CDC*pDC);voidDrawNormal(CDC*pDC);//鼠标移动voidDrawMove(CDC*pDC);//字体voidSetFont(CFont*pFont);CFont*GetFont();//获取当前程序路径CStringGetApplicationPath();public://修改按钮状态voidSetNormalStatus();afx_msgvoidOnLButtonDblClk(UINTnFlags,CPointpoint);afx_msgvoidOnMouseHover(UINTnFlags,CPointpoint);afx_msgvoidOnMouseMove(UINTnFlags,CPointpoint);afx_msgvoidOnMouseLeave();afx_msgvoidOnSetFocus(CWnd*pOldWnd);afx_msgvoidOnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags);};
//.cpp文件#include"StdAfx.h"#include"YuButton.h"CYuButton::CYuButton(void){//WNDCLASSwd={CS_VREDRAW|CS_HREDRAW,::DefWindowProc};//wd.lpszClassName=_T("YUButton");////AfxRegisterClass(&wd);m_bIsDown=FALSE;m_bIsMove=FALSE;_bMouseTrack=TRUE;}CYuButton::~CYuButton(void){}BOOLCYuButton::Create(LPCTSTRstrCaption,constCRect&rt,CWnd*pParendWnd,UINTuId,UINTstrFocusPic,UINTstrForePic){LPCTSTRlpszClassName=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|WS_TABSTOP,AfxGetApp()->LoadStandardCursor(IDC_ARROW),(HBRUSH)GetStockObject(LTGRAY_BRUSH),NULL);m_sCaption=strCaption;m_nFocusPic=strFocusPic;m_nForePic=strForePic;BOOLre=m_Icon_MDC.LoadBitmap(m_nForePic);re=m_focus_MDC.LoadBitmap(m_nFocusPic);//画焦点图片85*110re=m_fore_MDC.LoadBitmap(m_nForePic);//显示图标m_CompoundDC.Create(m_focus_MDC.Width(),m_focus_MDC.Height());//空白内存位图m_pFont=pParendWnd->GetFont();returnCWnd::Create(lpszClassName,strCaption,WS_VISIBLE|WS_CHILD,rt,pParendWnd,uId);}BOOLCYuButton::CreateEx(DWORDdwExStyle,LPCTSTRsCaption,DWORDdwStyle,CONSTCRect&rt,CWnd*pParendWnd,UINTuId){m_sCaption=sCaption;returnCWnd::CreateEx(dwExStyle,_T("YUButton"),sCaption,dwStyle|WS_CHILD,rt,pParendWnd,uId);}IMPLEMENT_DYNCREATE(CYuButton,CWnd)BEGIN_MESSAGE_MAP(CYuButton,CWnd)ON_WM_ERASEBKGND()ON_WM_PAINT()ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_KILLFOCUS()ON_WM_LBUTTONDBLCLK()ON_WM_MOUSEHOVER()ON_WM_MOUSEMOVE()ON_WM_MOUSELEAVE()ON_WM_SETFOCUS()ON_WM_KEYDOWN()END_MESSAGE_MAP()voidCYuButton::OnNcPaint(){}BOOLCYuButton::OnEraseBkgnd(CDC*pDC){returntrue;//CWnd::OnEraseBkgnd(pDC);}voidCYuButton::OnPaint(){CPaintDCdc(this);//devicecontextforpaintingif(m_bIsDown)DrawNormal(&dc);elseDrawDown(&dc);//绘按钮上面的文字CRectrt;GetClientRect(&rt);rt.top=69;dc.SetTextColor(RGB(0,120,215));CFontfont;VERIFY(font.CreatePointFont(90,_T("微软雅黑"),&dc));CFont*pOldFont=dc.SelectObject(&font);dc.SetBkMode(TRANSPARENT);rt.top=40;dc.DrawText(m_sCaption,rt,DT_CENTER);dc.SelectObject(pOldFont);}voidCYuButton::OnLButtonDown(UINTnFlags,CPointpoint){//TODO:在此添加消息处理程序代码和/或调用默认值CWnd::OnLButtonDown(nFlags,point);m_bIsDown=TRUE;this->Invalidate(FALSE);SetFocus();//TRACE(_T("点击按钮!\n"));}voidCYuButton::OnLButtonUp(UINTnFlags,CPointpoint){CWnd::OnLButtonUp(nFlags,point);CWnd*pWnd=this->GetParent();if(pWnd)pWnd->SendMessage(WM_COMMAND,GetDlgCtrlID(),(LPARAM)this->GetSafeHwnd());}voidCYuButton::DrawNormal(CDC*pDC){//m_CompoundDC.BitBlt(0,0,m_focus_MDC.Width(),m_focus_MDC.Height(),//&m_focus_MDC,0,0,SRCCOPY);//m_fore_MDC.BitTrans(0,0,m_fore_MDC.Width(),m_fore_MDC.Height(),//&m_CompoundDC,0,0,RGB(135,200,241));//pDC->BitBlt(0,0,m_focus_MDC.Width(),m_focus_MDC.Height(),//&m_CompoundDC,0,0,SRCCOPY);pDC->BitBlt(0,0,m_Icon_MDC.Width(),m_Icon_MDC.Height(),&m_fore_MDC,0,0,SRCCOPY);}voidCYuButton::DrawDown(CDC*pDC){//画小图标//CBrushbr(RGB(221,203,255));//CBrush*pOldBrush=pDC->SelectObject(&br);//CRectrect(0,0,m_Icon_MDC.Width(),m_Icon_MDC.Height());//pDC->FillRect(&rect,&br);pDC->BitBlt(0,0,m_Icon_MDC.Width(),m_Icon_MDC.Height(),&m_focus_MDC,0,0,SRCCOPY);//pDC->SelectObject(pOldBrush);}voidCYuButton::SetFont(CFont*pFont){m_pFont=pFont;}CFont*CYuButton::GetFont(){returnm_pFont;}voidCYuButton::OnKillFocus(CWnd*pNewWnd){CWnd::OnKillFocus(pNewWnd);m_bIsDown=FALSE;Invalidate(TRUE);}CStringCYuButton::GetApplicationPath(){WCHARbuff[255]={0};::GetModuleFileName(0,buff,255);CStringstrAppFullName;strAppFullName.Format(_T("%s"),buff);CStringstrAppPath=_T("");strAppPath=strAppFullName.Left(strAppFullName.ReverseFind('\\')+1);returnstrAppPath;}voidCYuButton::SetNormalStatus(){m_bIsDown=FALSE;Invalidate(FALSE);}voidCYuButton::OnLButtonDblClk(UINTnFlags,CPointpoint){//TODO:在此添加消息处理程序代码和/或调用默认值//CWnd*pWnd=this->GetParent();//if(pWnd)//pWnd->SendMessage(WM_COMMAND,GetDlgCtrlID(),(LPARAM)this->GetSafeHwnd());CWnd::OnLButtonDblClk(nFlags,point);}voidCYuButton::OnMouseHover(UINTnFlags,CPointpoint){//TODO:在此添加消息处理程序代码和/或调用默认值m_bIsDown=TRUE;Invalidate();CWnd::OnMouseHover(nFlags,point);}voidCYuButton::OnMouseMove(UINTnFlags,CPointpoint){//TODO:在此添加消息处理程序代码和/或调用默认值TRACKMOUSEEVENTtme={0};tme.cbSize=sizeof(TRACKMOUSEEVENT);tme.dwFlags=TME_HOVER|TME_LEAVE;tme.dwHoverTime=50;tme.hwndTrack=this->m_hWnd;if(TrackMouseEvent(&tme)){}CWnd::OnMouseMove(nFlags,point);}voidCYuButton::OnMouseLeave(){//TODO:在此添加消息处理程序代码和/或调用默认值m_bIsDown=FALSE;Invalidate();CWnd::OnMouseLeave();}voidCYuButton::OnSetFocus(CWnd*pOldWnd){m_bIsDown=TRUE;Invalidate();CWnd::OnSetFocus(pOldWnd);//TODO:在此处添加消息处理程序代码}voidCYuButton::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags){//TODO:在此添加消息处理程序代码和/或调用默认值CWnd::OnKeyDown(nChar,nRepCnt,nFlags);}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。