发信人: mendy.bbs@bbs.nju.edu.cn (孟迪), 信区: cnprogram
标  题: vc编程指南68篇(5) 
发信站: nju_bbs (Sun Apr 19 13:46:02 1998)
转信站: Lilac!ustcnews!nju_bbs

2m发信人:m TINA (终极宝物)
2m信  区:m RAD
2m标  题:m VC编程技巧68篇(5)
2m发信站:m '3m紫金飞鸿m' (Mon Apr  6 08:35:33 1998) , 5m站内信件m

[返回首页] [分类讨论区] [全部讨论区]

发信人: Zeemon (塞下秋), 信区: Visual 
标  题: vc编程指南68篇(5) 
发信站: BBS 水木清华站 (Thu Oct 23 12:40:34 1997) 

26、如何创建一个不规则形状的窗口  
     
   可以使用新的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 ; 
    } 
27、如何在代码中获取工具条和状态条的指针 

    缺省时, 工作框创建状态条和工具条时将它们作为主框窗口的子窗口,状态条 
有一个AFX_IDW_STATUS_BAR标识符,工具条有一个AFX_IDW_TOOLBAR标识符,下例说 
明了如何通过一起调用CWnd: : GetDescendantWindow和AfxGetMainWnd来获取这些 
子窗口的指针: 
//Get pointer to status bar . 
CStatusBar * pStatusBar = 
    (CStatusBar *) AfxGetMainWnd ( ) —> GetDescendantWindow  
(AFX_IDW_STUTUS_BAR); 

//Get pointer to toolbar . 
CToolBar * pToolBar = 
    (CToolBar * ) AfxGetMainWnd ( ) —> GetDescendantWindow 
(AFX_IDW_TOOLBAR); 
28、如何使能和禁止工具条的工具提示 

    如果设置了CBRS_TOOLTIPS风格位,工具条将显示工具提示,要使能或者禁止 
工具提示,需要设置或者清除该风格位。下例通过调用CControlBar : : GetBarStyle

和CControlBar : : SetBarStyle建立一个完成此功能的成员函数: 
void CMainFrame : : EnableToolTips ( BOOL bDisplayTips ) 

    ASSERT_VALID  (m_wndToolBar); 

    DWORD dwStyle = m _wndToolBar.GetBarStyle ( ) ; 

    if (bDisplayTips) 
         dwStyle |=CBRS_TOOLTIPS ; 
    else 
         dwStyle & = ~ CBRS_TOOLTIPS ; 

    m_wndToolBar.SetBarStyle  (dwStyle ); 

29、如何设置工具条标题 

    工具条是一个窗口,所以可以在调用CWnd : : SetWindowText来设置标题, 
例子如下: 
int CMainFrame : : OnCreate (LPCREATESTRUCT lpCreateStruct ) 


         … 
    // Set the caption of the toolbar . 
    m_wndToolBar.SetWindowText  (_T "Standdard"); 
30、如何创建和使用无模式对话框  

    MFC将模式和无模式对话封装在同一个类中,但是使用无模式对话需要几 
个对话需要几个额处的步骤。首先,使用资源编辑器建立对话资源并使用 
ClassWizard创建一个CDialog的派生类。模式和无模式对话的中止是不一样的: 
模式对话通过调用CDialog : : EndDialog 来中止,无模式对话则是调用  
CWnd: : DestroyWindow来中止的,函数CDialog : : OnOK和CDialog : : OnCancel 
调用EndDialog ,所以需要调用DestroyWindow并重置无模式对话的函数。 
void CSampleDialog : : OnOK ( ) 

    // Retrieve and validate dialog data . 
    if (! UpdateData (TRUE) ) 
    { 
        // the UpdateData rountine will set focus to correct item  
        TRACEO (" UpdateData failed during dialog termination .\n") ; 
        return ; 
    } 
     
    //Call DestroyWindow instead of EndDialog . 
    DestroyWindow ( ) ; 


void CSampleDialog : : OnCancel ( ) 

    //Call DestroyWindow instead of EndDialog . 
    DestroyWindow ( ) ; 

    其次,需要正确删除表示对话的C++对象。对于模式对来说,这很容易,需要创 
建函数返回后即可删除C++对象;无模式对话不是同步的,创建函数调用后立即返回,

因而用户不知道何时删除C++对象。撤销窗口时工作框调用CWnd : : PostNcDestroy,

可以重置该函数并执行清除操作,诸如删除this指针。 
void CSampleDialog : : PostNcDestroy ( ) 
  { 
    // Declete the C++ object that represents this dialog . 
    delete this ; 

    最后,要创建无模式对话。可以调用CDialog : : DoModal创建一个模式对放,  
要创建一个无模式对话则要调用CDialog: : Create。下面的例子说明 了应用程序 
是如何创建无模式对话的: 
void CMainFrame : : OnSampleDialog  ( ) 

    //Allocate a modeless dialog object . 
    CSampleDilog * pDialog =new CSampleDialog ; 
    ASSERT_VALID (pDialog) ; 
  
    //Create the modeless dialog . 
    BOOL bResult = pDialog —> Creste (IDD_IDALOG) ; 
    ASSERT (bResult ) ; 


-- 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: sapphire.ncic.a] 

                         [返回首页] [分类讨论区] [全部讨论区]

--
m;37m※ 来源:·紫金飞鸿 bbs.njupt.edu.cn·[FROM: pc05.info.njupt]m

--
※ 来源:.南大小百合信息交换站 bbs.nju.edu.cn.[FROM: a507yjh.nju.edu]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.487毫秒