钩子函数对按钮控件修改

上传人:第*** 文档编号:38806064 上传时间:2018-05-08 格式:DOC 页数:7 大小:686.50KB
返回 下载 相关 举报
钩子函数对按钮控件修改_第1页
第1页 / 共7页
钩子函数对按钮控件修改_第2页
第2页 / 共7页
钩子函数对按钮控件修改_第3页
第3页 / 共7页
钩子函数对按钮控件修改_第4页
第4页 / 共7页
钩子函数对按钮控件修改_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《钩子函数对按钮控件修改》由会员分享,可在线阅读,更多相关《钩子函数对按钮控件修改(7页珍藏版)》请在金锄头文库上搜索。

1、/首先创建一个按钮类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

2、= 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 *pOl

3、dBrush; /原画笔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_S

4、tyle=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.SetText

5、Color( 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

6、.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 ) /鼠标左键按下时处理

7、函数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,NU

8、LL,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消息retu

9、rn 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 ) /判断按

10、钮是否热点m_State = bsHot; /设置按钮状态InvalidateRect(hWnd,NULL,TRUE); /重绘窗口区域UpdateWindow(hWnd); /更新显示窗口SetCap tare(hWnd); /捕获鼠标elsem_State = bsNormal; /设置按钮状态InvalidateRect(hWnd,NULL,TRUE); /重绘按钮区域ReleaseCapture(); /释放鼠标DeleteObject( hRgn );return TRUE;/然后,定义一个新的定义按钮窗口函数,以取代按钮默认的窗口函数,对一些消息进行 特殊处理。代码如下:LRESU

11、LT _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);elser

12、eturn 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);br

13、eak;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 = HI

14、WORD(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

15、(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-hw

16、nd;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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 初中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号