1.4 公共模块设计(1)
为了使程序的界面更美观,在本系统中使用钩子函数对按钮控件进行了修改,首先创建一个按钮类CDrawButton类。CDrawButton类的代码如下:
- //定义按钮状态
- enum ButtonState {bsNormal,bsHot,bsDown};
- //按钮包装类
- class CDrawButton
- {
- public:
- 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( &Font );
//将画笔选入设备环境 - if( m_State == bsNormal)
//判断按钮状态 - {
-
- if (m_Style==2)
- {
- CBitmap bmp;
- bmp.LoadBitmap(IDB_BKBUTTON);
//加载图片资源 - Brush.CreatePatternBrush(&bmp);
//根据图片资源创建画笔 - }
- else
- Brush.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( &Brush );
//将画刷选入设备环境中 - pWnd->GetClientRect( &RC );
//获得客户区域 - dc.RoundRect( &RC, PT );
//绘制圆角矩形 -
- HRGN hRgn = CreateRectRgn( RC.left, RC.top,
RC.right, RC.bottom ); //创建一个矩形区域 - pWnd->SetWindowRgn( hRgn, TRUE );
//设置窗口区域 - DeleteObject( hRgn );
-
- pWnd->GetWindowText(Text );
//获得窗口显示文本 - dc.DrawText( Text, &RC, DT_CENTER | DT_VCENTER
| DT_SINGLELINE ); //绘制文本 -
- 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);
//捕获鼠标 - }
- }
- else
- {
- m_State = bsNormal;
- //设置按钮状态
- InvalidateRect(hWnd,NULL,TRUE);
//重绘按钮区域 - ReleaseCapture();
//释放鼠标 - }
- DeleteObject( hRgn );
- return TRUE;
- }
- };