⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vc编程指南68篇(5).txt

📁 VC编程指南68篇
💻 TXT
字号:
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) /nEllipsee ) ) ); 
  
    //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 ) ; 
} 
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -