设为首页 加入收藏

TOP

1.4 公共模块设计(1)
2013-10-07 13:26:41 来源: 作者: 【 】 浏览:66
Tags:1.4 公共 模块 设计

1.4  公共模块设计(1)

为了使程序的界面更美观,在本系统中使用钩子函数对按钮控件进行了修改,首先创建一个按钮类CDrawButton类。CDrawButton类的代码如下:

  1. //定义按钮状态  
  2. enum ButtonState  {bsNormal,bsHot,bsDown};  
  3. //按钮包装类  
  4. class CDrawButton    
  5. {  
  6. public:  
  7.     ButtonState  m_State;                         
    //按钮当前状态  
  8.     WNDPROC  m_OldProc;                            
    //记录按钮的窗口函数  
  9.     int          m_Flag;                            
    //是否释放关联按钮的CDrawButton对象  
  10.     static int     m_Style;                                 //按钮风格  
  11. public:  
  12.  
  13.     CDrawButton( )                                  //构造函数  
  14.     {  
  15.         m_State   = bsNormal;                           //设置按钮状态  
  16.         m_OldProc = NULL;                               //设置窗口函数  
  17.         m_Flag    = 0;                                  //设置按钮风格  
  18.     }  
  19.  
  20.     virtual ~CDrawButton()                              //析构函数  
  21.     {  
  22.         m_State   = bsNormal;                           //设置按钮状态  
  23.         m_OldProc = NULL;                               //设置窗口函数  
  24.     };  
  25.  
  26.     LRESULT OnPaint( HWND hWnd )                    
    //绘制窗口时处理函数  
  27.     {  
  28.         CWnd* pWnd = CWnd::FromHandle(hWnd);  
  29.         CPaintDC    dc(pWnd);  
  30.         CString     Text;                               //标题  
  31.         CRect       RC;                                 //区域  
  32.         CFont       Font;                               //字体  
  33.         CFont       *pOldFont;                          //原字体  
  34.         CBrush      Brush;                          //画笔  
  35.         CBrush      *pOldBrush;                         //原画笔  
  36.         CPoint      PT(2,2);         
  37.           
  38.        dc.SetBkMode( TRANSPARENT );             
    //设置透明  
  39.            Font.CreateFont( 12, 0, 0, 0, 
    FW_HEAVY, 0, 0, 0, ANSI_CHARSET, \  
  40.             OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, 
    DEFAULT_QUALITY, \  
  41.             VARIABLE_PITCH | FF_SWISS, "MS Sans Serif" );  
    //创建字体  
  42.         pOldFont = dc.SelectObject( &Font );         
    //将画笔选入设备环境  
  43.         if( m_State == bsNormal)                     
    //判断按钮状态  
  44.         {  
  45.               
  46.             if (m_Style==2)  
  47.             {  
  48.                 CBitmap bmp;  
  49.                 bmp.LoadBitmap(IDB_BKBUTTON);        
    //加载图片资源  
  50.                 Brush.CreatePatternBrush(&bmp);    
    //根据图片资源创建画笔  
  51.             }  
  52.             else  
  53.                 Brush.CreateSolidBrush( RGB( 200, 200, 200 ) );
    //用颜色创建画笔  
  54.             dc.SetTextColor( RGB( 80, 80, 80) );     
    //设置文本颜色  
  55.         }  
  56.         else if( m_State == bsDown )                   
    //判断按钮是否按下  
  57.         {  
  58.             Brush.CreateSolidBrush( RGB( 160, 160, 160 ) );  
    //用颜色创建画笔  
  59.             dc.SetTextColor( RGB( 50, 50, 250 ) );       
    //设置文本颜色  
  60.         }  
  61.         else if( m_State == bsHot )                       
    //判断按钮是否热点  
  62.         {  
  63.             Brush.CreateSolidBrush( RGB( 100, 100, 180 ) ); 
    //用颜色创建画笔  
  64.             dc.SetTextColor( RGB( 250, 250, 0 ) );      
    //设置文本颜色  
  65.         }  
  66.           
  67.         pOldBrush = dc.SelectObject( &Brush );          
    //将画刷选入设备环境中  
  68.         pWnd->GetClientRect( &RC );                   
    //获得客户区域  
  69.         dc.RoundRect( &RC, PT );                      
    //绘制圆角矩形  
  70.           
  71.         HRGN hRgn = CreateRectRgn( RC.left, RC.top, 
    RC.right, RC.bottom );          //创建一个矩形区域  
  72.         pWnd->SetWindowRgn( hRgn, TRUE );             
    //设置窗口区域  
  73.         DeleteObject( hRgn );  
  74.           
  75.         pWnd->GetWindowText(Text );                  
    //获得窗口显示文本  
  76.         dc.DrawText( Text, &RC, DT_CENTER | DT_VCENTER
    | DT_SINGLELINE );   //绘制文本  
  77.           
  78.         dc.SelectObject( pOldFont );  
  79.         dc.SelectObject( pOldBrush );  
  80.           
  81.         return TRUE;  
  82.     }  
  83.     LRESULT OnLButtonDown( HWND hWnd, UINT nFlags,
    CPoint point )       //鼠标左键按下时处理函数  
  84.     {  
  85.         m_State = bsDown;                          
    //设置按钮状态  
  86.         SetCapture(hWnd);                         
    //捕获鼠标  
  87.         SetFocus(hWnd);                           
    //设置焦点  
  88.            InvalidateRect(hWnd,NULL,TRUE);     
    //重绘窗口区域  
  89.         return TRUE;  
  90.     }  
  91.       
  92.     LRESULT OnLButtonUp( HWND hWnd, UINT nFlags, 
    CPoint point )     //鼠标左键抬起时处理函数  
  93.     {  
  94.         if( m_State != bsNormal )                
    //判断按钮状态  
  95.         {  
  96.             m_State = bsNormal;                       
    //设置按钮状态  
  97.             ReleaseCapture();                       
    //释放鼠标  
  98.             InvalidateRect(hWnd,NULL,TRUE);        
    //重绘窗口区域  
  99.             //发送WM_COMMAND消息  
  100.                SendMessage( GetParent(hWnd),
    WM_COMMAND, GetDlgCtrlID(hWnd), (LPARAM) (hWnd) );  
  101.         }  
  102.         return TRUE;  
  103.     }  
  104.  
  105.     LRESULT LoseFocus(HWND  hWnd)                    
    //失去焦点时处理函数  
  106.     {  
  107.         m_State = bsNormal;                             
    //设置按钮状态  
  108.         InvalidateRect(hWnd,NULL,TRUE);                   
    //重绘窗口区域  
  109.         SendMessage( hWnd, WM_KILLFOCUS, (long)hWnd, 0);  
    //发送WM_KILLFOCUS消息  
  110.         return TRUE;  
  111.     }  
  112.  
  113.     LRESULT OnMouseMove(HWND hWnd, UINT nFlags, CPoint point ) 
    //鼠标移动时处理函数  
  114.     {  
  115.         HRGN hRgn = CreateRectRgn( 0, 0, 0, 0 );         
    //创建矩形区域  
  116.         GetWindowRgn( hWnd,hRgn );                          
    //获得窗口区域  
  117.         BOOL ret = PtInRegion( hRgn, point.x, point.y );  
    //判断鼠标是否在窗口区域中  
  118.         if( ret )   
  119.         {  
  120.             if( m_State == bsDown)                   
    //判断按钮是否按下  
  121.                 return TRUE;  
  122.             if( m_State != bsHot )                   
    //判断按钮是否热点  
  123.             {  
  124.                 m_State = bsHot;                     
    //设置按钮状态  
  125.                 InvalidateRect(hWnd,NULL,TRUE);       
    //重绘窗口区域  
  126.                 UpdateWindow(hWnd);             
    //更新显示窗口  
  127.                 SetCap tare(hWnd);                
    //捕获鼠标  
  128.             }  
  129.         }   
  130.         else   
  131.         {  
  132.             m_State = bsNormal;                 
  133.                     //设置按钮状态  
  134.             InvalidateRect(hWnd,NULL,TRUE);     
    //重绘按钮区域  
  135.             ReleaseCapture();                   
    //释放鼠标  
  136.         }     
  137.         DeleteObject( hRgn );  
  138.         return TRUE;  
  139.     }  
  140. };  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.4 公共模块设计(2) 下一篇1.4.3 Visual C++ 6.0编程操作介..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: