资源预览内容
第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
亲,该文档总共7页全部预览完了,如果喜欢就下载吧!
资源描述
/首先创建一个按钮类CDrawButton 类。CDrawButton 类的代码如下:/定义按钮状态enum ButtonState bsNormal,bsHot,bsDown;/按钮包装类class CDrawButtonpublic:ButtonState m_State; /按钮当前状态WNDPROC m_OldProc; /记录按钮的窗口函数int m_Flag; /是否释放关联按钮的CDrawButton对象static int m_Style; /按钮风格public:CDrawButton( ) /构造函数m_State = bsNormal; /设置按钮状态m_OldProc = NULL; /设置窗口函数m_Flag = 0; /设置按钮风格virtual CDrawButton() /析构函数m_State = bsNormal; /设置按钮状态m_OldProc = NULL; /设置窗口函数;LRESULT OnPaint( HWND hWnd ) /绘制窗口时处理函数CWnd* pWnd = CWnd:FromHandle(hWnd);CPaintDC dc(pWnd);CString Text; /标题CRect RC; /区域CFont Font; /字体CFont *pOldFont; /原字体CBrush Brush; /画笔CBrush *pOldBrush; /原画笔CPoint PT(2,2); dc.SetBkMode( TRANSPARENT ); /设置透明 Font.CreateFont( 12, 0, 0, 0, FW_HEAVY, 0, 0, 0, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, “MS Sans Serif“ );pOldFont = dc.SelectObject( /将画笔选入设备环境if( m_State = bsNormal) /判断按钮状态if (m_Style=2)CBitmap bmp;bmp.LoadBitmap(IDB_BKBUTTON); /加载图片资源Brush.CreatePatternBrush( /根据图片资源创建画笔elseBrush.CreateSolidBrush( RGB( 200, 200, 200 ) ); /用颜色创建画笔dc.SetTextColor( RGB( 80, 80, 80) ); /设置文本颜色else if( m_State = bsDown ) /判断按钮是否按下Brush.CreateSolidBrush( RGB( 160, 160, 160 ) ); /用颜色创建画笔dc.SetTextColor( RGB( 50, 50, 250 ) ); /设置文本颜色else if( m_State = bsHot ) /判断按钮是否热点Brush.CreateSolidBrush( RGB( 100, 100, 180 ) ); /用颜色创建画笔dc.SetTextColor( RGB( 250, 250, 0 ) ); /设置文本颜色pOldBrush = dc.SelectObject( /将画刷选入设备环境中pWnd-GetClientRect( /获得客户区域dc.RoundRect( /绘制圆角矩形HRGN hRgn = CreateRectRgn( RC.left, RC.top, RC.right, RC.bottom ); /创建一个矩形区域pWnd-SetWindowRgn( hRgn, TRUE ); /设置窗口区域DeleteObject( hRgn );pWnd-GetWindowText(Text ); /获得窗口显示文本dc.DrawText( Text, /绘制文本dc.SelectObject( pOldFont );dc.SelectObject( pOldBrush );return TRUE;LRESULT OnLButtonDown( HWND hWnd, UINT nFlags, CPoint point ) /鼠标左键按下时处理函数m_State = bsDown; /设置按钮状态SetCapture(hWnd); /捕获鼠标SetFocus(hWnd); /设置焦点 InvalidateRect(hWnd,NULL,TRUE); /重绘窗口区域return TRUE;LRESULT OnLButtonUp( HWND hWnd, UINT nFlags, CPoint point ) /鼠标左键抬起时处理函数if( m_State != bsNormal ) /判断按钮状态m_State = bsNormal; /设置按钮状态ReleaseCapture(); /释放鼠标InvalidateRect(hWnd,NULL,TRUE); /重绘窗口区域/发送WM_COMMAND消息 SendMessage( GetParent(hWnd), WM_COMMAND, GetDlgCtrlID(hWnd), (LPARAM) (hWnd) );return TRUE;LRESULT LoseFocus(HWND hWnd) /失去焦点时处理函数m_State = bsNormal; /设置按钮状态InvalidateRect(hWnd,NULL,TRUE); /重绘窗口区域SendMessage( hWnd, WM_KILLFOCUS, (long)hWnd, 0); /发送WM_KILLFOCUS消息return TRUE;LRESULT OnMouseMove(HWND hWnd, UINT nFlags, CPoint point ) /鼠标移动时处理函数HRGN hRgn = CreateRectRgn( 0, 0, 0, 0 ); /创建矩形区域GetWindowRgn( hWnd,hRgn ); /获得窗口区域BOOL ret = PtInRegion( hRgn, point.x, point.y ); /判断鼠标是否在窗口区域中if( ret )if( m_State = bsDown) /判断按钮是否按下return TRUE;if( m_State != bsHot ) /判断按钮是否热点m_State = bsHot; /设置按钮状态InvalidateRect(hWnd,NULL,TRUE); /重绘窗口区域UpdateWindow(hWnd); /更新显示窗口SetCap tare(hWnd); /捕获鼠标elsem_State = bsNormal; /设置按钮状态InvalidateRect(hWnd,NULL,TRUE); /重绘按钮区域ReleaseCapture(); /释放鼠标DeleteObject( hRgn );return TRUE;/然后,定义一个新的定义按钮窗口函数,以取代按钮默认的窗口函数,对一些消息进行 特殊处理。代码如下:LRESULT _stdcall DefWindowProc1(HWND hWnd,UINT Msg,WPARAM wParam, LPARAM lParam )CPoint pt;CDrawButton *pButton=(CDrawButton*)GetWindowLong(hWnd,GWL_USERDATA); /获得窗口信息switch (Msg)case WM_LBUTTONDBLCLK: /屏蔽双击事件return TRUE;break;case WM_PAINT: /绘制窗口事件if (pButton-m_Style0)return pButton-OnPaint( hWnd);elsereturn CallWindowProc(pButton-m_OldProc, hWnd,Msg,wParam,lParam);break;case WM_LBUTTONDOWN: /鼠标左键按下事件pt.x = LOWORD(lParam); /鼠标按下的横坐标pt.y = HIWORD(lParam); /鼠标按下的纵坐标if (pButton-m_Style0)return pButton-OnLButtonDown( hWnd, 0, pt );elsereturn CallWindowProc(pButton-m_OldProc, hWnd,Msg,wParam,lParam);break;case WM_LBUTTONUP: /鼠标左键抬起事件pt.x = LOWORD(lParam); /鼠标按下的横坐标pt.y = HIWORD(lParam); /鼠标按下的纵坐标if (pButton-m_Style0)return pButton-OnLButtonUp( hWnd, 0,pt );elsereturn CallWindowProc(pButton-m_OldProc, hWnd,Msg,wParam,lParam);break;case WM_MOUSEMOVE: /鼠标移动事件pt.x = LOWORD(lParam); /鼠标按下的横坐标pt.y = HIWORD(lParam); /鼠标按下的纵坐标if (pButton-m_Style0)return pButton-OnMouseMove(hWnd,0, pt);elsereturn CallWindowProc(pButton-m_OldProc, hWnd,Msg,wParam,lParam);break;case WM_DESTROY: /销毁窗口WNDPROC procOld=pButton-m_OldProc;SetWindowLong(hWnd,GWL_WNDPROC,(long)procOld); /恢复原来的窗口函数CWnd* pWnd = :CWnd:FromHandle(hWnd); /将按钮对象与控制块分离if (pWnd)pWnd-Detach();pButton-m_Flag = 1;return 1;default :break;return CallWindowProc(pButton-m_OldProc, hWnd, Msg, wParam, lParam );定义钩子函数,对按钮类控件进行子类化。代码如下:LRESULT CALLBACK HOOKProc( int nCode, WPARAM wParam, LPARAM lParam )PCWPSTRUCT wc = (PCWPSTRUCT) lParam;HWND hWnd = wc-hwnd;if( hWnd )char ClassNameMAX_PATH = “;GetClassName( hWnd, ClassName, MAX_PATH ); /去掉窗口类名if( strcmp( ClassName, “Button“ ) = 0 )CWnd *pWnd = CWnd:FromHandle( hWnd );if ( pWnd-GetStyle() if ( pWnd-GetStyle() WNDPROC WndProc;WndProc = (WNDPROC) GetWindowLong( hWnd, GWL_WNDPROC );CDrawButton *pButton=(C
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号