标  题: 如何实现一个橡皮区矩形                           
发信人: Pacific (无情~~~Nolove), 信区: VisualC
发信站: BBS 水木清华站 (Fri Oct 16 17:20:08 1998)


    CRectTracker是一个很有用的类,可以通过调用CRectTracker::                     
TrackRubberBand                                                                  
响应WM_LBUTTONDOWN消息来创建一个橡皮区矩形。下例表明使用CRectTracker移动         
和重置视窗中的蓝色椭圆的大小是很容易的事情。                                     
    首先,在文件档中声明一个CRectTracker数据成员:                               
class CSampleView : Public CView                                                 
{                                                                                
                                                                                 
    …                                                                           
                                                                                 
    public :                                                                     
         CrectTracker m_tracker;                                                 
                                                                                 
    …                                                                           
};                                                                               
    其次,在文档类的构造函数中初始化CRectTracker 对象:                          
CSampleDoc:: CSampleDOC ()                                                       
{                                                                                
     //Initialize tracker position, size and style.                              
     m_tracker.m_rect.SetRect (0, 0, 10, 10);                                    
     m_tracker.m_nStyle=CRectTracker:: resizeInside  |                           
           CRectTracker:: dottedLine;                                            
}                                                                                
    然后,在OnDraw函数中画椭圆和踪迹矩形:                                       
void CSampleView:: OnDraw (CDC* pDC)                                             
{                                                                                
     CSampleDoc* pDoc=GetDocument ();                                            
     ASSERT_VALID (pDoc);                                                        
                                                                                 
     //Select blue brush into device context.                                    
     CBrush brush (RGB (0, 0, 255));                                             
     CBrush* pOldBrush=pDC->SelectObject (&brush);                               
                                                                                 
     //draw ellipse in tracking rectangle.                                       
     Crect rcEllipse;                                                            
     pDoc->m_tracker.GetTrueRect (rcEllipse);                                    
     pDC->Ellipse (rcEllipse);                                                   
                                                                                 
     //Draw tracking rectangle.                                                  
     pDoc->m_tracker.Draw (pDC);                                                 
     //Select blue brush out of device context.                                  
     pDC->Selectobject (pOldBrush);                                              
}                                                                                
    最后,使用ClassWizard处理WM_LBUTTONDOWN消息,并增加下述代码。该段代码        
根据鼠标击键情况可以拖放、移动或者重置椭圆的大小。                               
void CSampleView::OnLButtonDown (UINT nFlags, CPoint point)                      
{                                                                                
     //Get pointer to document.                                                  
     CSampleDoc* pDoc=GetDocument ();                                            
     ASSERT_VALID (pDoc);                                                        
                                                                                 
     //If clicked on ellipse, drag or resize it. Otherwise create a              
     //rubber-band rectangle nd create a new ellipse.                            
     BOOL bResult=pDoc->m_tracker.HitTest (point)!=                              
         CRectTracker::hitNothing;                                               
                                                                                 
     //Tracker rectangle changed so update views.                                
     if (bResult)                                                                
     {                                                                           
        pDoc->m_tracker.Track (this,point,TRue);                                 
        pDoc->SetModifiedFlag ();                                                
        pDoc->UpdateAllViews (NULL);                                             
     }                                                                           
                                                                                 
     else                                                                        
        pDoc->m-tracker.TrackRubberBand (this,point,TRUE);                       
     CView:: onLButtonDown (nFlags,point);                                       
}                                                                                
    
--
        老鸟有交待,中鸟要等待,菜鸟要忍耐。
        老鸟级功夫:吹牛、聊天、玩MUD 、发呆。
        中鸟级功夫:睡觉、灌水、玩游戏、NT&VC。
        菜鸟级功夫:学习、泡妞、玩篮球、And so on

        My E-Mail: Nolove@263.net

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: yazhou.bbs@bbs.net.t]
※ 修改:.fzx 于 Aug  9 16:51:17 修改本文.[FROM: heart.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:198.515毫秒