标  题: 如何创建一个不规则形状的窗口                     
发信人: Pacific (无情~~~Nolove), 信区: VisualC
发信站: BBS 水木清华站 (Fri Oct 16 17:08:20 1998)


   可以使用新的SDK函数SetWindowRgn。该函数将绘画和鼠标消息限定在窗口的一         
个指定的区域,实际上使窗口成为指定的不规则形状。                                 
    使用AppWizard创建一个基于对的应用程序并使用资源编辑器从主对话资源中删        
除所在的缺省控件、标题以及边界。                                                 
    给对话类增加一个CRgn数据成员,以后要使用该数据成员建立窗口区域。             
Class CRoundDlg : public CDialog                                                 
{                                                                                
    …                                                                           
private :                                                                        
    Crgn m_rgn : // window region                                                
    …                                                                           
} ;                                                                              
    修改OnInitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分配给         
窗口:                                                                           
BOOL CRoundDlg : : OnInitDialog ( )                                              
{                                                                                
    CDialog : : OnInitDialog ( ) ;                                               
                                                                                 
    //Get size of dialog .                                                       
    CRect rcDialog ;                                                             
    GetClientRect (rcDialog );                                                   
                                                                                 
    // Create region and assign to window .                                      
    m_rgn . CreateEllipticRgn  (0 , 0 , rcDialog.Width ( ) , rcDialog            
.Height ( ) );                                                                   
    SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn , TRUE );                      
                                                                                 
    return TRUE ;                                                                
}                                                                                
    通过建立区域和调用SetWindowRgn,已经建立一个不规则形状的窗口,下面的例       
子程序是修改OnPaint函数使窗口形状看起来象一个球形体。                            
voik CRoundDlg : : OnPaint ( )                                                   
{                                                                                
    CPaintDC de (this) ; // device context for painting .                        
    //draw ellipse with out any border                                           
    dc. SelecStockObject (NULL_PEN);                                             
                                                                                 
    //get the RGB colour components of the sphere color                          
    COLORREF color= RGB( 0 , 0 , 255);                                           
    BYTE byRed =GetRValue (color);                                               
    BYTE byGreen = GetGValue (color);                                            
    BYTE byBlue = GetBValue (color);                                             
                                                                                 
    // get the size of the view window                                           
    Crect rect ;                                                                 
    GetClientRect  (rect);                                                       
                                                                                 
    // get minimun number of units                                               
    int nUnits =min (rect.right , rect.bottom );                                 
                                                                                 
    //calculate he horiaontal and vertical step size                             
    float fltStepHorz = (float) rect.right /nUnits ;                             
    float fltStepVert = (float) rect.bottom /nUnits ;                            
                                                                                 
    int nEllipse = nUnits/3; // calculate how many to draw                       
    int nIndex ;             // current ellipse that is being draw               
                                                                                 
    CBrush brush ;       // bursh used for ellipse fill color                    
    CBrush *pBrushOld;     // previous brush that was selected into dc           
                                                                                 
    //draw ellipse , gradually moving towards upper-right corner                 
    for (nIndex = 0 ; nIndes < + nEllipse ; nIndes ++)                           
{                                                                                
    //creat solid brush                                                          
    brush . CreatSolidBrush   (RGB ( ( (nIndex *byRed ) /nEllipse ).             
               ( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue)           
/nEllipse ) ) );                                                                 
                                                                                 
    //select brush into dc                                                       
    pBrushOld= dc .SelectObject (&brhsh);                                        
                                                                                 
    //draw ellipse                                                               
    dc .Ellipse (  (int) fltStepHorz * 2, (int) fltStepVert * nIndex ,           
         rect. right -( (int) fltStepHorz * nIndex )+ 1,                         
         rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1) ;                
                                                                                 
    //delete the brush                                                           
    brush.DelecteObject ( );                                                     
    }                                                                            
    }                                                                            
                                                                                 
    最后,处理WM_NCHITTEST消息,使当击打窗口的任何位置时能移动窗口。             
UINT CRoundDlg : : OnNchitTest (Cpoint point )                                   
{                                                                                
    //Let user move window by clickign anywhere on the window .                  
    UINT nHitTest = CDialog : : OnNcHitTest (point) ;                            
    rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest ;                        
    }                                                                            

--
        老鸟有交待,中鸟要等待,菜鸟要忍耐。
        老鸟级功夫:吹牛、聊天、玩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:02 修改本文.[FROM: heart.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:211.109毫秒