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;
- }
- };